Bien, para que un software pueda ser considerado portable lo primero que se debe hacer es definir muy bien la estructura de alto nivel. Es decir, definir muy bien las funciones que vamos a utilizar dentro de nuestro programa (abstracción) y separar muy bien las partes que no tengan nada que ver las unas con las otras (modularidad).
Ejemplo: Podeis crear una función que se llame "PonPixel( x, y )", la cual debe estar pensada para que no nececesite modificaciones a la larga. Es decir, hemos de asegurar que cuando creemos nuestra versión para windows, programando previamente en linux, no necesitemos modificar la función para llamarla "PonPixelWin( x, y )", con la consiguiente modificación en todos los softwares. Dentro de PonPixel no puede haber nada relacionado con, por ejemplo, el sistema de ventanas... eso ya lo hará la función encargada de pintar la pantalla con el mapa generado por un conjunto de "PonPixel".
El ejemplo es muy chorra, pero es, como su nombre indica, para ejemplificar.
Otro punto que se debe hacer es programar correctamente. Esto es una obviedad, pero no es tan habitual. Se necesita tener las ideas muy claras y depurar mucho. Que no aparezca ni un solo "warning" puede ayudar mucho. Los "warnings" son advertencias del compilador. No todos pueden dar lugar a error, pero merecen ser tomados en cuenta.
El tema de los estándares tiene el siguiente fundamento: deben cumplirse en todos los sitios por igual. Es decir... si dice que soporta OpenGL 2, el sistema/hardware en cuestión DEBE implementar de manera correcta las especificaciones de este. De otra forma el comportamiento de las aplicaciones sería muy distinto de uno a otro. Otro tema relacionado con este es que podemos llegar a conocer como funcionan los estándares hasta el punto de poder hacer una implementación al 100% de ellos, ya sea por soft o por hard. Si una tarjeta de video no tiene software OpenGL para esta, no hay nada que nos impida implentarla. Eso si, siguiendo las normas que nos imponen. Los estándares son eso: normas.
¿que hace que SDL sea tan portable? SDL no es que sea portable en si mismo, si no que las aplicaciones que usan las SDL son portables a una plataforma concreta en el primer momento que las SDL están portadas a esta plataforma. Esto es debido a lo que comentaba el primer punto: utilizamos abstracciones de una API sobre el software/hardware. Si programamos para Windows... la Win32 API es, a parte de horrible, muy sobrecargada y demasiado enlazada al sistema. En sistemas ANSI la entrada y la salida son las mismas. Solo fijaros en la función "main" de una y de otra. En aplicaciones windows tienen 5 parámetros de entrada, los ANSI 2. La API de Win32 es un estándard de facto... como lo son las SDL en el tema multiplataforma. Los estándares de verdad los definen consorcios (conjunto de empresas y usuarios expertos), y se modifican tras procesos largos en los que se estudia y reestudia cada posible cambio. Ahora las SDL están sufriendo un cambio de estructura de gobierno, pasando de ser una aplicación creada por una persona y mantenida por una comunidad a empezar un proceso de estandarización... será largo, pero se está empezando dentro de las mailing lists. A mi me gustan las SDL ya que te olvidas de la sintaxis de un SO o hard concreto, y te dedicas a programar el programa en cuestión... no entiendo como a la gente le gusta pelearse con la API de Windows para encasillarse en ella, y esto es una opinión personal.
Otro ejemplo sería utilizar las librerías STL para crear las estructuras internas de nuestra aplicación (arboles, grafos, vectores...), ya que estas son "estándard" y hay una normas de implementación, que se cumplirán (o deberían) en cualquier sistema. Esto nos ahorra mucho mucho tiempo en reinvención de la rueda, para cada sistema.
Y otro ejemplo más: OpenGL, a parte de implementar funciones para hablar con la pipeline gráfica, tenemos un conjunto de tipos (que en el fondo son MACROS) que substituyen a los tipos típicos: int, float, double... por GLint, GLfloat, GLdouble... esto es debido a que los tipos típicos pueden variar en la precisión a nivel de hardware. Por lo que si en lugar de los tipos típicos utilizamos los creados por la implementación OGL del sistema, nos aseguramos que la aplicación se comporte de la misma forma en uno y en otro aunque internamente cambien.
También para que algo sea portable debe DEGRADARSE. Esto significa que dependiendo del sistema en el que esté el programa debe saber como comportarse: bajar la calidad de los gráficos, el audio, las texturas, las luces, sombras... todo aquello que haga que el juego se COMPORTE de la misma forma sea cual sea la potencia del hard. Doom 3, o GTA es un buen ejemplo: en Doom 3 tenemos un sistema de LOD (Level Of Detail) tremendo, que degrada las mayas, bumpmappings, sombras... en tiempo real dependiendo de la carga del sistema; en GTA podemos ver como el frustrum se modifica en tiempo real para mostrar más o menos elementos... teniendo en PC una profundidad de cámara de kilómetros y en PS2 de escasos metros en algunas ocasiones.
Resumen: para que algo sea portable debe utilizar al máximo estándares que aseguren su buen funcionameniento allá donde vaya, usar librerias multiplataforma y saber degradarse.
Este tema está muy discutido, pero lo básico es eso.
Los señores de Raven e id lo saben bien... me sorprendieron mucho al utilizar las SDL en Q4... pasando a utilizar este: OpenGL, OpenAL y SDL. El trio portable.
El tema de las GTK lo sigo mucho últimamente: son MUY portables, pero estan algo mal pensadas. La API se ha complicado con el tiempo para acceder a nuevas características, lo cual ha hecho que incluso se ralentice y el programador se confunda. Las GTK están escritas en ANSI C 100% estándard y prácticamente nada se "apega" al hardware ni al sistema en el que esté. Los de las QT se lo han currado mucho, la API mejora con el tiempo y se hace más clara... pero tiene mucho "apego" a los sitemas portados... por lo que lo hace dificil ser portado (aunque se haga!).
Espero no haberos aburrido mucho. Saludos!
-------------
Contesto a los post que se han escrito mientras me caducaba la sesión
El problema para mi de OpenGL es que funciona a base de extensiones, por eso decia lo de desactualizado, porque pelao se ha quedado anticuado, pero con extensiones esta al nivel de DX9 eso en ningun momento lo pongo en duda.
Mucha gente cae en el mismo error: OpenGL no puede pensarse SIN extensiones. Es decir, cuando se habla de OpenGL se habla también de sus extensiones. La palabra "extensión" lleva a error: son funciones añadidas a la API 1.0. Podrían haberlo llamado OpenGL 8.0 a estas alturas como hace M$... pero han decidido hacerlo así, para diferenciar bien la API "mejorada" de la API original. Así los programas siempre serán reutilizables y mejorables. Porque lo que se busca es eso MEJORAR. Si cambias la API, los programas tienen que ser reprogramados, si simplemente le añades cosas, solo tienes que implementar los cambios si quieres las mejoraras.
Si programas en OpenGL debes aprender muy bien todas las posibilidades de este... lo que significa conocer todas sus extensiones. Y no es para tanto y vale la pena.
Resaludos!!!!
Siento el OFFTOPIC!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!