Ho studiato e fatto piccoli giochi per un po 'e ho deciso ultimamente di provare a sviluppare giochi per Android.Il modo migliore per separare la logica di gioco dal rendering per un gioco frenetico per Android con OpenGL?
Per me, passare dal codice C++ nativo ad Android Java non è stato difficile, ma mi dà mal di testa pensare a come mantenere la logica separata dal rendering.
ho letto qui e su altri siti che:
E 'meglio non creare un altro thread per esso, proprio perché Android volontà di avere certo problemi per l'elaborazione.
Significato del codice sarebbe qualcosa di simile:
public void onDrawFrame(GL10 gl) {
doLogicCalculations();
clearScreen();
drawSprites();
}
Ma io non sono sicuro se questo sarebbe l'approccio migliore. Dal momento che non penso che mi piaccia come sarà se inserissi la mia logica nel metodo GLRenderer::onDrawFrame
. Per quanto ne so, questo metodo è pensato per disegnare, e posso rallentare i frame se inserisco la logica lì. Per non parlare del fatto che mi feriscono i concetti di POO nella mia comprensione.
Penso che utilizzando thread potrebbe essere il modo, questo è come stavo progettando:
attività principale:
public void onCreate(Bundle savedInstanceState) {
//set fullscreen, etc
GLSurfaceView view = new GLSurfaceView(this);
//Configure view
GameManager game = new GameManager();
game.start(context, view);
setContentView(view);
}
GameManager:
OpenGLRenderer renderer;
Boolean running;
public void start(Context context, GLSurfaceView view) {
this.renderer = new OpenGLRenderer(context);
view.setRenderer(this.renderer);
//create Texturelib, create sound system...
running = true;
//create a thread to run GameManager::update()
}
public void update(){
while(running){
//update game logic here
//put, edit and remove sprites from renderer list
//set running to false to quit game
}
}
e, infine, OpenGLRenderer:
ListOrMap toDraw;
public void onDrawFrame(GL10 gl) {
for(sprite i : toDraw)
{
i.draw();
}
}
Questa è un'idea approssimativa, non completamente completa. Questo schema terrebbe tutto separato e sembrerebbe un po 'migliore, ma è il migliore per le prestazioni?
Fintanto che ho cercato, la maggior parte degli esempi di giochi con thread utilizza canvas o surfaceview, quelli che non si adattano al mio caso, perché sto usando OpenGLES.
Così qui sono le mie domande:
Qual è il modo migliore per separare la mia logica gioco dalla prestazione quando si utilizza OpenGLES? Threading my applicazione? Metti la logica in un metodo separato e basta chiamarla dal metodo ?
Ottima risposta Steve, grazie!Penso che anche se non mi piace rovinare il design, seguirò il numero 1. Il mio gioco è attivo, ma non ci sono calcoli pesanti su di esso, come la fisica o un sacco di controllo delle collisioni. Per essere sicuro dei miei pensieri, il mio approccio al threading nella domanda sarebbe corretto se lo selezionassi (la scrittura logica in una mappa sincronizzata e il thread di rendering che la legge)? –
Oh, un'altra cosa. la gente mi ha detto di limitare i miei aggiornamenti logici a 30 fps, questo vale anche per il rendering? Dovrei limitare l'intera funzione ad aspettare 33ms per ogni aggiornamento, o semplicemente aggiornare la logica se è stata superata 33ms dall'ultimo aggiornamento? –
Non penso che tu debba limitarlo, ma forse non aspettarti di meglio su alcuni telefoni. Questo perché il framerate di alcuni dei primi telefoni HDPI (penso al tempo del Droid 1) era pieno, il che significa che non potevano disegnare uno schermo pieno di pixel più di circa 30 volte al secondo. Forse la GPU può lanciare i frame più velocemente, ma la CPU non può spostarli sullo schermo abbastanza velocemente. Questo non è il caso sui nuovi telefoni, penso. –