2013-04-29 3 views
0

Я делаю базовую 2D-игру, но у меня проблемы с задержкой. Персонаж игры отлично движется, но иногда замедляется, в основном, рядом с врагом. Враг не вызывает отставания, поскольку у меня было 50 из них на экране сразу, и все работает нормально. Я делал выбор времени почти идентично тому, как это делается в Программе игр Killer в 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(); 
     } 
    } 
+1

Что вы делаете, когда рядом с врагом? У столкновения/боя может быть ошибка, я не вижу ничего плохого в вашем цикле. – arynaq

+0

Каждый враг постоянно проверяет игрока. Я бы попросил врага проверить игрока только тогда, когда он рядом, но я не могу. Хотя я хорошо посмотрю на обнаружение столкновений. – Hsenfow

ответ

0

Я думаю, ваша проблема похожа на одну совсем недавно Weird behavior in Thread.sleep() я вижу, что в цикле вы добавляете времени сна к таймеру, означает, что он продолжает расти (снижение fps) до тех пор, пока он не станет настолько большим, что вычитание из него результата даст отрицательное число, заставив вашу петлю перейти к той, которая дает поток, в который добавляется скип-счет, и дает, когда количество достаточно велико.

+0

Я не уверен, что вы имеете в виду. В моем цикле я делаю поток спящим в течение установленного времени в зависимости от того, как долго выполняются методы обновления, рендеринга и рисования. Я ничего не добавляю. – Hsenfow

+1

Попробуйте запустить http://www.fraps.com/ и увидев FPS с помощью этого инструмента, я могу ошибаться, хотя рад, что мое первое предложение помогло :) – arynaq

0

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

Смежные вопросы