Эффективный по времени Gameloop в J2ME
Вопрос
Я задал ряд вопросов о разработке J2ME Game, а недавно Нейл Коффи прокомментировал
Как побочный вопрос - вы ДЕЙСТВИТЕЛЬНО хотите сделать 100 тиков в секунду в игре J2ME? Как я думаю, что sb упомянул, вы действительно должен спать на следующий желаемая точка пробуждения, а не фиксированная продолжительность каждый раз.
По какой-то причине эта штука застряла у меня в голове, и теперь я хочу получить ответы, что мне нужно, чтобы мой геймпул спал до желаемой точки пробуждения , я действительно не знаю где эта точка xD (теоретически).
Ради обратной связи это упрощенная версия моей игры:
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);
}
}
}
Спасибо за вашу помощь !!
Решение
Если вы решите, что хотите рендерить каждые 10 миллисекунд, тогда вы:
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
}
Я понимаю, что могут быть проблемы с разрешением таймера (например, Thread.sleep (10) может не спать ровно 10 мс; а System.currentTimeMillis () может не возвращать результаты с детализацией до 1 мс). Это зависит от платформы. Р>
Другие советы
Здесь есть отличная статья об игровых циклах , если вы ее еще не читали уже.
Исходя из моего опыта написания игр для J2ME, вы захотите свести к минимуму то, как много вы делаете в игровом цикле, поскольку плохо написанный игровой цикл может быстро разрядить батарею телефона. То есть, если вы рендерите 10 миллисекунд, обязательно проверьте, изменилось ли что-нибудь, а если нет, пропустите.