unity - programacion de videojuegos en c++
¿Por qué c++ es tan poderoso en relación con el desarrollo de juegos? (16)
Me preguntaba por qué c ++ es tan potente y eficaz para desarrollar juegos. Escribí muchos juegos en c # y delphi, siempre usando el componente del temporizador para hacer que los objetos se "muevan". Otra opción para el movimiento eran los bucles, pero definitivamente no tienen buen desempeño.
Entonces, ¿qué técnica utiliza c ++ para que los usuarios puedan desarrollar juegos de rendimiento?
Entonces, ¿qué técnica utiliza c ++ para que los usuarios puedan desarrollar juegos de rendimiento?
Ninguno que no se encuentre (también) en otros idiomas.
La ventaja de C ++ sobre otros idiomas (subjetivo hasta cierto punto) no está en las técnicas utilizadas.
Es una combinación de algunos factores, lo que lo hace tanto lo suficientemente bajo como lo suficientemente alto para lo que se necesita:
es determinista (puedes determinar que se ejecuta cuando). Esto no es cierto para los idiomas recolectados en la basura y no es (o parcialmente) cierto para los lenguajes ejecutados en máquinas virtuales.
ofrece un alto rendimiento (puede obtener un rendimiento similar al de C e incluso colocar un código de ensamblaje si lo desea).
ofrece suficiente abstracción para tener un nivel más alto que otros idiomas rápidos (como C, por ejemplo).
Al final, es algo cercano a los lenguajes de bajo nivel y los lenguajes de alto nivel.
¿Cuántos jugadores usan una PC reuglar?
¿Cuántos de ellos menos de $ 1000?
En algún momento, tenemos que preguntarnos si es puramente C ++, lo que nos proporciona las mejores velocidades en velocidad de cuadros. La barrera del idioma está simplemente envuelta alrededor de sus herramientas, C ++ no tiene nada que se interponga en su camino. Eso es realmente todo el argumento. La mayoría de los lenguajes son en realidad más que a la par con C ++, es solo su temido ecosistema que los frena.
A medida que las máquinas se vuelven más poderosas y la carga de trabajo se pasa al hardware (gráficos e incluso física, en algunos casos), hay más recursos del sistema disponibles para realizar otras tareas. Como tal, a pesar de que C ++ sigue siendo el estándar de la industria, las optimizaciones prácticas que habilita ya no son la razón principal por la que se utiliza. La razón principal por la que se usa es que la mayoría de las API para el desarrollo de juegos son API de C ++. Rara vez desea escribir su propio motor e incluso si escribe su propio motor, es probable que esté reutilizando componentes estándar de bajo nivel, como NVidia PhysX, DirectX, OpenGL, etc. Algunos de estos ahora tienen interfaces de código administrado, pero Las API principales son para C ++, ya que se usa tan comúnmente.
Otra tendencia que vale la pena destacar es que muchos juegos en estos días utilizan lenguajes de script, como Python o Lua, para controlar gran parte de la lógica del juego. Esto le da a los desarrolladores de contenido y modders flexibilidad para proporcionar comportamientos ricos sin tener que codificar en C ++ o compilación. Las secuencias de comandos no son de alto rendimiento, pero son extremadamente convenientes y las PC modernas tienen mucha potencia para manejar las secuencias de comandos.
Algunos otros aspectos que creo que no fueron mencionados:
- C ++ no utiliza la recolección de basura (a diferencia de, por ejemplo, C #); puede ser desafortunado si el juego se detiene por un momento para la recolección de basura. Para un juego de consola destinado a funcionar a 30 o 60 fps, esto puede ser un problema.
- Los desarrolladores de juegos a menudo dedican tiempo para optimizar el código. Las herramientas adecuadas están ahí para esto con C ++. P.ej. la mayoría de los compiladores admiten funciones intrínsecas, por lo que es posible usar instrucciones SSE directamente. Otra cosa que los programadores de juegos suelen hacer es inspeccionar el ensamblado generado y ajustar el código C en consecuencia, por ejemplo. Para eliminar ramas dinámicas. Evitar las funciones virtuales también puede traer beneficios de velocidad (por ejemplo, muchos otros lenguajes solo tienen métodos con polimorfismo dinámico, con su costo de rendimiento asociado).
- De hecho, es más multiplataforma que C # o Java desde la perspectiva de muchos desarrolladores de juegos. ¿Puede ejecutar Java o C # en, por ejemplo. PS3? (Edición: Mono es utilizado por al menos un popular motor de juegos multiplataforma, por lo que C # es posible, pero la incorporación de Mono puede ser una barrera si no se usa ese motor)
C ++ le proporciona un control más preciso sobre el hardware real y el empuje de bits. Para las necesidades comerciales comunes, un lenguaje de tercera generación, como Java o C #, es más rápido de programar y elimina las preocupaciones del desarrollador, como los punteros y la recolección de basura. Esto conlleva el costo de la falta de capacidad para optimizar y ajustar la forma en que se utilizan la memoria y las estructuras de datos.
También puede adoptar un enfoque híbrido para dividir el juego en un lenguaje de nivel superior para secuencias de comandos, etc. y luego "soltar" en tierra C ++ para las piezas que requieren la velocidad y las optimizaciones.
C ++ tiene la combinación de eficiencia y abstracción que lo convierte en la única opción práctica para sistemas a gran escala que requieren respuestas eficientes [1].
Las capas de interfaz de hardware están, como regla general, también en C o C ++, lo que significa que no es necesario configurar una interfaz de idioma extranjero para hablar con las capas de abstracción de hardware.
Además, tiene la ventaja de una gran comunidad con experiencia en juegos de escritura, así como numerosos marcos.
En una nota personal, he usado juegos escritos en otros idiomas, y siempre han sido más lentos.
[1] Ada o Delphi también se pueden usar en esta área, pero su nivel de popularidad significa que no es tan pragmático elegirlos a menos que tenga una necesidad de nicho.
En gran medida esto se basa en dos cosas:
- Historia
- Marcos actuales
Durante muchos años, C ++ fue la única * opción para aplicaciones de alto rendimiento de cualquier tipo, incluidos los juegos. Como resultado, hubo importantes inversiones en motores de juegos y bibliotecas que también se escribieron en C ++.
Incluso hoy en día, la mayoría de los marcos para juegos están escritos en C ++. XNA permite C #, pero incluso Microsoft sigue presionando C ++ como el idioma de su elección.
* Sí, es subjetivo ...
Games es un software de rendimiento crítico que requiere el 100% de uso del hardware que el usuario tiene, y C ++ es solo un lenguaje popular que le brinda tales habilidades:
- Alto nivel de abstracción: programación orientada a objetos fina y programación genérica
- Muy buen y determinista control de los recursos que utilizas.
- Capacidad para optimizar partes especiales a un nivel muy alto que es casi imposible de lograr con otros idiomas populares.
Por esta razón, encontrará C ++ no solo en el desarrollo de juegos, sino también en muchas otras áreas que requieren de su mejor rendimiento, el menor uso de recursos y una buena capacidad de optimización, como, por ejemplo, bases de datos, programación de sistemas y muchas otras áreas.
Hay una base de código sólida para juegos, y es principalmente en C ++. La mayoría de los motores de juegos se implementan en C ++ y eso se debe a que, como alguien mencionado anteriormente, también se implementan OpenGL y DirectX en C ++. Más adelante, los juegos siempre superan los límites del hardware y es por eso que el código debe ser lo más rápido y óptimo posible.
En el lado opuesto están las aplicaciones de oficina / negocio que simplemente necesitan ciclos de desarrollo más rápidos, estabilidad y que sean lo más extensibles posible.
Hay una serie de razones aquí.
Portabilidad
¿Uno realmente piensa que Sony usará C # en una de sus consolas? ¿Implementará Nintendo una JVM en la Wii2?No.
¿Qué pasa si Microsoft va C # con la próxima Xbox? Adivina qué, no lo harán. Eso duplicaría la base de código para todos los desarrolladores externos, haciendo que la nueva consola de Microsofts sea mucho menos atractiva para desarrollar.
Entonces, C ++ es la opción obvia aquí porque uno solo necesita el compilador para la arquitectura apropiada.
Actuación
Además, lo más probable es que el núcleo de los motores 3D siempre esté escrito en C / C ++ con parte de él en ASM, simplemente porque desea exprimir todo el rendimiento de las consolas en las que su entorno está básicamente en piedra.Tiempo de desarrollo
Antes de que aparecieran todos los motores con licencia, hubo un momento en que la primera generación de títulos de software tardó mucho tiempo en desarrollarse, solo porque tenía que escribir un motor completamente nuevo para su Juego en la nueva Plataforma, lo que lleva tiempo. Teniendo en cuenta que el desarrollo de un gran juego ya lleva años, esto cuesta mucho dinero. Así que siempre fue más fácil tomar el código existente y "actualizarlo" para la próxima generación. Luego, con el tiempo, gradualmente lo mejorarías. Teniendo eso en cuenta, es fácil ver que ninguno de los fabricantes de consolas deseaba hacer que sus desarrolladores se enfrentaran a tiempos de desarrollo aún más largos al cambiar su consola a algo diferente a C / C ++.
Así que para envolverlo todo. La portabilidad, el rendimiento y las bases de códigos heredados son las razones por las que C / C ++ sigue siendo EL jugador principal en el desarrollo de juegos.
La única técnica que C ++ tiene sobre la mayoría de los otros lenguajes de alto nivel es que "no pagas por lo que no usas". El lenguaje no tiene características detrás de escena como recolección de basura, conteo de referencias, sincronización, reflexión, introspección, verificación de límites, verificación de tipos en tiempo de ejecución, meta-clases, etc., cada una de las cuales puede imponer un costo en general. operación.
Por supuesto, la mayoría de esas funciones son muy útiles, por lo que en C ++ debe pasar mucho más tiempo del codificador para obtener los mismos resultados. Si vale la pena o no, el esfuerzo se reduce a una cuestión de con qué código legado tiene que trabajar.
La fuerza de C ++ cuando se trata del desarrollo de juegos es la capacidad de diseñar exactamente las estructuras de datos que utilizará su software. Cuando los sistemas de tiempo real (como los juegos) comenzaron a crecer, fue el lenguaje de programación más comúnmente soportado y desarrollado. Como tal, fue una elección natural para los juegos que intentan llevar las plataformas al límite. Esto ha llevado a la mayoría de los desarrolladores a aceptar esta opción, incluso si la necesitan o no.
C ++ ofrece la posibilidad de anular importantes cuellos de botella de rendimiento, como la asignación de memoria. Tiene la capacidad de estructurar y colocar las cosas exactamente donde lo desean en la memoria. Además de esto, es un lenguaje de programación flexible que proporciona una velocidad de desarrollo decente.
Me gustaría señalar algunas cosas que la gente está perdiendo. En primer lugar, C ++ tiene su dominio en la industria porque la mayoría de los estudios tienen un motor de código C ++ 3D existente. En segundo lugar lo construyeron o han estado trabajando con él durante años. Solo esos dos puntos hacen que sea razonable quedarse con C ++. En tercer lugar, C ++ nativo siempre será ligeramente más rápido que los lenguajes administrados porque no tiene la sobrecarga de ser ... bueno, administrado.
Ahora ten en cuenta que, sin embargo, esto es para los estudios de juegos existentes, la escena indie es una pequeña diferencia y creo que aquí es donde XNA está ganando velocidad. En primer lugar, le permite acceder a tres dispositivos (pc, xbox, zune based) y eso ni siquiera incluye mono xna. Las diferencias de velocidad casi nunca merecen la pena preocuparse en este nivel y es simplemente más productivo.
Espero haberte dado algo para tener en cuenta.
OpenGL y DirectX son muy compatibles con C ++. Agregue el hecho de que tiene un control más preciso sobre la memoria, la asignación de memoria, y puede usar solo las características suficientes de C ++ para hacer que el desarrollo sea "más fácil" que la simple C para obtener algunas de las razones.
Por lo que siempre he entendido, y la regla se aplica también a los deportes.
Speed kills.
Todo sobre la velocidad.
nada te detiene a usar un temporizador para escribir tus juegos de c ++.
Puedes ver el método de C ++ Boost thread :: sleep para hacer eso.