¿Algún consejo para crear juegos multiplataforma? [cerrado]


Respuestas:


44

Ocultar todo lo específico de la plataforma detrás de las capas de abstracción

Esto significa cosas como renderizado, audio, entrada del usuario y archivo IO. Un truco común para abstraer que sin inducir una penalización de rendimiento en tiempo de ejecución son los encabezados independientes de la plataforma con archivos de implementación específicos de la plataforma:

// FileSystem.h
class FileSystem {
public:
    FileHandle OpenFile(const char * path);
    // other stuff...
}

// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
    // call windows API...
}

Luego configure las compilaciones para cada plataforma para compilar con el archivo .cpp adecuado.

Haga que sus canales de contenido se lean en activos independientes de la plataforma y genere contenido específico de la plataforma para cada plataforma

Por ejemplo, cree sus texturas como .tga o simplemente .psd, luego tenga una tubería que pueda convertirlas automáticamente a los diferentes formatos específicos de plataforma que necesite.

No asuma un diseño de memoria específico o endianness en sus datos

Las plataformas pueden variar en orden de bytes, relleno, alineación y tamaño de palabra. Cualquier código que se preocupe por eso debe probarse exhaustivamente en todas las plataformas.

Prueba en todas las plataformas, todo el tiempo

Usted será mordido por los insectos específicos de la plataforma. ¿Prefieres ser mordido ahora o justo cuando intentas sacar el juego por la puerta?


2
falta de #ifdef PLATFORM_WINftw
tenpn

Nunca escaparás de eso. Puedes esperar minimizarlo.
munificente

8
Una buena manera de hacerlo es mover todo el código específico de la plataforma a un conjunto de bibliotecas compartidas con la misma interfaz, luego puede limitar los # ifdef para arrancar la biblioteca correcta para la plataforma.
Neel

1
+1, gran comentario. Recuerde que incluso el STL depende de la plataforma (y sí, algunas funciones hacen cosas diferentes en diferentes compiladores).
Simon

¿Seguramente llamar a una función adicional disminuirá el rendimiento? La CPU tiene que cargar o mover datos de registros o, lo que es peor, memoria que aún es lenta. ¿No sería suficiente una llamada al sistema?
TheBlueCat

10
  • Use una API como opengl / sdl que le proporcionará una molestia mínima cuando vaya de plataforma en plataforma.

  • Asegúrese de saber qué plataformas desea admitir. No uses opengl solo porque creas que quizás quieras admitir plataformas múltiples en el futuro. Comience como quiere continuar.

  • Sepa qué limitaciones de hardware hay en cada una de las plataformas que desea admitir.


El segundo punto no puede enfatizarse lo suficiente. Asegúrate de saber a quién va dirigido el juego (lo que significa que, si es un juego casual, querrás tenerlo al menos en OSX y Windows, por lo tanto, OpenGL sería la mejor opción). En cuanto al tercer punto, y aquí es donde entra en juego el motor, también es importante. Sería ilógico usar un motor rico en funciones y con muchos recursos como Unreal para hacer un juego de DS. El punto también está relacionado con lo que dije con respecto al segundo: establecer a quién va dirigido el juego. Si vas a un juego casual, las computadoras de la mayoría de las personas no manejarán, digamos, partículas.

7

Intente evitar la dispersión por #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endiftodo el código.

A veces parece que es la forma más fácil, pero a la larga te dará problemas. Debe intentar limitarlos a su propio archivo, de modo que cada implementación de plataforma sea autónoma.

Agregar una plataforma debería consistir principalmente en agregar nuevos archivos de implementación, y simplemente modificar los pocos existentes necesarios.


4

Hay muchas bibliotecas que son multiplataforma; no necesita escribir directamente en OpenGL para ejecutar en cualquier lugar. OGRE es un gran ejemplo de un motor de renderizado que funciona en cualquier plataforma que quieras nombrar.

En mi experiencia, la mayor preocupación es su sistema de construcción. Si desarrollas en Windows con Visual Studio, tu código puede compilarse en Linux, pero tendrás dificultades para construirlo fácilmente. Mire los sistemas de compilación como CMake que pueden usar las mismas instrucciones de compilación para generar archivos de proyecto específicos de la plataforma (archivos MAKE en Linux, proyectos VS en Windows, proyectos XCode en Mac, etc.).


4

Al escribir sus funciones para guardar y cargar archivos, o comunicarse a través de una red, no se olvide del endianness .

En lugar de leer una gran estructura con una sola llamada a fread / fwrite o algo de bajo nivel como ese, cree un ReadByte / WriteByte y ReadFloat / WriteFloat. Entonces tendrá menos lugares para realizar cambios si decide apuntar a una plataforma diferente más adelante.


+1 * 9000. Supongo que esto solo se aplicaría a los teléfonos móviles en términos de arquitecturas modernas / usadas (RISC); Pero sigue siendo crucial.
Jonathan Dickinson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.