¿Es obligatorio un hilo separado para el bucle de juego para juegos simples?

10

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?

jin
fuente
No estoy seguro de que esto sea un duplicado, ya que se trata de Android. Hay algunas otras consideraciones sobre el subprocesamiento en una plataforma basada en Java que son diferentes a esa pregunta.
Sean Middleditch

Respuestas:

8

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
La alternativa que estoy pensando es actualizar la pantalla usando el hilo principal en sí mismo, ya que todas las acciones están en serie: el jugador desliza las bolas del mismo color, luego desaparecen todas las bolas tocadas, las bolas restantes caen bajo la gravedad junto con las bolas de reemplazo.
jin
¿Entonces no está preguntando si se requiere un bucle? Su principal preocupación es si tiene que estar en un hilo separado, ¿correcto?
AturSams
1
correcto. Mi pregunta es sobre el hilo, no el bucle. para un juego tan simple (aunque tendré suerte de poder hacer un juego así) ¿necesito generar un nuevo hilo o todo se puede hacer en el hilo principal?
jin
1
No, no es necesario. Mientras tenga un bucle , no es necesario crear un segundo bucle .
@jin realmente deberías cambiar el título y cómo escribir tu pregunta entonces.
vallentin
5

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.

MichaelHouse
fuente
La única vez que encontré interrupciones de nivel inferior fue cuando se realizó una determinada tarea HW y la CPU / OS necesitaba ser notificada para que pudieran procesarla correctamente (leer los datos del disco en la memoria y luego recibir una notificación de que está lista para que podamos regresar control de la aplicación y permitir que la procese), así que no sé a qué te refieres y simplemente la malinterpreté.
AturSams
2

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 OnEnterFrameevento 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 gotodeclaració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.

AturSams
fuente
1
Hasta donde sé, los frameworks basados ​​en eventos, como AS3, todavía tienen un bucle de juego ejecutándose debajo. Estoy hablando de interrupciones de nivel inferior, no un marco que implementa un sistema de eventos.
MichaelHouse
Hmm ... no creo que las personas usen interrupciones de menor nivel en los juegos. AFAIK son utilizados principalmente por la CPU para monitorear las operaciones de E / S. Estaba pensando en una abstracción de nivel superior como una práctica de diseño en la que respondes a la entrada del usuario o la actividad del hardware (sin sondeo) en lugar de ejecutar varias instrucciones en cada cuadro y luego decirle al HW que rinda el resultado.
AturSams
1
Sí, la gente ya no los usa. Como dije, son más difíciles de usar y ahora tenemos formas mucho mejores de hacer las cosas. Entiendo lo que estás diciendo, y ciertamente es una forma diferente de pensar las cosas, pero solo en la superficie parece diferente, debajo es el mismo tipo de bucle.
MichaelHouse
Estoy de acuerdo con @ Byte56, todo se reduce a un bucle, a menos que estemos hablando de eventos a nivel de kernel que usan interrupciones IO.
concept3d
1
Lo sé, pero la mayor parte de todo lo que hacemos es lo mismo debajo de la superficie (como dije, cambiando el valor del contador del programa). Esto no es ningún secreto y lo señalé en la respuesta. La programación basada en eventos es aparentemente diferente porque movemos el contador del programa a diferentes funciones cuando ocurren diferentes eventos. Obviamente, es probable que haya una encuesta de bucle para verificar si estos eventos ocurrieron recientemente, pero como principio de diseño es aparentemente diferente.
AturSams
0

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/ .hgenera un hilo separado para su bucle.

Ingeniero
fuente