Asociación de Desarrolladores de Videojuegos Argentina
Julio 30, 2010, 01:38:20 *
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: ADVA tiene nuevo foro!
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2
  Imprimir  
Autor Tema: Experiencia de un programador de unix trabjando en windows.  (Leído 1556 veces)
reduzio
Colaborador
Usuario
*****
Desconectado Desconectado

Mensajes: 326



Ver Perfil
« en: Septiembre 20, 2009, 06:25:52 »

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 Sonrisa

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 Sonrisa
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 Triste
« Última modificación: Septiembre 20, 2009, 06:31:07 por reduzio » En línea
shadow_of__soul
Moderador Global
Usuario
*****
Desconectado Desconectado

Mensajes: 963



Ver Perfil
« Respuesta #1 en: Septiembre 20, 2009, 07:13:23 »

Hi,

no tengo expeiencia con ninguna de las apis, pero te agradezco el compartir tus opiniones en este detallsisimo post, seguramente les va a servir a muchos Cheesy Cheesy

Regards,
Shadow.
En línea

Yotes
Usuario
*
Desconectado Desconectado

Mensajes: 96


Ver Perfil
« Respuesta #2 en: Septiembre 20, 2009, 07:32:39 »

Hi,

no tengo expeiencia con ninguna de las apis, pero te agradezco el compartir tus opiniones en este detallsisimo post, seguramente les va a servir a muchos Cheesy Cheesy

Regards,
Shadow.


Idem!
En línea
ASHPD
Usuario
*
Desconectado Desconectado

Mensajes: 325



Ver Perfil WWW
« Respuesta #3 en: Septiembre 20, 2009, 09:17:28 »

Aguante Glide!!

(chistin)
En línea

Yo era un Newbie que andaba sooolo, en una ciudad pesaaada....
hasta que un dia... encontré una Newbie.. y quiso que la acompañaaaaraa...
puelo
Usuario
*
Desconectado Desconectado

Mensajes: 314



Ver Perfil
« Respuesta #4 en: Septiembre 21, 2009, 05:14:48 »

muy interesante =)
En línea

Sergio J. de los Santos
Usuario
*
Desconectado Desconectado

Mensajes: 444


Ver Perfil
« Respuesta #5 en: Septiembre 21, 2009, 06:47:46 »


  • 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


El tema Left/Right Handed... en realidad D3D es agnostico en ese aspecto. En cualquier caso la documentacion o ejemplos usan LH, pero el API de extensiones soporta ambos (claramente identificados con LH/RH al final). Si usas tus propias matrices no deberias tener problemas. En cualquier caso el unico problema es que en Clip Space, Z tiene el rango 0..1 y 1 es far.

En cuanto a las matrices... estan igual en memoria, simplemente se expresan al revez en la documentacion. No tenes que trasponerlas ni nada (al menos si usas Fixed Pipe. Si usas Shaders si te conviene trasponerlas por cuestiones de performance pero podes no hacerlo).

Y por ultimo, el tema ARGB y el del centro del pixel... eso es una de las cosas que MS cambio en D3D10. A partir de ahi se rigen las reglas de OpenGL. Y si era muy molesto a la hora de portear.

Saludos,
En línea
reduzio
Colaborador
Usuario
*****
Desconectado Desconectado

Mensajes: 326



Ver Perfil
« Respuesta #6 en: Septiembre 21, 2009, 07:01:14 »


El tema Left/Right Handed... en realidad D3D es agnostico en ese aspecto. En cualquier caso la documentacion o ejemplos usan LH, pero el API de extensiones soporta ambos (claramente identificados con LH/RH al final). Si usas tus propias matrices no deberias tener problemas. En cualquier caso el unico problema es que en Clip Space, Z tiene el rango 0..1 y 1 es far.

En cuanto a las matrices... estan igual en memoria, simplemente se expresan al revez en la documentacion. No tenes que trasponerlas ni nada (al menos si usas Fixed Pipe. Si usas Shaders si te conviene trasponerlas por cuestiones de performance pero podes no hacerlo).


Originalmente en HLSL usaba las matrices column major que venian del mismo pipeline que GL, asi podia hacer multiplicacion onda mul(matriz,vector) igual que en GL... pero despues para algunas cosas donde tenes que construir una matriz en base a vectores dentro del mismo shader, se me empezo a complicar, asi que las inverti al mandarlas al shader. De cualquier forma, sigo usando el mismo sistema de coordenadas y matrices de proyeccion que GL sin mucho problema, nada mas que al final para convertir a clipspace directx-friendly hago: z = 0.5 * (z+w)

Siendo honesto, creo que lo que mas me gusta de directx es el tema compatibilidad.. me maravilla poder probar compilar cosas que anden en placas que no tengo y tener la casi-certeza que va a funcionar (excepto vertex texture fetch en placas ati x1000 por lo que lei)


En línea
zek
Usuario
*
Desconectado Desconectado

Mensajes: 282


"A la grande le puse cuca..."


Ver Perfil
« Respuesta #7 en: Septiembre 21, 2009, 09:19:55 »

Hola reduz

Estabas trabajando en UNIX o en Linux?

Respecto a los IDE's.. yo trabaje con VS, Eclipse y Netbeans en windows y los ultimos dos en Kubuntu y Solaris. Al margen del sistema operativo cada uno tiene sus pro y sus contras... Eclipse tiene un debugger horrendo, Netbeans es ULTRAPESADO (Pero mal!) y VS es demasiado transparente a veces, eso es algo mas personal pero varios deberan concordar.
Por el otro lado, por ejemplo, el autocompletado de VS es muy muy bueno, el Netbeans es genial para desarrollar interfaces y el eclipse... eh dejalo ahi Lengua jaja, el eclipse es bastante flexible con el tema compiladores.. por ejemplo netbeans me rechazo varias versiones de gcc, cosa que eclipse no (Por eso lo banco a muerte Lengua)

Respecto OpenGL vs DirectX, no tengo mucho que decir, no desarrolle nada mas alla de un hola mundo con ambos asi que hablo muy de principiante, pero de opengl no me gusto el bardo con Glut, lo termine bajando de no se que pagina porque la pagina de openGl es una lapida, y no se si entendi bien, pero para compilar estas usando como libreria el driver propio de openGL que tenes en la maquina de desarrollo? nunca entendi bien eso. (vease: http://www.adva.com.ar/foro/index.php?topic=5244.0)
DirectX en ese aspecto me paricio mas simple, al menos para el principiante, una sdk tradicional y listo.
Ah, y otro punto a favor de DirectX, la laptop que tengo tiene una de esas placas intel de muy bajo rendimiento. Hace un tiempo habia bajado las demos de ogre3d. Corriendolas en OpenGL no llegue a ejecutar la mitad, mientras que con DirectX logre correrlas casi todas.. supongo que directx emulaba cosas que opengl no podia.

Respecto a la forma de trabajar en el sistema operativo (ESTO ES MUY SUBJETIVO IGUAL)... para C/C++, prefiero windows. Yo uso MinGW, una carpeta con el compilador y todas las librerias y blabla, metidas ahi adentro. Varias veces he hecho lio con las librerias, pero al tener todo dentro de una misma carpeta me parecio mas sencillo mantener una copia limpia del entorno. En opensolaris me paso que SDL se instalo en tal lugar y Allegro en tal otro y no me parecio muy comodo tener las librerias separadas. Igual repito, eso es cuestion de costumbre.
En línea

Make it idiot proof and someone will make a better idiot.
Sik
Usuario
*
Desconectado Desconectado

Mensajes: 68


Ver Perfil
« Respuesta #8 en: Septiembre 21, 2009, 09:39:09 »

Ah, y otro punto a favor de DirectX, la laptop que tengo tiene una de esas placas intel de muy bajo rendimiento. Hace un tiempo habia bajado las demos de ogre3d. Corriendolas en OpenGL no llegue a ejecutar la mitad, mientras que con DirectX logre correrlas casi todas.. supongo que directx emulaba cosas que opengl no podia.
No, eso es porque los controladores que vienen con las laptops son una porquería =/

El otro día había uno en GDNet que se quejaba porque el hardware de su laptop podía tener OpenGL 3 tranquilamente pero el controlador no lo soportaba por alguna razón y el controlador además estaba bloqueado (o sea, no podía actualizarlo porque el que fabricó la laptop la hizo para que no se pudiera actualizar). Tuvo que modificar la configuración de un archivo para poder bajar los controladores nuevos.
En línea
zek
Usuario
*
Desconectado Desconectado

Mensajes: 282


"A la grande le puse cuca..."


Ver Perfil
« Respuesta #9 en: Septiembre 21, 2009, 09:46:10 »

MMmmmmmm, puede ser

ahora estoy usando el RC de windows 7 y hace poco intel presento drivers... antes habia unos genericos de microsoft... que andaban mejor >_> !!!!
En línea

Make it idiot proof and someone will make a better idiot.
Pogacha
Usuario
*
Desconectado Desconectado

Mensajes: 562



Ver Perfil WWW
« Respuesta #10 en: Septiembre 21, 2009, 10:27:48 »

En realidad si te faltaron herramientas en Windows es tan solo por que eres pobre. Está lleno de herramientas de todo tipo muchas, recontra avanzadas, claro esta, aqui ya no son gratis ni open source.
En línea

reduzio
Colaborador
Usuario
*****
Desconectado Desconectado

Mensajes: 326



Ver Perfil
« Respuesta #11 en: Septiembre 22, 2009, 01:59:16 »

En realidad si te faltaron herramientas en Windows es tan solo por que eres pobre. Está lleno de herramientas de todo tipo muchas, recontra avanzadas, claro esta, aqui ya no son gratis ni open source.

Si, concuerdo.. si en algun momento tuviera que invertir en algo, definitivamente me gustaria compilar usando el compilador de intel, que hasta ahora (al menos bajo linux) me dio resultados impresionantes.
En línea
Sergio J. de los Santos
Usuario
*
Desconectado Desconectado

Mensajes: 444


Ver Perfil
« Respuesta #12 en: Septiembre 22, 2009, 08:06:16 »

Siendo honesto, creo que lo que mas me gusta de directx es el tema compatibilidad.. me maravilla poder probar compilar cosas que anden en placas que no tengo y tener la casi-certeza que va a funcionar (excepto vertex texture fetch en placas ati x1000 por lo que lei)
Las ATI x1000 soportan VTF en OpenGL? hasta donde tengo entendido es una cuestion de HW no de SW...

En realidad si te faltaron herramientas en Windows es tan solo por que eres pobre. Está lleno de herramientas de todo tipo muchas, recontra avanzadas, claro esta, aqui ya no son gratis ni open source.

Si, concuerdo.. si en algun momento tuviera que invertir en algo, definitivamente me gustaria compilar usando el compilador de intel, que hasta ahora (al menos bajo linux) me dio resultados impresionantes.
En Windows tambien funciona muy bien, sobre todo al momento de compilar cosas con mucha matematica.
En línea
reduzio
Colaborador
Usuario
*****
Desconectado Desconectado

Mensajes: 326



Ver Perfil
« Respuesta #13 en: Septiembre 22, 2009, 12:48:33 »


Las ATI x1000 soportan VTF en OpenGL? hasta donde tengo entendido es una cuestion de HW no de SW...

No creo.. nomas es medio bajon que digan ser SM3.0 pero que no funcione vertex texture fetch..
En línea
Lionel
Usuario
*
Desconectado Desconectado

Mensajes: 1


Ver Perfil
« Respuesta #14 en: Octubre 01, 2009, 04:24:59 »

reduzio, ya que veo que tienes mucha experiencia, me podrias recomendar un buen libro sobre OpenGL pero destinado a sistemas Unix(en especial Linux)?.
 Muchas gracias.
En línea
Páginas: [1] 2
  Imprimir  
 
Ir a:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2007, Simple Machines LLC XHTML 1.0 válido! CSS válido!