Почему моя игра отстает?
Я делаю простую 2D игру, но у меня проблемы с лагом. Персонаж в игре движется нормально, но иногда замедляется, в основном, когда рядом с врагом. Враг не вызывает задержки, хотя у меня их было 50 на экране одновременно, и все работает нормально. Я сделал синхронизацию почти идентично тому, как это делается в книге Killer Game Programming на Java, но, похоже, она работает не слишком хорошо. Кажется, что FPS также сильно меняется, чего не должно быть, потому что для завершения цикла update-render-paint-sleep всегда требуется 15 мс, кто-нибудь может объяснить это?
Кроме того, я думаю, что он больше запаздывает, когда мой компьютер работает в фоновом режиме (антивирусное сканирование и т. Д.), Хотя я могу запускать игру со скоростью около 550FPS, пока работают другие программы, поэтому я не думаю, что это мой компьютер.
Вот как я делаю выбор времени:
int waitTime = 1000 / 65; //65 being the desired FPS
while(running){
if(!loading){
gameUpdate();
gameRender();
gamePaint();
afterTime = System.nanoTime();
timeDiff = afterTime - beforeTime;
sleepTime = waitTime - (timeDiff / 1000000L);
if(sleepTime > 0){
try{
mainThread.sleep(sleepTime);
} catch(InterruptedException ie){}
}
else{
sleepSkipped++;
if(sleepSkipped == maxSleepSkipped){
Thread.yield();
sleepSkipped = 0;
}
}
fpsTime += (System.nanoTime() - beforeTime) / 1000000;
fps++;
if(fpsTime > 1000){
System.out.println("FPS: " + fps);
fps = 0;
fpsTime = 0;
}
beforeTime = System.nanoTime();
}
}
2 ответа
Я думаю, что ваша проблема похожа на совсем недавно странное поведение в Thread.sleep(). Я вижу, что в вашем цикле вы добавляете время сна к вашему таймеру, то есть оно продолжает увеличиваться (понижать fps), пока не станет настолько большим, что вычитает время ожидания из он дает отрицательное число, заставляя ваш цикл перейти в тот, который приводит к потоку, где он добавляет к пропускаемому счету, и дает, когда количество достаточно велико.
Как предположил Арынак, это была проблема с обнаружением столкновения с противником. Каждый цикл в цикле заставлял каждого врага вызывать довольно много методов, однако теперь я удалил и переместил многие вызовы методов, что полностью устранило проблему задержки. Спасибо, Арынак.