Isn't there some way that to enable Windows games to run on Ubuntu? Surely the game delelopers can do it?
When there isn't a native Linux version, use
wine. There's also cedega, but it's not free.
Most modern games' 3D graphics are written using the Direct3D graphics library. Direct3D (DirectX) was developed by Microsoft and thus cannot be used under Linux.
It represents far too much extra effort for programmers to create an OpenGL (the non-MS graphics library) engine for a game, for the very few people who want to play their games under Linux.
Some games do use OpenGL, because MacOS has no DirectX either. Warcraft 3 and WoW both have support for it, you give them the -opengl switch on the command line.
wine has very good DirectX 9 emulation nowdays, it even recompiles Direct3D pixel shaders into OpenGL equivalents. While wine probably won't play the latest games, it does play many games from a year or more back perfectly. Check wine's
application database for the games you're interested in.
The current 0.9.x wine series is made of pure GIT snapshots (no testing), so things break a lot. If you do run wine, you should always be running the latest version: compile it from source, if not from a GIT checkout. Please report any bugs you find, and if something doesn't work, try the next version.
what does linux do that windows does not?
A lot. Taking networking as an example:
Try get any Windows 95, 98, Me, 2000, or XP box to do IP routing, it's undocumented and unsupported and involves using the registry. On Linux, you write a 1 into /proc/sys/ipv4/ip_forward, eg. "echo 1 > /proc/sys/ipv4/ip_forward", and some distro's even configure this graphically.
Can you set up ethernet bridging in Windows? AFAIK it only works in XP. There's a utility to do it somewhere on the internet that took me an hour to find, and half an hour to install (had to edit the registry and create a service...). On Linux, it's nothing like this extraordinary amount of effort.
On Windows, the select() API is limited to 64 sockets, while on Linux it's 1024 (and if you use poll(), there's no limit). There's a way to increase the limit, but Windows's select() can't handle sockets from different providers, so Microsoft recommends using WSAAsyncSelect() instead to get an event. But events have to be polled using WaitForMultipleObjects(), which is again limited to 64 events.
Windows may be more popular and user-friendly (where Microsoft chose to make it so), but Linux is light years ahead in terms of technology. Ever wonder why wireless access points never use Windows?