¿Cómo debo escribir un bucle principal del juego? [cerrado]

130

¿Cómo debo escribir un bucle principal del juego? ¿Qué cosas debes hacer en el ciclo del juego y qué cosas no debes hacer en el ciclo del juego?

He escrito muchos de ellos, pero nunca he leído sobre bucles de juego. Estoy seguro de que podría mejorarlos considerablemente, pero no estoy seguro de cómo.

Hokiecsgrad
fuente
44
Mala respuesta: ¿Qué hay de usar el motor de alguien para hacer este bucle por ti? :)
user712092
puede preguntarle al usuario el número total de tramas que desea ejecutar y usar un bucle for hasta n veces la cantidad de buffers.
Uğur Gümüşhan

Respuestas:

121

El bucle principal del juego maneja tres tareas principales:

  1. Obtener entrada del usuario
  2. Actualiza el estado del juego
  3. Dibujar el juego

Un bucle de juego simple simplemente combina estas tres tareas en un bucle while. Esto tiene algunos resultados no deseados:

  1. El juego se ejecuta a diferentes velocidades en diferentes computadoras.
  2. CPU (puede ser innecesariamente) vinculada al 100% de uso.
  3. "Estados de juego" / menús faltan o se mezclan con el código del juego.
  4. El ciclo principal del juego es muy largo y difícil de mantener.
  5. El código es difícil de extender / portar a otras plataformas.

Los bucles avanzados para juegos abordan los problemas enumerados anteriormente. Aquí hay algunos artículos útiles:

Para un excelente ejemplo de bucle de juego, eche un vistazo al juego demo de Allegro skater:

  • El código del bucle del juego está en framework.c .
  • Explore el código fuente completo aquí .

Los bucles de juego a menudo hacen el mismo tipo de trabajo para la mayoría de los juegos, por lo que he estado pensando en una forma de crear un marco de juego generalizado. Es mejor escribir una implementación de un bucle de juego y compartirla entre juegos. Ahorra trabajo al crear un nuevo juego, y todos los juegos pueden compartir mejoras en el bucle de juego compartido (por ejemplo, agregando un contador FPS o una función de captura de pantalla).

Leftium
fuente
1
Sí, como se sospecha, definitivamente puedo hacer mejoras. Buenas lecturas Además, gracias por publicar el código. Es genial ver el código real del juego con estas cosas.
hokiecsgrad
1
La CPU debe estar atascada al 100% de uso (o más como 50% si tiene al menos 2 núcleos). Piénsalo. ¿Cómo va a obtener una física de vanguardia, gráficos impresionantes, si está sentado allí diciéndose a sí mismo "Oh, pero no quiero usar toda la CPU". Sí, debe usar el 100% de la CPU si es posible (eso significa multiproceso en las computadoras actuales, por lo que es muy difícil usar el 100% de 4 núcleos todo el tiempo). Aproveche al máximo la máquina en la que está ejecutando que puede.
bobobobo
55
Permitirme agregar: para programas de escritorio . En un dispositivo portátil, quemará mucha más batería, por lo que se preocuparía por el uso del 100%.
bobobobo
1
@ user6003859: arreglé el enlace.
Leftium
1
otro enlace útil: gameprogrammingpatterns.com/game-loop.html
brita_
51

Recomiendo el artículo de Glenn Fiedler sobre la robusta independencia de la velocidad de fotogramas, " Fix Your Timestep! "

(Menos relevante para el tema en cuestión, pero los otros artículos de la serie también son bastante buenos, ¡como lo es todo en su sitio!)

Neverender
fuente
Esos son definitivamente algunos artículos realmente buenos. ¡Gracias por publicar!
hokiecsgrad
1
Secundo la recomendación de tener una implementación independiente de framerate robusta. Todo en tu juego debe implementarse como un valor delta que actualizas periódicamente. Y eso no debe hacerse necesariamente al mismo tiempo que avanzas al siguiente cuadro. De hecho, si ha omitido un marco, probablemente no quiera simplemente llamar a sus métodos de actualización con un delta 2x. Sería más consistente llamar a su actualización dos veces con el mismo delta. Definitivamente tómese el tiempo para aprender los problemas con su velocidad de cuadros y su ciclo de actualización. Te ahorrará tiempo más tarde.
Dennis Munsie