Soy nuevo en el desarrollo de juegos. Para aprender, estoy recreando este juego en la plataforma Android. Puedes ver el video del juego en el enlace de arriba. Es un juego simple.
He leído muchos artículos sobre cómo comenzar con el desarrollo de juegos. Casi todos recomendaron usar un bucle de juego en un hilo separado, lo que tiene sentido para otros juegos. Sin embargo, para este juego en particular, ¿necesito comenzar un hilo separado?
Respuestas:
Generalmente se recomienda un bucle de juego porque es simple . Casi cualquier juego puede desarrollarse y ejecutarse correctamente utilizando un bucle, y la mayoría de los juegos requerirían uno para funcionar correctamente.
Por ejemplo, la mayoría de los motores de física requieren actualizaciones constantes y confiables para una simulación adecuada. Las animaciones y otros contenidos dinámicos y gráficos deben actualizarse cada cambio, etc. También es algo que obtienes prácticamente gratis usando un bucle.
Ahora tenga en cuenta que su bucle no tiene que ejecutarse en un hilo separado. De hecho, la mayoría de los juegos ejecutarán el bucle en el hilo principal por simplicidad. Incluso mis proyectos de Android siguen este principio.
Ahora la pregunta real es ¿Qué alternativa se propone? Si tiene otra idea sobre cómo obtener entradas de manera confiable, hacer actualizaciones y dibujar marcos que funcionen para usted , ¡continúe! De lo contrario, un bucle de juego podría ser la forma más fácil de comenzar.
fuente
No , no se requiere un hilo separado. Si no estás haciendo nada demasiado intenso (que no parece ser el caso en el juego que nos has mostrado), todo se puede hacer en el hilo principal.
Se requiere un segundo subproceso si está procesando mucho o experimenta problemas con la interfaz de usuario / entrada que no responde. Por ejemplo, en juegos más complejos, no desea que la interfaz de usuario / entrada deje de responder cuando la IA está calculando su próximo movimiento. Dado que su juego parece estar respondiendo principalmente a la entrada del usuario y actualizar las imágenes, no se requiere un segundo hilo.
Respondiendo la pregunta original "Se requiere un bucle".
No , pero las alternativas son más complicadas, más difíciles de implementar y rara vez se usan.
Los juegos son, por definición, interactivos. Como mínimo, eso es esperar en la entrada y actualizar la salida. La forma más sencilla de hacerlo es con un bucle. No es necesario generar un nuevo hilo para eso.
Aunque el juego que ha mencionado parece simple, tiene imágenes y sonidos interactivos y actualiza constantemente aquellos basados en la entrada del usuario.
Tampoco hay muchas alternativas a un bucle de juego. Algún tipo de sistema basado en interrupciones podría ser posible. Sin embargo, tales sistemas aumentan la complejidad y reducen otros factores como el determinismo. Hay una razón por la que los bucles de juego son tan comunes, son fáciles de implementar, fáciles de entender, flexibles y hacen un gran trabajo.
fuente
Respuesta a la pregunta real (¿Debe un bucle de juego estar en un hilo separado?):
La razón por la que las personas a menudo recomiendan usar un hilo separado es porque no quieren que el procesamiento pesado interfiera con la interactividad de la interfaz de usuario. Eres el único que puede saber si se necesita un hilo separado para tu juego. Depende completamente del motor y el marco si el bucle principal del juego en su diseño actual puede interferir con el tiempo de respuesta de la interfaz de usuario. Pensé que generalmente asumes que no lo hará (en proyectos pequeños) a menos que tengas una razón para pensar lo contrario.
Otra razón para mantener el código en subprocesos separados es mantener el código modular y simple. Tener dos piezas de código no relacionadas mezcladas a menudo puede hacer que el código sea menos legible y mantenible a largo plazo.
¿Un bucle de juego debe ejecutarse en su propio hilo separado? Posiblemente. Si hay un problema con el tiempo de respuesta o el código y necesita varios elementos de la interfaz de usuario para responder, independientemente del procesamiento pesado, o simplemente desea dividir el código en tareas específicas que ocurren simultáneamente por razones de diseño, vaya con él. Sin embargo, se considera una práctica de programación avanzada .
Un ejemplo simple pero quizás no excelente para ilustrar es un juego de dos jugadores. Es posible que desee ejecutar dos instancias de una clase que maneja la entrada del usuario y la convierte en cambios de estado en la instancia del personaje del jugador.
Algunos marcos lo alientan / requieren que utilice un sistema basado en eventos / interrupciones como lo hace ActionScript3.0. En esos casos, el código de bucle normalmente irá al
OnEnterFrame
evento o algo similar que ocurre de 20 a 60 o 120 veces por segundo.Respuesta a la pregunta original (¿Necesito un bucle principal?):
Todo se reduce al contador del programa . Si está creando un juego que se ejecutará más de una cantidad de tiempo predeterminada y no generará código a medida que avanza , deberá solicitar amablemente a la PC de su usuario que repita algunas instrucciones que ya ha procesado y lo que posiblemente cambie en el mientras tanto es el estado (los valores almacenados en los objetos y globales del juego).
Como sabe que deberá repetir las instrucciones, hay varias formas de completar esta tarea y procesar continuamente las mismas instrucciones. Todos estos métodos implican mover el contador del programa nuevamente a la instrucción actualmente relevante. Las declaraciones de flujo de control más comunes que hacen que se repita el código se llaman bucles, otra es la
goto
declaración que rara vez se usa en el código moderno y tiene un efecto similar en este caso (completamente no relevante para usted).Entonces, para responder a su pregunta anterior, ¿necesita un bucle? Si tu puedes.
fuente
Solo para agregar a las respuestas de otros aquí, algo que nadie ha mencionado explícitamente: si se arriesga a ejecutar su ciclo de juego en un segundo hilo y deja de responder, corre el riesgo de que el sistema operativo finalice su aplicación. Es por eso que se recomienda usar un hilo separado. Por lo tanto (por ejemplo) los NDK
native_app_glue.c
/.h
genera un hilo separado para su bucle.fuente