Gameloop eficiente en tiempo en J2ME
Pregunta
He hecho una serie de preguntas sobre el desarrollo de J2ME Game, y en una reciente, Neil Coffey comentó
Como un problema secundario, ¿REALMENTE quieres hacer 100 ticks / segundo en un juego J2ME? Como creo que SB ha mencionado, usted realmente también debería dormir hasta la próxima punto de despertador deseado, no un punto fijo duración cada vez.
Por alguna razón, esa cosa quedó en mi mente y ahora quiero las respuestas, ¿qué necesito para hacer que mi gameloop duerma hasta el punto de despertador deseado , realmente no lo sé ¿Dónde está ese punto xD (teóricamente hablando).
En aras de los comentarios, esta es una versión simplificada de mi gameloop:
public void run() {
Graphics g = this.getGraphics();
while (running) {
long diff = System.currentTimeMillis() - lastLoop;
lastLoop = System.currentTimeMillis();
input();
this.level.doLogic();
render(g, diff);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
stop(e);
}
}
}
¡Gracias por tu ayuda!
Solución
Si decides que quieres renderizar cada 10 milisegundos, entonces:
loop {
- record current time; render
- do input/logic
- check the current time, and calculate elapsed time
- if less than 10 ms has elapsed, calculate the remaining time (10 millis - elapsed time); sleep for this duration
}
Entiendo que puede haber problemas con la resolución del temporizador (por ejemplo, Thread.sleep (10) puede no dormir exactamente 10 ms; y System.currentTimeMillis () puede no devolver resultados con granularidad de hasta 1 ms). Esto depende de la plataforma.
Otros consejos
Hay un excelente artículo sobre bucles de juego aquí , si no lo ha leído ya.
Desde mi experiencia escribiendo juegos J2ME, querrás minimizar cuánto haces en un bucle de juego, ya que un bucle de juego mal escrito puede agotar rápidamente la batería de un teléfono. Es decir, si está procesando cada 10 milisegundos, asegúrese de verificar si algo ha cambiado, y si no, omítalo.