Uso de C ++ 11 para el desarrollo de motores de juegos multiplataforma

18

Nota: Esta no es una pregunta para dar su opinión sobre C ++ 03 y C ++ 11.

Nuestro motor de juegos, escrito en C ++ 03, está diseñado para compilarse en Windows, OSX e iOS. El soporte de Linux está planeado para el (muy) futuro cercano. Nuestra experiencia es limitada cuando se trata de consolas, por eso estoy haciendo esta pregunta.

Actualmente, estamos debatiendo si cambiar a C ++ 11 y usar características no compatibles del estándar C ++ 11 podría plantear un problema en el futuro cercano cuando necesitemos portar nuestro motor a cualquiera de las consolas de generación actuales (quizás el ¿Los compiladores compatibles con algunas consolas todavía no son compatibles con C ++ 11? No lo sabemos ...).

Entonces, los desarrolladores de juegos que tienen experiencia en múltiples plataformas y consolas, ¿creen que deberíamos seguir con C ++ 03 hasta que llegue la nueva generación de consolas y la mayoría de todos hayan cambiado al estándar C ++ 11 (¿ya lo han hecho?). ¿O la mayoría de las consolas utilizan / admiten compiladores (VC ++, GCC o variantes) que ya son compatibles con las funciones de C ++ 11?

Samaursa
fuente
1
Mi conocimiento está algo desactualizado, por lo que no publicaré esto como respuesta, pero mi experiencia anterior con los compiladores de consolas es que tienes suerte si coinciden con el estándar anterior, no importa uno nuevo.
Kylotan
1
¿Qué características y por qué son tan importantes que considera utilizar un estándar que no está completamente implementado incluso en las plataformas de desarrollo más populares?
serpiente5
44
@ snake5: auto, lambda, alias de plantilla, delegación de c-tor. Estas características no solo harán que nuestro código sea más legible / mantenible, sino que también aumentarán la productividad. Solo la palabra clave auto es una de las cosas que extraño mucho cuando cambio de C ++ 11 a C ++ 03. Otras características como las plantillas variadas, aunque son muy potentes y definitivamente pueden mejorar el código, podemos prescindir (y hasta ahora no están implementadas por el compilador VC ++).
Samaursa
Además de lo que comentó Kylotan, estoy totalmente de acuerdo con su opinión, e incluso agrego un ejemplo particular en mi experiencia. Si va a extender ese motor a la plataforma de Android, lo que se puede hacer usando C ++, tendrá un mal momento ya que las características de C ++ están incompletas en el NDK. No podrá utilizar el nuevo estándar e incluso algunas cosas en el anterior serán defectuosas.
Grimshaw
1
@DevilWithin, he estado usando bastantes funciones de C ++ 11 en el NDK de Android sin ningún problema.
notlesh

Respuestas:

19

Si confía en su código para pagar alimentos y refugio, y necesita soporte multiplataforma en plataformas futuras desconocidas (o razonablemente podría necesitar soporte multiplataforma en el futuro), entonces diseñe su código para confiar en un La adherencia correcta de muchos escritores de compiladores desconocidos a los estándares de lenguaje de vanguardia es peligrosa (y diría que irresponsable). Es peligroso para usted y, por lo tanto, también peligroso para sus dependientes.

Si está dispuesto a correr ese tipo de riesgo por el bien de auto, por todos los medios, hágalo. Pero no te voy a aconsejar que lo hagas.

Porque en mi experiencia, ir multiplataforma, particularmente en consolas , se logra mejor al apuntar al mínimo común denominador, que puede estar seguro de que funcionará prácticamente en todas partes, no confiando en todas las últimas características del lenguaje whiz-bang. Si algún día necesita portar a una plataforma que no los admite, terminará teniendo que reescribir sus sistemas desde cero. ¿Puede permitirse pagar salarios / alquileres mientras eso sucede?

Trevor Powell
fuente
44
+1 para esto (y para el resto de la publicación, pero esto): "confiar [ing] en un grupo de escritores de compiladores desconocidos, la adherencia correcta a los estándares de lenguaje de vanguardia es peligrosa". Experimentar con los últimos juguetes siempre es divertido, confiar en ellos no tanto.
NoobsArePeople2
2
Siempre estoy ansioso por dar estas respuestas de "ten cuidado", particularmente cuando claramente no son lo que el cartel original quiere escuchar. Pero he visto grandes errores de compilación en las consolas demasiadas veces en mi carrera para que me sienta cómodo al saltar a nuevos estándares de lenguaje en un proyecto multiplataforma. La necesidad de reescribir su código para solucionar problemas en un compilador nunca es divertido, especialmente cuando tiene una fecha límite.
Trevor Powell
No voy a rechazar esto, pero el nuevo estándar C ++ es mucho más que el azúcar sintáctico, como la palabra clave auto.
vdaras
1
@TrevorPowell, usted dijo que el riesgo que correría era por el uso de palabras clave automáticas, cuando hay características mucho más importantes y fundamentales en el nuevo estándar C ++. Algunos de ellos, como las referencias de valor, deberían tenerse en cuenta al pensar en el riesgo.
vdaras el
2
@TrevorPowell es por eso que dije que no vale la pena votar por la publicación a pesar de los argumentos que tengo al respecto. Creo que esta es una buena publicación, solo quería aclarar que el nuevo estándar C ++ tiene algunas características muy importantes y considerar usarlo no se trataría solo de algo menor como el auto.
vdaras
6

Si está dispuesto a hacer un poco más de trabajo, podría buscar soluciones de refractorización. clang tiene algunas cosas interesantes que suceden en esa área actualmente. Debería ser posible usar la palabra clave auto, ejecutarla a través del refactorizador que encontrará todos los usos, resolverlos por usted y generar el código y luego compilarlo con lo que desee.

Pero eso significa menos tiempo para trabajar en tu juego.

También existe la posibilidad de algunas características adicionales, por ejemplo, la reflexión. Puede crear una clase y generar automáticamente una lista de todas las propiedades para inspeccionar en tiempo de ejecución. Podría ser muy útil para crear secuencias de comandos, producir editores de juegos, etc. EDITAR: Echa un vistazo a clreflect .

http://cppnow.org/session/refactoring-c-with-clang/

http://www.youtube.com/watch?v=mVbDzTM21BQ

http://clang.llvm.org/docs/Tooling.html

http://clang.llvm.org/docs/RAVFrontendAction.html

David C. Bishop
fuente
Muy interesante ¿Lo has probado tú mismo para este (o similar) propósito?
Jonas Byström
Todavía no, decidí esperar hasta que estuviera un poco mejor desarrollado, pero la última vez que realmente lo examiné, fue solo en el svn.
David C. Bishop
Muy interesante (+1)
Samaursa
Esto me recuerda a algo como Python, 2to3pero a la inversa y mucho más impresionante pero probablemente más difícil de usar. Hombre, ¿cuánto mejor puede autoser?
Steven Lu