2009-05-07 11 views
9

¿En qué medida son modernas C++ características como:modernos C++ juego Ejemplos de programación

  1. polimorfismo,
  2. STL,
  3. excepción de seguridad/manejo,
  4. plantillas con diseño de clase basada en políticas,
  5. punteros inteligentes
  6. nuevo/eliminar, colocación nueva/eliminar

utilizado en estudios de juegos? Me interesaría saber los nombres de las bibliotecas y las características de C++ que usan. Por ejemplo, Orge3D usa todas las funciones modernas de C++, incluidas excepciones y punteros inteligentes. En otras palabras, si estuviera buscando un ejemplo para una biblioteca de juegos usando C++ moderno, iría a Orge3D. Pero no sé si estas características impiden que los estudios de juegos utilicen Orge3D.

Además, no sé si hay otros ejemplos. Por ejemplo, utilicé Box2D algún tiempo antes brevemente, pero usa solo ubicación nueva y palabra clave de clase como las características de C++. Incluso la encapsulación se rompe en estas clases ya que todos los miembros son públicos.

Idealmente, si las características de C++ fueran las mejores para todas las situaciones, se usarían con mayor frecuencia. Pero parece que no. ¿Cuáles son las impedancias? El obvio es tener que leer montones de libros, pero eso es solo una razón. Esta pregunta es un seguimiento en "C++ for Game Programming - Love or Distrust?" (A partir de las respuestas me dio la impresión de que muchas características de C++ aún no se utilizan en los juegos, que no es necesariamente la forma en que debería ser).

+0

Una pregunta relacionada es ejemplos de una biblioteca que usa el moderno C++: stackoverflow.com/questions/534311/.... Además de los ejemplos habituales de Boost y Loki, la discusión menciona las bibliotecas de Google Chrome, OpenOffice y Adobe. Ver también http://www.boost.org/users/uses_open.html para los usos de boost. –

+0

Google buscando Encontré http://www.deitel.com/ResourceCenters/Programming/CPlusPlusGameProgramming/tabid/1225/Default.aspx Contiene un par de enlaces que pueden interesarle. P.S. Es posible que desee hacer esta pregunta wiki de la comunidad. – lothar

+0

@lothar No sé si hay una forma de convertirlo en una wiki de la comunidad ahora. –

Respuesta

25

He trabajado en 2 compañías de juegos, he visto varias bases de códigos y observé una serie de debates sobre asuntos como estos entre desarrolladores de juegos, por lo que podría ofrecer algunas observaciones. La respuesta corta para cada punto es que varía mucho de un estudio a otro o incluso de un equipo a otro dentro del mismo estudio. respuestas largas enumeran a continuación:

  • polimorfismo,

Se utiliza en algunos estudios pero no en otros. Muchos equipos aún prefieren evitarlo. Las llamadas a funciones virtuales tienen un costo y ese costo es notable incluso en las consolas modernas. De los que usan polimorfismo, mi suposición cínica es que solo un pequeño porcentaje lo usa bien.

  • STL,

dividido por la mitad, para muchas de las mismas razones que el polimorfismo. STL es fácil de usar de manera incorrecta, por lo que muchos estudios eligen evitarlo por este motivo. De aquellos que lo usan mucho, muchas personas lo asocian con asignadores personalizados. EA ha creado EASTL, que resuelve muchas de las causas de STL en el desarrollo de juegos.

  • seguridad excepción/manipulación,

Muy pocos estudios utilizan el manejo de excepciones. Una de las primeras recomendaciones para las consolas modernas es apagar tanto el RTTI como las excepciones. Los juegos de PC probablemente usan excepciones para un efecto mucho mayor, pero entre los estudios de consola las excepciones son rechazadas con mucha frecuencia. Aumentan el tamaño del código, que puede ser escaso y, literalmente, no es compatible con algunas plataformas relevantes.

  • plantillas con diseño de clase basada en políticas, diseño

basado Política ... no he encontrado nada de eso. Las plantillas se utilizan con bastante frecuencia para cosas como introspección/reflexión y reutilización de código. El diseño basado en políticas, cuando leí el libro de Alexandrescu, me pareció una promesa errónea. Dudo que se use mucho en la industria del juego, pero variará mucho de un estudio a otro.

  • punteros inteligentes

punteros inteligentes son abrazados por muchos de los estudios que también utilizan polimorfismo y STL. La administración de la memoria en los juegos de consola es extremadamente importante, por lo que a mucha gente no le gusta el recuento de referencias punteros inteligentes porque no son explícitos sobre cuándo son gratuitos ... pero estos no son ciertamente el único tipo de puntero inteligente. La idea del puntero inteligente en general aún está ganando tracción. Creo que será mucho más común en 2-3 años.

  • nueva/borrar, colocación de nuevos/borrar

Estos se utilizan con frecuencia. Con frecuencia se anulan para usar asignadores personalizados debajo, de modo que la memoria se pueda rastrear y las fugas se puedan encontrar con facilidad.

Creo que estoy de acuerdo con su conclusión. C++ no se usa en los estudios de juegos tanto como podría.Hay buenas y malas razones para esto. Los buenos son debido a las implicaciones de rendimiento o problemas de memoria, los malos son porque las personas están atrapadas en una rutina. En muchos sentidos, tiene sentido hacer las cosas de la manera en que siempre se han hecho, y si eso significa C con C++ limitado, entonces significa C con C++ limitado. Pero hay una serie de sesgos anti-C++ flotando alrededor ... algunos justificados y otros no.

10
  1. Bastante ampliamente, aunque las personas son conscientes de la sobrecarga de llamadas de función virtual
  2. Depende. Algunos desarrolladores lo descartan por completo, otros hacen un uso limitado de contenedores como vectores que tendrán buena coherencia de memoria caché y rendimiento en el tiempo de ejecución y no se asignarán constantemente. Creo que una observación general sería que cuanto más orientado a la consola sea el estudio menos usarán STL. Los desarrolladores de PC pueden salirse con la suya porque pueden recurrir al sistema de memoria virtual y hay un montón de CPU. Los chicos de la consola se preocupan por cada asignación y si está haciendo un título multiplataforma, se adentra en el maravilloso mundo de las implementaciones de STL de distintas plataformas comportándose de manera diferente y teniendo diferentes errores, aunque esta situación ciertamente ha mejorado en los últimos años. A los desarrolladores de juegos también les gusta administrar sus propios montones y asignaciones, y esto puede ser difícil de manejar con STL.
  3. Espere que esté deshabilitado en la configuración del compilador
  4. Haha, buena.
  5. No estoy seguro. Realmente no he visto el uso del puntero inteligente en el código del juego, aunque aparte de una aversión general a la memoria dinámica, no creo que haya nada particularmente objetable sobre los indicadores inteligentes desde el punto de vista del desarrollo del juego.
  6. Depende nuevamente. Los chicos de PC pueden asignar y desasignar como si simplemente no les importara. Los chicos de la consola se preocupan por cada asignación. Eso no significa que no sea nuevo y elimine, pero puede significar que las asignaciones dinámicas solo se realizan una vez cuando se configura el juego o el nivel actual y luego se deja hasta que se derribe el juego o el nivel actual. Es mejor evitar la asignación y la desasignación por cuadro, no solo para mantener el uso de la memoria total bajo, sino también para evitar la fragmentación. Verás muchas matrices de tamaño fijo y estructuras asignadas estáticamente en un motor de juegos de consola.
+0

# 2: el STL le permite controlar completamente la administración de memoria de cualquier contenedor # 4: ¿Por qué? –

+0

El enlace que Dan publicó en el documento EASTL tiene una buena cobertura de este tema. –

+0

No entiendo tu respuesta al # 4. – Klaim

7
  1. porciones
  2. manera a mucha. Pero estamos tratando de limitarnos a std :: vector en tiempo de ejecución.
  3. Ninguno que nunca.
  4. ¿Qué?
  5. Nuestro código ha sido infectado por esta enfermedad, sí. Empezaremos azotando a las personas por propagar el flagelo sin embargo.
  6. Sí. Un montón.
+2

No sé por qué esta respuesta ha sido rechazada. Parece una respuesta honesta (puede que no sea "correcta", si lo desea) y votaré por ella. –

+0

Iba a escribir eso yo mismo ... Es una respuesta real que representa el estado actual en el que trabajo. Gracias por el voto :) – JJacobsson

-1

Con todo el respeto, 5 de los 6 puntos que ha mencionado son jerga estándar de C++. Eso no es "programación de juegos", es el uso ingenuo de las palabras de moda. Mi recomendación sería esta; aprende tus matemáticas ... trigonometría especialmente. A continuación, obtenga algunas hojas de datos y aprenda sobre las plataformas de hardware de gráficos modernos ... no las palabras fingidas de C# conmovedoras ... aprenda la programación de ensamblador.

Al final del día, para ser un programador de juegos tienes que ser capaz de hacer matemáticas. Eso es todo

+1

Esta no es una respuesta útil sin detalles, y con demasiada reprensión del cartel. – bcr

Cuestiones relacionadas