En primer lugar, me gustaría tener una respuesta real, siempre estoy tratando de obtener más de varias fuentes y artículos, y cuando leo cosas como C ++ es lento porque tiene funciones virtuales y debido a esto C es mejor , realmente No sé qué decir y pensar como un ser humano con cerebro. Por lo tanto, evite alcanzar este nivel en sus respuestas.
Mi pregunta es sobre un cambio masivo a C ++ que se completó, más o menos, con Doom 3.
Lo interesante para mí es que antes de este hito, la mayoría de los motores de juego y los juegos en sí estaban escritos en C, al igual que desde la era Quake . También es interesante notar que el software de identificación decide reescribir completamente la base de código para IdTech 4 en C ++, una gran cantidad de trabajo que honestamente no puedo entender sin una lista realmente buena de razones.
Me estoy centrando en Doom 3 porque estoy principalmente interesado en el mundo OpenGL y en mi viaje trato de mantenerme enfocado en este tema, así que leí mucho sobre esto, pero creo que una pregunta como esa puede ser render-API -gnóstico sin demasiados problemas.
¿Por qué en cierto momento la industria cambió masivamente a C ++? ¿Cuáles son los motivos de la elección que hizo esa identificación?
Lo último que me gustaría decir es que el lenguaje C es mucho más simple de implementar y proporciona una menor cantidad de características, debido a esto tiene muchas menos posibilidades de ser "fragmentado" en partes, a diferencia de lo que realmente hace C ++. En términos más simples, tengo muchas más posibilidades de encontrar un compilador de C realmente bueno en lugar de un buen compilador de C ++ con todas las características implementadas de una buena manera.
Por ejemplo, el NDK para Android todavía no tiene un buen soporte de C ++ (con la versión r8b) con todas las características más recientes y excelentes, ¡y es el kit de herramientas nativo para el sistema operativo móvil más popular del mundo!
Si hubiera escrito mi código en un C ++ moderno, probablemente me dolería ahora porque uno de los sistemas operativos más populares del mundo estaría fuera de mi alcance. Y como Android, muchos otros compiladores no son tan buenos.
¿Debo escribir código C ++ que se refiera a una versión C ++ que tenga una versión 2-3?
Respuestas:
C ++ hace todo lo que C hace. Puede mezclar trivialmente C y C ++ en los casos en que las ventajas de C superan a las de C ++. Esta es una decisión de diseño muy intencional de C ++.
C ++ hace cosas que C no hace. Esto incluye un polimorfismo fácil, pero también una generación fácil de código de tiempo de compilación a través de plantillas. Esto es realmente útil para cosas como los contenedores, que son fácilmente la mayor debilidad de C. También permite tipos similares a punteros definidos por el usuario (asas inteligentes) que ahorran mucho tiempo, así como tipos primitivos definidos por el usuario, como vectores y matrices con soporte del operador (también ahorra mucho tiempo).
Las funciones virtuales son más lentas que las no virtuales. Sin embargo, debe optar por las funciones virtuales, y un programador competente lo hace solo cuando son beneficiosas. Los programadores de C tienen punteros de función y a menudo almacenan colecciones de aquellos en estructuras a las que hacen referencia otras estructuras; en otras palabras, realizan un trabajo adicional para recrear exactamente lo mismo que las tablas de funciones virtuales. En los casos en que solo se necesita un puntero de función y no se requiere una tabla, C ++ todavía lo permite completamente y es equivalente a C. Con un compilador moderno, C ++ es solo más lento que C en los casos específicos en que el programador está optando por una función . Además, la sobrecarga de la función virtual en la práctica es muy pequeña en las CPU de módem. El hardware actual está diseñado para los patrones de uso de C ++, y está cada vez más diseñado para las necesidades de idiomas interpretados de alto nivel.
Las excepciones de C ++ históricamente imponen una gran sobrecarga, haciendo que C ++ sea más lento incluso si no las está utilizando. Las excepciones fueron algo terrible para agregar a C ++, si no por otra razón que el inmenso aumento en la complejidad involucrada en la escritura de código seguro de excepción, y de hecho, algunos diseños de contenedores son literalmente imposibles de hacer que la excepción sea segura. Los programadores de juegos a menudo ignoran la existencia de excepciones e incluso las deshabilitan en el compilador. Los compiladores modernos tienen excepciones de gastos generales cero (es decir, solo paga el costo cuando realmente los usa).
C es más simple de aprender todas las reglas de. C ++ es un lenguaje muy grande y complejo. C ++ permite escribir código de nivel superior, produciendo API más fáciles y simples. Algunas personas quieren entender el idioma más fácilmente, algunas personas quieren escribir código avanzado más fácilmente. Es una compensación entre la simplicidad de comprender lo que el compilador está haciendo con un código específico frente a la simplicidad de escribir grandes aplicaciones complejas interconectadas. Algunas personas valoran una mucho más que la otra, por varias razones.
Al final, C ++ es un superconjunto de C. En mi opinión, no existe un programador de C ++ altamente competente que no sea también un programador de C pasable (aunque hay muchos programadores de C ++ que caen por debajo de mi barra que lo harían). perderse en puro C). Si bien C ++ agrega funciones para aislar al programador de gran parte de C, el código C ++ no trivial a menudo necesita usar C para hacer las cosas. Esta es una de las principales diferencias entre C ++ y Java y C #. Hay una razón por la que a menudo ves "C / C ++" agrupados, después de todo.
Mi creencia personal, que se comparte con la mayoría de los otros profesionales de la industria de los juegos con los que he interactuado, es que la mayor expresividad y las instalaciones de programación de alto nivel de C ++ superan la mayor complejidad del lenguaje sobre C, y la mayoría de los otros frecuentes Las afirmaciones anti-C ++ realizadas simplemente están desactualizadas con la tecnología actual.
fuente
Id Software no es "la industria". Son una sola compañía. Si bien pueden ser influyentes, no son todos.
He trabajado en un par de motores de juegos que datan de 1999, y usaron C ++.
Las razones principales para la adopción de C ++ "en ese momento" son:
Fue estandarizado . C ++ 98 se llama así porque fue lanzado como un estándar ISO en 1998. Hasta entonces, había múltiples dialectos de C ++ sin una idea clara de cuál era "real" o "correcto". Una vez que se estandarizó, y los compiladores comenzaron a implementar el estándar, los desarrolladores de juegos podían confiar en el estándar real.
Recuerde el viejo chiste: un tipo entra en el consultorio de un médico y dice: "Me duele cuando levanto el brazo así". Entonces el médico dice: "Así que no levantes el brazo así".
Si las funciones virtuales son lentas para sus necesidades, C ++ no lo obliga a usarlas. Todo en C ++ es opcional. Usted elige usar cada característica particular. Si tiene un código de rendimiento crítico y no desea una sobrecarga virtual, no use funciones virtuales. Al igual que si está en código de rendimiento crítico en C, no utiliza punteros de función.
De hecho, esto llevó a que muchos juegos de C ++ no fueran C ++ idiomáticos (al menos, no C ++ idiomáticos modernos ), sino simplemente "C con clases". Y esta es una forma perfectamente funcional de programar C ++. Demonios, solo poder no tener que escribir
typedef struct
cuando creas un nuevo tipo es un beneficio.C ++ es una gran bolsa de características, y puedes elegir cuáles quieres.
¿Tu punto es? Google apenas tolera a las personas que usan NDK; Está claro que quieren que todos usen Java. La única razón por la que existe NDK es porque hay ciertos desarrolladores importantes que simplemente no usarán la plataforma sin ella. Por lo tanto, NDK existe para atenderlos y sus necesidades de características.
Sí, C ++ es una especificación más grande y complicada de implementar. Así es Java. Así es cualquier idioma, excepto C.
Además, ¿a qué te refieres con "todas las últimas y mejores características"? Si estás hablando de cosas de C ++ 11, bueno, nadie lo implementa completamente todavía. La especificación apenas tiene un año. Además, tampoco sé si NDK admite C11; sí, C también tiene "las mejores y más recientes funciones" que no son compatibles en todas partes.
Lo que trae a colación un punto importante: si desea que su aplicación Pure-C se compile en Visual Studio, entonces debe ajustarse a C89, y nada más que eso. Entonces la fragmentación con C ya existe. Algunas plataformas solo admiten C89. Algunos admiten C99. Algunos admiten C11, en diversos grados. Etc.
Si desea utilizar C, a continuación, utilizar C . El hecho de que otras personas no hayan hecho esa elección no significa que su elección sea incorrecta o que su elección sea incorrecta. No necesitas justificarte ante ellos, y ellos no necesitan justificarse ante ti.
fuente
Ha sido común que reescriban prácticamente todo el motor para cada lanzamiento (al menos hasta hace poco, no sé mucho sobre los últimos juegos), y dado que C ++ está creciendo en popularidad, tiene sentido usar eso en lugar de pegarse con C. Con el tiempo, cada vez menos personas serán competentes con C.
Porque le brinda una gran cantidad de funcionalidades de alto nivel y es casi totalmente compatible con el código C.
Google habría respondido esto por usted: http://fabiensanglard.net/doom3/interviews.php
"... la mitad de los programadores realmente tenían antecedentes de C ++ al principio. Tenía antecedentes de C y Objective-C, y me" deslice en C ++ "simplemente mirando el código que escribían los chicos de C ++. En retrospectiva, yo Ojalá hubiera presupuestado el tiempo para investigar y explorar a fondo el lenguaje antes de comenzar a usarlo.
Es posible que aún pueda darse cuenta de que el código de renderizador se desarrolló en gran medida en C, y luego se desarrolló en C ++.
Hoy, creo firmemente que C ++ es el lenguaje adecuado para proyectos grandes de múltiples desarrolladores con requisitos críticos de rendimiento, y Tech 5 está mucho mejor para la experiencia de Doom 3 ".
¿Por qué te importa esto? No te quedes atrapado persiguiendo lo más nuevo. Si fue lo suficientemente bueno hace 5 años, no habrá empeorado de repente ahora.
fuente
Bueno, C ++ ha estado fuera desde los años 80, por lo que si un compilador no lo admite, tal vez debería usar un compilador diferente. Y también, C ++ no es realmente mucho más lento que C. Realmente es más lento si lo carga con funciones virtuales y otras abstracciones. Sin embargo, C ++ se usa mucho hoy en día en el mundo no Unix debido a su flexibilidad y nuevas características que C no tiene. Escribir código modular en C ++ es mucho más fácil que hacerlo en C y le ayuda a escribir más código portátil. Volviendo al tema de los compiladores, no conozco ningún compilador que no admita C ++ (tal vez no C ++ 11 por completo, pero cualquier compilador medio decente debería admitir C ++).
fuente