Volevo scrivere un semplice gioco in Android usando opengl es, ma ho subito avuto problemi con il ciclo di gioco principale. Come ho letto qui: http://developer.android.com/resources/tutorials/opengl/opengl-es10.html l'app chiama public void onDrawFrame(GL10 gl)
ogni volta che è necessario ridisegnare la superficie. O smth così. Il mio problema era: come creare un ciclo di aggiornamento indipendente dalle chiamate di estrazione. Voglio dire - non può funzionare così, non posso aggiornare la logica di gioco solo quando il dispositivo (app?) Vuole ridisegnare la superficie (o sbaglio?).Come creare un ciclo di aggiornamento/disegno in modo appropriato con Android opengl?
Dopo aver cercato su google, sono giunto alla conclusione che devo creare un altro thread per il ciclo di aggiornamento. Ma poi ho avuto un altro problema: con un thread che si occupava del disegno e un altro che si occupava di aggiornare la logica del gioco, non sapevo come farli cooperare. Innanzitutto, erano due classi separate (almeno nella mia implementazione) quindi non potevano usare le stesse variabili di gioco e oggetti (sprite, timer, variabili diverse, contatori e così via ... praticamente tutto ciò che queste due classi dovevano fare i loro lavori). Ora penso che potrei in qualche modo riunirli entrambi in una classe. Ma - in secondo luogo, avevo bisogno di sincronizzare i due fili in qualche modo.
Infine, sono uscito con questa idea generale:
- 3 classi:
public class MyRenderer implements GLSurfaceView.Renderer
cononSurfaceCreated()
metodo prendersi cura del disegnopublic class UpdateThread implements Runnable
conrun()
eupdate()
metodi. chiamava il metodoupdate()
esattamente 60 volte al secondo (volevo un ciclo a passo fisso)public class SpritesHolder
usato come contenitore per tutti gli oggetti/variabili/oggetti del gioco (come sprite, timer, variabili di stato e così via ...) con tutti i campi pubblici.
- Quindi, in pratica la classe
SpritesHolder
era una scatola contenente tutti le variabili necessarie in un unico luogo, in modo daMyRenderer
eUpdateThread
classi potevano accedervi ed utilizzarlo. Per quanto riguarda la sincronizzazione - ho appena fatto dovrebbe occupare in questo modo:
public void update(float delta) { synchronized (spritesHolder) { // whole method code... } }
e:
public void onDrawFrame(GL10 gl) { synchronized (spritesHolder) { // whole method code... } }
in modo che entrambi i fili non ha utilizzato lo spritesHolder allo stesso tempo. Quindi gli aggiornamenti sono stati eseguiti 60 volte al secondo e il disegno ha avuto luogo ogni volta che l'app (dispositivo?) Era necessaria.
Un sacco di parole, mi dispiace, ho quasi finito di scrivere questo post. ;) Ad ogni modo - questo (descritto sopra) funziona e ho persino scritto qualche gioco basato su questo 'modello' ma penso che le mie idee potrebbero essere pazzesche e si può definire tutto molto meglio. Sarei molto grato per tutti i commenti e i consigli.
solo una parola: http://obviam.net/ :) – akonsu