Desarrollo multiplataforma C ++ / OpenGL ES (iOS / Android) [cerrado]

10

Ya tengo una experiencia razonable con C ++ y OpenGL, y recientemente decidí probar el desarrollo de juegos móviles. Después de crear con éxito una aplicación simple de Android OpenGL ES usando Java, investigué formas de apuntar tanto a Android como a iOS con el menor código de reescritura posible. Intenté usar las orgullosas herramientas de desarrollo de aplicaciones multiplataforma de Visual Studio 2015, pero encontré que eran demasiado nuevas y, por lo tanto, extremadamente poco documentadas. Podría construir los proyectos de plantilla que me dio el programa, pero no pude entender cómo, dadas estas plantillas, podría agregar activos al juego o manejar la entrada de la pantalla táctil.

Por desgracia, tengo un deseo específico, demasiado específico para encontrarlo en Google. Quiero hacer un juego OpenGL ES usando C ++, con envoltorios delgados específicos de plataforma para Android e iOS. La gente me ha hecho preguntas similares (aunque no exactamente lo mismo), y más de una persona que respondió ha declarado que lo que quiero hacer no solo es posible, sino relativamente fácil, ya que no tengo que preocuparme por la IU.

Intenté este tutorial , pero tiene casi tres años y, por lo tanto, probablemente esté diseñado para tecnología más antigua, y como resultado me encontré con varios errores no explicados. Sin embargo, a partir de ahora, ese tutorial es lo más parecido a lo que quiero que haya encontrado. Todo lo demás es solo para Android o recomienda que pague cientos de dólares al año para usar el SDK de Marmalade. A veces tengo ganas de escribir el código dos veces, una en Java y otra en Objective-C, pero estoy motivado por el conocimiento de que esta solución es posible, pero por alguna razón, no está cubierta en ningún detalle moderno.

Para resumir, quiero hacer un juego OpenGL ES para iOS y Android, con una única base de código C ++ envuelta en pequeñas cantidades de código específico de la plataforma. Sin embargo, a pesar del hecho de que varias personas han recomendado este enfoque, nadie puede decirme cómo hacerlo. ¿Alguien puede decirme si es realmente posible, y si es así, qué puedo hacer o dónde puedo ir para aprender cómo?

Craig Horwood
fuente
pruebe cocos2d-x , o unity3d
Ali1S232
1
Unity3d está lejos de lo que pide el OP, ya que no tiene acceso a la fuente. He usado cocos2d-x y los problemas de compilación siguen ahí hasta cierto punto. La influencia del objetivo C también se siente, a algunos les puede gustar eso, pero para mí eso es un desvío. Sin embargo, es una solución de código abierto, por lo que quizás valga la pena investigar el tiempo de los OP.
Matthew Sanders el

Respuestas:

6

Puede encontrar mi respuesta a una pregunta similar aquí para ser útil.

También puede resultarle útil consultar el código fuente de otras soluciones. El motor de Godot , por ejemplo, es un motor de juego de código abierto multiplataforma por lo que no será necesario nada de pago.

Como mencioné en mi otra respuesta , no necesita (y probablemente no puede) confiar en un IDE para hacer el trabajo por usted. CMake , Scons y muchas otras herramientas de compilación pueden ayudar con el proceso de compilación / compilación cruzada en plataformas e IDE.

Godot Engine , por ejemplo, usa Scons y el proyecto LLVM (también conocido como el marco del compilador utilizado por clang, el compilador C / C ++ / Objective-C) usa CMake .

Un enfoque popular para los juegos es construir un motor en C / C ++ y, como mencionas, abstraer los detalles de la plataforma. Cuando se trata de iOS y Android, esta es la lógica de gestión del ciclo de vida que interactúa con el sistema operativo. Si desea hacer un esfuerzo adicional y utilizar Emscripten para compilar también a asm.js y darse cuenta de la velocidad casi nativa en el navegador, está haciendo algo similar al abstraer el bucle principal detrás de lo que equivale a solicitar llamadas AnimationFrame .

Emscripten recomienda el uso de SDL para facilitar el proceso de portabilidad, ya que puede ayudar a manejar la abstracción de los detalles específicos de la plataforma, pero no hay nada que le impida hacerlo usted mismo (aparte de un montón de investigación, depuración, etc.).

Si está realmente loco, puede hacer lo que estoy haciendo y escribir su propio lenguaje utilizando el poder de LLVM para compilar en C ABI nativo o incluso JIT en plataformas compatibles.

El punto es que sí, de hecho es posible, pero algunas carreteras son más complicadas / requieren más tiempo que otras.

Nota: Es probable que necesite usar Mac OSX a través de una Mac, VM o Hackintosh con XCode para compilar en iOS. Esta es una de las muchas razones por las que considero que un Macbook Pro es un gran candidato para un sistema de desarrollo.

Nota 2: Vale la pena mencionar que muchos motores multiplataforma de hoy en día utilizan lenguajes de secuencias de comandos para la lógica específica del juego. Unity ni siquiera le permite acercarse a su código fuente, por ejemplo (aunque puede escribir complementos nativos). Esto puede ayudar a acelerar los ciclos de desarrollo, así como a mantener el puerto al mínimo, ya que los lenguajes de secuencias de comandos son bastante independientes de la plataforma (especialmente los lenguajes interpretados que se ejecutan en una VM). El objetivo de mi lenguaje es permitir JIT (principalmente para ahorrar tiempo de desarrollo) y compilación estática.

Nota 3: Si aún no lo ha descubierto. Si no utiliza SDL o alguna otra solución que resuma los detalles específicos de la plataforma, deberá utilizar las funciones de interfaz C / C ++ específicas de cada plataforma. Con iOS, esto es bastante simple en XCode ya que el compilador (clang como se mencionó anteriormente) ya admite C / C ++. Con Android, debe utilizar lasllamadas NDK y Marshall entre Java y C / C ++.

Matthew Sanders
fuente
1
Miré el código fuente del Godot Engine. Parece un poco excesivo; Prefiero crear el mío sin las características que no necesito. Sin embargo, no estoy muy seguro de cómo hacerlo. Todavía no he podido ejecutar con éxito ningún código C ++ en Android.
Craig Horwood
jeje ... ya NDK no es un picnic. Honestamente, encuentro algo en Google para necesitar ayuda en la categoría de amistad para desarrolladores. ¿Está usando el SDL fuera de los límites para usted? Tengo mucha más información con la que puedo actualizar la respuesta si es necesario.
Matthew Sanders el
SDL no está fuera de los límites, pero preferiría no ir allí. Una vez más, siempre existe ese pequeño conocimiento de que podría haberse hecho sin un marco.
Craig Horwood
Ese error me muerde constantemente, así que sé cómo te sientes. He usado el NDK en el pasado y no creo que haya cambiado mucho en cuanto a la configuración y la compilación. Espero que la depuración haya mejorado, ya que tuvo que usar GDB directamente en el pasado a través del terminal y el IDE no tenía soporte para ello, pero parece que han comenzado a agregar soporte NDK al estudio de Android . ¿Has probado el ejemplo de hellojni ?
Matthew Sanders
NDK es una de las cosas más desagradables que existen, es posible que bgfx sea útil como referencia github.com/bkaradzic/bgfx , no es tan delgado como te gustaría, tiene múltiples backends de renderizado
JBeurer