Почему моя игра отстает?

Я делаю простую 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), пока не станет настолько большим, что вычитает время ожидания из он дает отрицательное число, заставляя ваш цикл перейти в тот, который приводит к потоку, где он добавляет к пропускаемому счету, и дает, когда количество достаточно велико.

Как предположил Арынак, это была проблема с обнаружением столкновения с противником. Каждый цикл в цикле заставлял каждого врага вызывать довольно много методов, однако теперь я удалил и переместил многие вызовы методов, что полностью устранило проблему задержки. Спасибо, Арынак.

Другие вопросы по тегам