Buenas! Se que esto parece un flamewar, pero no lo es. Hace mes y pico que estoy portando mi motor a windows+directx..
pase de programar casi todo el tiempo en unix con opengl, a windows con direct3D. Ya que muchos que estan de un lado se preguntan como se siente estar el otro, voy a hacer una breve comparacion de mis experiencias en varios aspectos:
Herramientas:En windows, todo lo provee Visual Studio. Practicamente no hay integracion con otras herramientas, excepto tal vez herramientas pagas como profilers. El compilador es muy rapido (muchisimo mas que gcc) y por ahora no se queja de nada que haya hecho, aun usando templates bastante complicados. Respecto a los errores que muestra, diria que en algunos casos es mejor que gcc, y en otros es peor.
El debugger incluido del visual studio esta bien supongo, aunque viniendo de usar gdb en linea de comando siento que tardo mucho en hacer todo (click aca, click alla..). No traceo programas y en general me basta con ver un backtrace y alguna variable que otra en el stackframe correspondiente.. y pongo un breakpoint una vez cada 4 meses, asi que tal vez no soy la persona mas indicada para comparar debuggers.
La IDE (visual studio) me parecio bastante pobre comparada con otras IDEs abiertas y gratuitas, incluso para windows, como netbeans o qt-creator.. asi que termine usando qt-creator.. el problema es que windows no soporta sobreescribir un archivo mientras esta corriendo (unix no tiene problema con eso, ya que mantiene un refcount en el inodo), asi que me tengo que acordar de cerrar el programa o el debugger cada vez que compilo.. medio hinchahuevos (visual studio se ve que lo cierra por uno).
No hay valgrind en windows.. y por mucho que bardeen valgrind porque es lento, o me recomienden otros profilers como el de intel o el de AMD... los datos que da valgrind respecto a memoria, bound checking, punteros, uso de cache, call graphs, profiling son lo mas completo y organizado que vi hasta ahora.
No hay binutils en windows, asi que no tengo demasiado control sobre el binario que genera el compilador.. no puedo ver que funciones son las que mas codigo generan, ni hacer stripping de simbolos, ni esas cosas.
Unix tiene ademas muchas otras cosas muy utiles, como ver los decriptores que usa el archivo, strace y ltrace (en caso que tu programa muera en una syscall o libcall con stack corrupto), restriccion de runtime (sacarle procesador o limitar la memoria de tu proceso para ver como se las arregla), etc.
linux te permite ver el codigo fuente de todas sus librerias.. lo que definitivamente ayuda cuando algo que uno juraria que deberia funcionar no funciona.. auque supongo que no entra en la categoria de herramientas.
Conclusion: Windows es un entorno mas cerrado, donde todo esta a disposicion del programador. Supongo que para quien se siente como en una sola aplicacion, es perfecto, pero para quien quiere tomar ventaja de la enorme cantidad de herramientas (y combinaciones entre ellas), unix es lo mas completo.
Documentacion:Toda la documentacion de windows esta en MSDN de forma centralizada y unificada. Uno pensaria (a diferencia de unix, donde la documentacion de cada componente esta en su respectiva pagina) que definitivamente es algo muy productivo y se ahorra tiempo. Tambien es posible descargar manuales individuales un formato chm.
Ahora.. siendo serio y honesto. MSDN es un desastre. Los overviews de cada area o libreria son cortos y poco explicativos, los ejemplos casi no existen y las referencias por indice de funciones e interfaces son apenas descriptivas. A esto lo empeora que la mayoria de las funciones de windows son choclos enormes llenos de parametros que no estas muy seguro si son opcionales o no o para que sirven.
No voy a criticar el coding style hungaro en si porque me imagino que para quien lo usa es parte de saber C o C++. nomas me voy a limitar a opinar que creo que es bastante al pedo usarlo

MSDN tiene BING integrado gigante y enorme arriba de todo. Esto permite buscar rapido cualquier cosa en toda la referencia de windows.. lo cual si funcionara seria barbaro. En incontables ocasiones, BING no puede encontrar funciones, enumeraciones de interfaces estandares de directx, o me manda a las versiones de la implementacion de driver, no la libreria! Por suerte, escribir la misma busqueda en google (sin siquiera especificar msdn) siempre funciona

Otra alternativa es bajar los chm.. aunque no tengo tabs..
Sobre unix no tengo mucho que decir.. generalmente las librerias se entienden bastante mas, salvo por X11 que es una pesadilla.
Otro tema es que en general, las apis abiertas y unix tienen una comunidad enorme. Esta lleno de foros y canales de irc con gente dispuesta a ayudar. Hasta ahora no encontre casi nada de directx con tanto nivel de comunidad, y eso que me esforce bastante (si conocen algo, especialmente irc, avisenme).
Conclusion: Probablemente la peor parte de trabajar en windows es el mal disenio de apis (confusas), la poca documentacion, y el poco nucleamiento de la comunidad de quienes lo desarrollan. Tal vez para alquien que solo trabajo en windows suena raro, pero abran cualquier manual page y va a tener mas texto que la funcion similar en msdn. Tampoco existe nada al estilo freenode #opengl, #x11, #alsa, #etc (irc) sobre desarrollo para windows.
DirectX vs OpenGL:Para alguien que viene de OpenGL, DirectX (en mi caso directx9) no es tan terrible.. algunas cosas son mas divertidas que molestas. Podria hasta decir que microsoft no solo intento crear una alternativa a opengl sino un archienemigo, o un nemesis. Esto se evidencia por un monton de "opciones" que microsoft tomo para "diferenciarse" de directx.
- Left Handed vs Right handed para el sistema de coordenadas
- 0,0 arriba a la izquierda vs 0,0 abajo a la izquierda para blitear a las texturas o el framebuffer
- Column Major vs Row Major para las matrices
- ARGB en vez de RGBA para los colores, texturas, etc
- esquina en vez de centro para mapear uv/coordenadas a pixeles
A veces en directx las cosas medio se mezclan y es raro, pero nada terrible. Bueno, de cualquier forma.. comparar las dos apis es dificil, porque verdaderamente cada una tiene desventajas y ventajas, pero escribo lo que hasta ahora me encontre:
Primero a todo, performance. Por como esta hecho directx, uno pensaria que definitivamente deberia ser la api mas rapida, pero hasta ahora en mi experiencia, fue todo lo contrario. Habiendo probado el mismo codigo en placas de todo tipo y color, los shaders se ejecutan notablemente mas rapido en GL. En placas SM3.0 (radeon X1xxx o geforce 6x,7x) la diferencia es casi abismal si se usan condicionales (if/for/switch) mientras que en GL parece no importar.. lo mismo si se samplea muchas veces una textura. Hice todo lo posible por llevar el codigo de directx al nivel del de opengl, pero no tuve mucho exito. De hecho, entendi porque muchos motores de hoy en dia usan multipass en vez de singlepass.
En lo que es api en si, es mas o menos lo mismo. OpenGl tiene algunas cositas mas y la API es mas prolija. DirectX esta pensado para exponer el hardware de la generacion actual en si mas que en hacer una api abstracta, lo cual justifica que lo reescriban en cada version y hace implementar algunas cosas mas obvias. Se podria decir que tiene sus ventajas y desventajas. DirectX tiene muy bien definido que funciona y que no funciona en cada version, lo cual ayuda a escribir codigo muy comptible con todo el hardware existente. En ese sentido OpenGL es mas problematico, ya que la unica forma de fijarse si algo va a funcionar es leyendo el string de la placa de video, y para peor.. como el compilador de GLSL depende del driver, es muy dificil escribir un shader para otra placa de video que la que uno tiene. La unica excepcion que encontre es Vertex Texture Fetch que no funciona en placas ATI (x1000+)
El shader assembler de DirectX es en un sentido un desproposito y me rehuso a aprenderlo (y la verdad que cuesta entender varias cosas de la documentacion sin saber mas o menos de que se trata) ya que de cualquier forma el driver tiene que descompilaro y recompilarlo y reoptimizarlo para el verdadero assembler que sporta la placa de video.. pero como dije antes, sirve por el tema de compatibilidad entre placas. Directx9 tiene la gran desventaja que compilar un shader es lento, muy lento y aloca bastante memoria (comparado con opengl, donde es praticamente instantaneo), ya que hace mas dificil hacer no solo conditional compilation sino generacion de shaders con shader graphs.
Conclusion: Es mas o menos lo mismo... aunque muchas veces la mala documentacion de DirectX en algunos lugares hace que me quiera arrancar los pelos.
Bueno.. eso por ahora! sientanse libres de compartir experiencias sin flamewaring please
