Cerrado . Esta pregunta está
basada en opiniones . Actualmente no acepta respuestas.
Comentarios
Responder
Sin embargo, ¿escribir un motor de juego completo en C no sería razonable hoy en día?
Es razonable, pero la La pregunta es ¿qué le compra? Probablemente no necesite la portabilidad extrema que ofrece C, y es una pena renunciar a todas las funciones que ofrece C ++ a menos que esté realmente en contra de ella.
¿Cuáles son, si las hay, algunas de las ventajas que tiene C sobre C ++?
¿Mejor tiempo de compilación?
¿Por qué alguien posaría ¿Es posible que desee utilizar C sobre C ++?
Creo que es principalmente una elección estética. A muchas personas les gusta C porque es simple y minimalista y se siente limpio. C ++ tiene muchas características agradables (los espacios de nombres por sí solos hacen que valga la pena usarlo), pero también es grande y complicado.
Comentarios
Respuesta
He trabajado mucho con un motor de juego puro-C que ha enviado varios productos, por lo que es absolutamente posible. Aquí está mi experiencia personal trabajando en ambos motores C vs C ++:
- El uso de estructuras en C puro le permite aprovechar el conocimiento sobre la alineación de estructuras, y luego puede usar esta información para construir sus capas de persistencia y serialización de objetos. El motor con el que trabajé tenía algunos analizadores de encabezado simples que creaban automáticamente estos metadatos sobre estructuras, y hacía que ciertos tipos de operaciones de datos fueran triviales. Analizar archivos de encabezado C ++ arbitrarios es esencialmente imposible, y tan pronto a medida que agrega herencia y funciones virtuales, pierde la capacidad de saber exactamente dónde están las cosas en la memoria
- El tiempo de compilación es significativamente más corto porque puede mantener sus archivos de encabezado muy compactos y aprovechar las declaraciones de estructuras hacia adelante.
- La depuración se puede mejorar porque sin el uso de plantillas y la herencia es muy fácil averiguar exactamente qué es un determinado objeto y qué está haciendo.
Todos estos beneficios también podrían lograrse con la misma facilidad usando código c ++ restringido que se abstiene de usar plantillas y herencia en objetos serializados, pero fue decisión del CTO que sería más fácil para reforzar la simplicidad si los elementos más confusos de C ++ no estuvieran disponibles.
Personalmente, creo que esto fue un poco extremo, ya que realmente extrañaba la capacidad de declarar de forma sensata las variables en bucles for y los muchos usos completamente legítimos de herencia. Pero, realmente no nos costó mucha productividad al final considerando todas las cosas
Comentarios
Respuesta
Estoy reescribiendo un motor de juego 2D escrito en C ++ y Lua en C y Lua. Hasta ahora la experiencia ha sido bastante buena. Obviamente, hacer operaciones matriciales y vectoriales no resultan tan agradables en C. Pero aparte de eso, he encontrado la experiencia bastante refrescante después de pasar más de 10 años como desarrollador de C ++.
C tiene una serie de ventajas sobre C ++:
- El compilador se asegurará de que no se ejecute ningún código en el tiempo de inicialización estática. Eso hace que sea completamente seguro asignar datos globales estáticamente como cadenas utilizadas como claves, por ejemplo,
- Transparencia. En C, asignar o asignar o definir una variable no va a provocar que se ejecute una gran cantidad de código. C ++ generará automáticamente constructores de copia para que tenga menos control sobre lo que se ejecuta al realizar la asignación.
- Mucha depuración puede ser más fácil debido a que no se alteran los nombres de las funciones
- Es generalmente está bien usar memcpy en C, pero fácilmente causará problemas en C ++, porque los constructores de copia no se ejecutarán. eso t memcpy es mucho más rápido que std :: copy eso es importante.
Aparte de eso, hay una serie de ventajas al adoptar la forma de pensar de C. En C ++ a menudo me encuentro haciendo las cosas un poco demasiado generalizadas y abstractas. En C, por lo general, elimino cosas como métodos get-set y, a menudo, preasigno matrices de tamaño fijo en lugar de usar matrices dinámicas. A menudo termino con un código más corto y más fácil de depurar en C. Las estructuras de datos suelen ser más planas y más fáciles de ver en un depurador.
Para ser justos, nunca haría una aplicación exclusivamente en C. La razón funciona que lo combino con un lenguaje de nivel superior como Lua que puede complementar C muy bien, donde C no es tan fuerte.
Id software escribe la mayoría de sus motores en CI, creo, puedes mirar Regreso al castillo de Wolfenstein que fue escrito en C.
Escribí sobre mi experiencia en escalabilidad de C vs C ++ y desventajas del vector STL en comparación con las matrices simples.
Comentarios
Respuesta
Como alguien más señaló, C ++ trae la ventaja de tener grandes hombros sobre los que puede pararse (BOOST, STL, etc.). Al final, es una elección personal, pero elegiría C ++ debido a los recursos disponibles. Si hay funciones en C ++ que no desea utilizar, no las utilice.
Comentarios
Responder
No » No creo que nadie use C exclusivamente en estos días, normalmente se mezcla con un lenguaje de nivel superior.
La programación en C tiene algunos beneficios sobre, digamos, la programación en C ++. C ++ puede hacer muchas cosas bajo el capó que son invisibles para el usuario, lo que puede dañar el rendimiento si no se tiene cuidado. C ++ puede también ser terrible cuando se trata de el uso de caché, que de nuevo puede perjudicar su rendimiento.
Por lo tanto, puede traer algunos beneficios escribir las partes críticas del rendimiento de un juego de una manera similar a C, en lugar de una forma tradicional de C ++. Sin embargo, nunca escuché de nadie, en los últimos años, que haya escrito un juego completo en C.
En algunas plataformas, como el iPhone, el uso de C ++ puede aumentar el tamaño de su ejecutable con una cierta cantidad de kilobytes (olvidé cómo mucho, lo siento), que es una de las razones por las que algunos desarrolladores de iPhone eligen escribir su código en una combinación de C y Objective-C.
Respuesta
Te daré un par de razones más por las que no sería razonable escribir un motor de juego en C en lugar de C ++ hoy: STL y BOOST.
No puedo imaginar cómo sería vale la pena escribir otro list
impleme ntación en la que podría confiar en un código que funciona fuera de la caja (¡y que no tiene que escribir!)
Comentarios
Respuesta
Escribir un motor de juego en C es razonable. Es rápido y se puede migrar a varios sistemas. Por ejemplo, podría usarlo para Android (con el uso del NDK). Podría usarlo para el iPhone (Objective c es solo una extensión de c). También podría usar para y del sistema operativo principal como Linux, Mac o Windows. Si se siente cómodo con c, le sugiero que lo pruebe.
Respuesta
Por supuesto que es razonable. Yo personalmente no lo haría, y la mayoría de los fanáticos de C que conozco en realidad simplemente escriben código similar a C en archivos .cpp. Pero los lenguajes son lo suficientemente similares a donde realmente no importa.
En cuanto a por qué alguien elegiría hacer esto, creo que se debe principalmente a la filosofía anti-C ++. Personalmente, todavía no creo que esta sea una buena razón para elegir C en lugar de «C ++ estilo C». La locura de typedef struct es una razón suficientemente buena para mantenerse alejado de C, y hay muchas otras.
Desafortunadamente, C y C ++ son lenguajes bastante terribles cuando nos ponemos manos a la obra. Ésa es una de las razones por las que la gente ha intentado hacer mucho de su código en un script en los últimos años.
Si está buscando ejemplos de personas que trabajan en C, puede ignorar id, ya que recuerdo haber leído que abandonaron C hace mucho tiempo. Sin embargo, Cryptic Studios (Star Trek Online) hace todo el desarrollo de su motor en C. Por lo que puedo decir, sí, se debe más a la filosofía que a una ventaja tangible.
Respuesta
Sí y no. Sí, lo he hecho hace unos años, pero necesitaba que mi juego se ejecutara en 3D en un servidor remoto Unix (no Linux) de 64 bits con los jugadores en terminales tontos. No era trivial. C puede ser bueno es desea integrar LUA pero finalmente logré que lua trabaje en C ++, así que diría que sí, es posible, pero no lo haga.
Respuesta
¿Una posible buena respuesta puede ser» usar ambos «?
Como escuché que los proyectos panda3d podrían optimizarse, eliminando los cuellos de botella usando algo de cython o recodificando esas partes.
La mayoría de las veces, las partes que necesitan ser optimizadas son las partes con muchas iteraciones y anidamiento o con mucha computación numérica, así que mi (salvaje) conjetura es que un compromiso justo sería usar ambos lenguajes , usando C para partes que incluyen mucha programación de bajo nivel, por lo que no puede hacer y mal uso del lenguaje C ++ para la parte que necesita velocidad, y C ++ para el resto del juego.
Lo ideal es que hagas la parte rápida del motor teniendo en cuenta el alto nivel y luego uses un lenguaje de secuencias de comandos o C ++ que usará mucho menos nidos / bucles.
Por supuesto, nunca podrías crear un motor que se ajustara a todos los juegos que los desarrolladores necesitarían hacer, excepto si dedicas tu motor a un tipo de juego …
Pero no des por sentado mi consejo, ya que no soy un desarrollador de juegos experimentado ni un desarrollador experimentado … Creo que C te obliga a escribir código rápido mientras escribes El código C ++ bueno y rápido para un proyecto tan grande como un juego es algo diferente …
Respuesta
C funcionó para John Carmack , es posible que obtenga muchas ventajas al usar C, pero hasta que logre beneficiarse de ellas, puede que le lleve un tiempo.
Aquí puedes encontrar una lista de motores de juegos algunos de Si están escritos en C, tal vez puedas obtener algunas ideas sobre cómo hacer un motor de juego en C revisando su código fuente.
Respuesta
El código C normalmente es código C ++ válido.
Los principales problemas con C ++ son su uso incorrecto ( Linus Torvalds lo odia por esta razón , también tuvo algunos otros problemas con la portabilidad de la biblioteca y así sucesivamente, pero está trabajando a nivel de sistemas operativos y tiene que poder ejecutar cosas en todos los chips aleatorios que existen).
Por ejemplo casi no hay ventaja en usar una matriz cstyle [] sobre un c ++ std :: vector <> (o un contenedor similar).
Los vectores son de tipo seguro y se pueden verificar los límites (puede acceder a los elementos usando get () o [], incluso si no usa el método de verificación de matriz, aún puede consultar el tamaño en lugar de cargarlo con el puntero).
Pero los vectores pueden ser más lentos si, por ejemplo, no declara el tamaño predeterminado en el constructor. Además, agregar cosas a un vector puede causar ralentizaciones si luego necesita un cambio de tamaño. C ++ 11 también agrega muchas ventajas, como la inicialización uniforme (ahora puede declarar e inicializar vectores usando la misma sintaxis) y hay constructores de movimiento que pueden permitirle evitar la copia. Incluso puedes crear tus propios inicializadores personalizados (si por alguna razón quisieras hacer algo más que usar malloc).
Por supuesto, si necesitas cambiar el tamaño de las cosas, entonces los vectores son aún más fáciles de hacer con , no tienes que perder el tiempo con malloc, copiar cosas manualmente, etc.
C ++ te da código orientado a objetos. Cuando se compila, será igual de eficiente ya que en realidad es simplemente una abstracción para humanos que trabajan con el código. Aunque cosas como los constructores pueden ralentizar la creación de objetos. Pero necesitará que el constructor establezca los valores predeterminados o, de lo contrario, puede inicializar los objetos sin usar el constructor (dejando de lado las () «s ).
Pero la orientación a objetos hace que programar juegos mucho sea más fácil. Los juegos suelen tratar con objetos.