¿Tienes algún consejo / recomendación al crear un juego multiplataforma en C / C ++?
¿Tienes algún consejo / recomendación al crear un juego multiplataforma en C / C ++?
Respuestas:
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?
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.
Intente evitar la dispersión por #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endif
todo 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.
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.).
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.
#ifdef PLATFORM_WIN
ftw