¿Por qué se prefiere C / C ++ para los desarrolladores de juegos?

14

Algunas personas dicen que ofrece más control a los desarrolladores, pero ¿qué es precisamente lo que se puede controlar a través de C ++ que no se puede controlar utilizando, por ejemplo, Java?

Pablo
fuente

Respuestas:

21

Java se ejecuta en una máquina virtual, mientras que C ++ se ejecuta directamente en el hardware. Lo que esto significa es que tienes más control sobre dónde va tu memoria y qué se hace con ella en C ++.

Java es un lenguaje recolectado de basura. No tienes control directo sobre tu memoria. Puede asignar nuevos fragmentos de memoria, pero no tiene control (fino) sobre cuándo se elimina. El recolector de basura verifica cada pieza de memoria que asignó a cada x tramas y determina si es basura o si todavía se está usando.

Para los juegos esto puede ser desastroso. Cada pocos fotogramas, viene un recolector de basura para verificar cada asignación que ha realizado para ver si todavía se está utilizando. ¡Habla sobre una desaceleración!

En segundo lugar, la mayoría de las bibliotecas que utilizamos estaban escritas en C o escritas en C ++. Estoy hablando de Scaleform, el motor de física Havok, PhysX, SpeedTree, etc. Todos los paquetes profesionales, utilizados ampliamente en la industria. Si otro idioma quiere ser rey, es mejor que los apoye.

Mi opinión personal es que Java es realmente bueno para aplicaciones y aplicaciones de escritorio, pero no para juegos. Java tiene muchas herramientas agradables para desarrolladores y, en teoría, se puede ejecutar en cualquier plataforma que tenga una implementación de la máquina virtual Java, pero aún prefiero C ++ porque necesito ese control sobre mi memoria. Especialmente cuando comienza a trabajar con estructuras de datos exóticas (árbol rojo-negro, lista doblemente enlazada, etc.) ayuda a mantener una buena visión general de todas sus asignaciones de memoria.

No estoy diciendo: no uses Java. Estoy diciendo: piensa en por qué estás usando Java. Minecraft fue construido en Java, por lo que es posible construir juegos en Java. Pero, ¿habría sido un juego mejor si se hubiera creado en C ++? Bueno, ciertamente no habría sido tan barato hacerlo funcionar en los tres grandes (Windows, MacOS, Linux), pero aun así, encontró muchos errores específicos de la plataforma en su desarrollo, errores que Java no pudo solucionar terminado.

Hay toneladas de marcos C ++ ahora para programadores principiantes. Realmente no hay excusa para no aprenderlo, especialmente si quieres avanzar en tu carrera en la industria.

caballero666
fuente
1
Solo un poco, pero en la mayoría de los entornos operativos, el código nativo se ejecuta en una máquina virtual. Java se ejecuta en una máquina virtual dentro de una máquina virtual.
Skyler Saleh
1
@RTS: es un poco exagerado llamar a op -> traducción micro-op una máquina virtual, si eso es lo que estás buscando.
No, estaba hablando de la máquina virtual en la que todas las aplicaciones se ponen en los sistemas operativos modernos para permitir la multitarea segura. Esto ocurre en sistemas operativos que se ejecutan en arquitecturas sin micro-operaciones (RISC). Esto incluye memoria virtual, interrupciones de software, sistemas para acceso concurrente de hardware, el programador de sistemas operativos y el manejo del archivo de registro.
Skyler Saleh el
@RTS No estoy seguro de que el aislamiento de tareas realmente califique como una VM. Es un RM (Real Machine) con alguna protección incorporada. No hay una capa de abstracción de instrucciones obvia entre fetch / exec. Los compiladores y enlazadores generan código reubicable como requisito. La CPU proporciona soporte de hardware para gran parte de esto, lo que elimina el aspecto "virtual".
3Dave
2

Respuesta corta: C ++ compila a código nativo, por lo que el rendimiento depende del desarrollador, no de un motor de ejecución o VM.

Respuesta larga:

C ++ ser "más rápido" no tiene nada que ver con C ++. Por el momento, es uno de los pocos idiomas disponibles que son compatibles con herramientas que producen código nativo e independiente para múltiples plataformas.

En el pasado, podría usar C, C ++, BASIC / 2, Delphi, etc., y obtener ejecutables independientes y eficientes. La elección del idioma era una cuestión de preferencia personal y fuerzas del mercado.

En estos días, la suposición de que "C ++ es más rápido" es esencialmente una profecía autocumplida, aunque LLVM está en una buena posición para cambiar eso, ya que hace que todo lo que entra en el analizador sea discutible, como solía ser.

Borland tenía razón: varios lenguajes que se analizaron, primero se aplicaron optimizaciones y luego se pasaron a un compilador y vinculador de fondo común. Que es efectivamente uno de los principales logros de LLVM.

Java está estructurado de tal manera que sería muy difícil de implementar sin la JVM. Curiosamente, C #, comúnmente e incorrectamente, se supone que es más o menos equivalente a Java, ya se compila en código nativo en varias plataformas, incluido iOS.

¿Arriba de mi lista de Navidad? Una máquina del tiempo para regresar y agregar propiedades, manejo de excepciones reales y polimorfismo de TRABAJO real a C ++, y deshacerse de la basura de la sintaxis de flecha hacia arriba que el analizador puede descubrir por sí mismo. Escribí un preprocesador para esos 10 años Hace porque es una estupidez.

3Dave
fuente
¿Te refieres al acceso indirecto de miembros (como en h-> x)? Eliminar eso haría que los tipos de identificador y puntero inteligente fueran mucho menos útiles. Si argumenta cambiarlo solo por punteros en bruto, simplemente hizo que el lenguaje sea menos coherente.
Lars Viklund
1
¿Qué no funciona sobre el polimorfismo de C ++?
Casey
@LarsViklund sí, a eso me refiero. Pero, mientras que la dirección, la desreferencia y los operadores miembros (&, *, ::, -> ...) tienen significados diferentes, la mayoría de las veces es posible inferir el resultado drsjted del contexto. Las cosas podrían haberse simplificado por adelantado, como se hace en otros idiomas. Un punto de fricción menor, pero que tiene el potencial de aumentar la complejidad del código (y, por lo tanto, el tiempo y el costo del desarrollo).
3Dave