Quería escribir un juego simple en Android usando OpenGL, pero inmediatamente tuve problemas con el ciclo principal del juego. Mientras leo aquí: http://developer.android.com/resources/tutorials/opengl/opengl-es10.html la aplicación llama a public void onDrawFrame(GL10 gl)
cada vez que necesita volver a dibujar la superficie. O algo así. Mi problema era cómo crear un ciclo de actualización que es independiente de las llamadas al sorteo. Es decir, no puede funcionar así, no puedo actualizar la lógica del juego solo cuando el dispositivo (¿aplicación?) Quiere volver a dibujar la superficie (¿o estoy equivocado?).¿Cómo crear una actualización/dibujar un bucle adecuadamente con Android OpenGL?
Después de buscar en Google llegué a la conclusión de que tengo que crear otro hilo para el ciclo de actualización. Pero luego tuve otro problema: con un hilo que se encargaba del dibujo y otro que se encargaba de actualizar la lógica del juego, no sabía cómo hacerlos cooperar. Primero, eran dos clases separadas (al menos en mi implementación) por lo que no podían usar las mismas variables y objetos de juego (sprites, temporizadores, diferentes variables, contadores, etc.) prácticamente todo lo que estas dos clases necesitaban hacer. sus trabajos). Ahora creo que de alguna manera podría empacarlos a ambos en una sola clase. Pero, en segundo lugar, necesitaba sincronizar los dos hilos de alguna manera.
Finalmente, salí con esta idea general:
- 3 clases:
public class MyRenderer implements GLSurfaceView.Renderer
cononSurfaceCreated()
método de cuidado de dibujopublic class UpdateThread implements Runnable
conrun()
yupdate()
métodos.run()
estaba llamando al métodoupdate()
exactamente 60 veces por segundo (quería un ciclo de paso fijo)public class SpritesHolder
utilizado como contenedor para todos los objetos del juego/variables/cosas (como sprites, temporizadores, variables de estado, etc.) con todos los campos públicos.
- Así que básicamente la clase
SpritesHolder
era una caja que sostiene todas las variables necesarias en un solo lugar, por loMyRenderer
UpdateThread
y clases podrían acceder a ella y utilizarla. En cuanto a la sincronización - que acabo de hacer algo bajo la siguiente manera:
public void update(float delta) { synchronized (spritesHolder) { // whole method code... } }
y:
public void onDrawFrame(GL10 gl) { synchronized (spritesHolder) { // whole method code... } }
de manera que ambos hilos no utilizaron el spritesHolder al mismo tiempo. Así que las actualizaciones se realizaron 60 veces por segundo y el dibujo se llevó a cabo cada vez que se necesitaba la aplicación (¿dispositivo?).
Mucho que hablar, lo siento, casi he terminado de escribir esta publicación. ;) Así que de todos modos - esto (descrito arriba) funciona e incluso escribí algún juego basado en esta 'plantilla', pero creo que mis ideas podrían ser una locura y uno puede diseñar todo mucho mejor. Estaría muy agradecido por todos los comentarios y consejos.
solo una palabra: http://obviam.net/ :) – akonsu