Questo può essere un follow-up a this question, in cui ho suggerito che avere un ciclo di ridisegno che ha continuato a disegnare più e più volte potrebbe essere un po 'eccessivo. Potrebbe esserci un api per scoprire le funzionalità del display dei dispositivi, ma se non ce ne sono a conoscenza. Quando scrivi la tua funzione loop/thread evento puoi controllare il framerate di quanto spesso chiami il tuo metodo 'draw'. In genere, penso che per la maggior parte degli scopi, sarebbe ok con una frequenza di aggiornamento di circa 30. Se stai scrivendo un gioco d'azione veloce, che richiede un'animazione rapida, allora potresti vuoi correre il più velocemente possibile, più fps, più fluido sarà.
Un tipico ciclo di eventi (funzione run filo) potrebbe essere simile a questo:
// define the target fps
private static final int UPDATE_RATE = 30; // Frames per second (fps)
public void run() {
while(running) { // volatile flag, set somewhere else to shutdown
long beginTimeMillis, timeTakenMillis, timeLeftMillis;
// get the time before updates/draw
beginTimeMillis = System.currentTimeMillis();
// do the thread processing/draw
performUpdates(); // move things if required
draw(); // draw them on the screen
// get the time after processing and calculate the difference
timeTakenMillis = System.currentTimeMillis() - beginTimeMillis;
// check how long there is until we reach the desired refresh rate
timeLeftMillis = (1000L/UPDATE_RATE) - timeTakenMillis;
// set some kind of minimum to prevent spinning
if (timeLeftMillis < 5) {
timeLeftMillis = 5; // Set a minimum
}
// sleep until the end of the current frame
try {
TimeUnit.MILLISECONDS.sleep(timeLeftMillis);
} catch (InterruptedException ie) {
}
}
}
stiamo parlando di una superficie GL, o in generale (come quando usi un'animazione)? Non esiste un framerate predefinito, posso dirlo in anticipo. – EboMike
Solo per dire animazione 2D! utilizzo delle viste di superficie – m4n07