2012-10-01 48 views
6

Hola chicos, estoy trabajando en hacer un juego con libGDX y realmente quiero enhebrar el juego, así que estoy ejecutando un bucle de pintura y un bucle lógico en hilos separados, como harías en un simple juego de java. con el bucle de componente de pintura y el bucle de ejecución ejecutablehilos de java en libGDX

Tengo experiencia con el enhebrado en c pero no tanto en java la única forma en que pude hacer un hilo fue haciendo una clase que amplía los hilos y luego crea la ejecución loop allí

pero el punto de hacer que el ciclo de ejecución fuera para permitir que cada pantalla calculara la lógica libremente así terminaría necesitando algún tipo de clase de pantalla abstracta que tenga la característica clase de publicidad implementado

Im preguntando si hay una manera más simple o más estándar de la aplicación de hilos de esta situación

Respuesta

11

La biblioteca libGDX ya ejecuta un subproceso de representación independiente para las actualizaciones de contexto de OpenGL. Vemos http://code.google.com/p/libgdx/wiki/TheArchitecture#The_Graphics_Module

Ya aprendimos que el hilo de interfaz de usuario no se ejecuta de forma continua, pero sólo programado para ejecutarse por el sistema operativo si un evento tiene que ser despachado (más o menos: p). Es por eso que instanciamos un segundo hilo al que generalmente nos referimos como el hilo de renderizado. Este subproceso es creado por el módulo de Gráficos que a su vez es instanciado por la Aplicación al inicio.

El método ApplicationListener.render() en su objeto principal del juego será invocado por este hilo rendir una vez por cada actualización de la pantalla (por lo que debe ser aproximadamente de 60 hz), por lo que sólo hay que poner el cuerpo de su bucle de render en su implementación de este método .

Usted puede crear un hilo adicional de fondo (por ejemplo, para la lógica del juego) en el método de create su ApplicationListener (asegúrese de limpiarlo en el método dispose). Aparte del hilo render, no creo que ninguno de los hilos preexistentes sea el lugar correcto para la lógica del juego.

Para la comunicación entre los subprocesos, puede utilizar cualquiera de los enfoques de sincronización de Java existentes. He usado el Java ArrayBlockingQueue<> para enviar solicitudes a un hilo de fondo. Y he usado Gdx.app.postRunnable() para hacer que mis hilos de fondo inserten datos en el hilo de renderizado (tales Runnables se ejecutan en el siguiente cuadro, antes de invocar render()).

+0

tal vez no estaba claro Soy consciente de que el renderizado es un hilo y se repite constantemente.pero estaba buscando si podría tener un hilo separado para la lógica del juego. si libGDX crea un nuevo hilo para el renderizado, ¿cómo accedería al hilo primario o de origen? – Mintybacon

+0

@Mintybacon He actualizado mi respuesta con más detalles sobre las opciones de comunicación entre hilos. Espero que esto ayude. –

0

No está seguro de lo que quieres decir, pero es normal que el dibujo en la pantalla (reflejan los cambios en la pantalla) se realiza mediante un único hilo dedicado (por ejemplo, ver el marco Swing). Esto se debe a que es bastante difícil permitir que varios hilos dibujen en la pantalla sin estropear las cosas; solo unas pocas implementaciones hacen esto. Por lo tanto, si planea implementar el marco de la GUI por sí mismo, sería recomendable un enfoque de dibujo de un solo hilo.

En cuanto a su lógica comercial, depende de muchas cosas. Un enfoque muy simple podría generar un nuevo hilo para cada actividad. Estos subprocesos pueden publicar el resultado en dicho subproceso de GUI. El problema con este enfoque es que su eficiencia puede disminuir significativamente si muchas actividades se ejecutan al mismo tiempo al mismo tiempo, porque en Java, cada subproceso se asigna a una secuencia de sistema operativo nativa. Puede usar grupos de hilos para evitar eso. La biblioteca estándar de Java proporciona grupos de subprocesos como ThreadPoolExecutor o si desea una abstracción un poco más alta, ExecutorService.

+0

Gracias ¡Miro en el ThreadPoolExecutor y te responderemos! – Mintybacon