2013-07-18 2 views
0

У меня возникло огромное затруднение в понимании части кода, которая управляет циклом игры ... Я не могу понять цель этого цикла while (while (unprocessedSeconds> secondsForEachTick) »и почему счетчик кадров в секунду, если внутри, что если (tickCounter% 60 == 0) нравится следует по коду:Управление игровой петлей

public void run() 
{ 
    int frames = 0; 
    double unprocessedSeconds = 0; 
    long previousTime = System.nanoTime(); 

    double secondsForEachTick = 1/60.0; 


    int tickCount = 0; //RENDER COUNTER 
    boolean ticked = false; 

    while (running) 
    { 
     long currentTime = System.nanoTime(); 
     long passedTime = currentTime - previousTime; 

     previousTime = currentTime; 

     unprocessedSeconds = unprocessedSeconds + passedTime/1000000000.0; 

     int count = 0; 
     while(unprocessedSeconds > secondsForEachTick) 
     { 
      tick(); 
      count++; 
      unprocessedSeconds -= secondsForEachTick; 

      ticked = true; 
      tickCount++; 

      if(tickCount % 60 == 0){ 
       System.out.println(frames + " fps"); 
       previousTime += 1000; 
       frames = 0; 
      } 
     } 
     System.out.println("Iterações do loop: "+count); 

     if(ticked) 
     { 
      render(); 
      frames++; 
      ticked = false; 
     } 

    } 
} 
+0

'tickCount% 60' Не попадая в код, из-за имени и 60, он пахнет вычислениями минут/секунд. (1 мин = 60 секунд). Отлаживайте его, и вы лучше поймете это. – Maroun

ответ

4

Этот внутренний цикл в то время гарантирует, что обновление игра основана на фиксированный момент времени, а не времени кадра. Необработанное время собирается, и как только он будет больше, чем временные рамки для одного тика, он вызывает tick().

TickCount в основном отсчитывает тики (время тика составляет 1/60 с, так что 60 галлонов в секунду), и как только он пройдет 1 секунду, он распечатает собранные кадры (например, FPS). Кроме того, ticked сигнализирует, что что-то может измениться в игре, поэтому требуется новый рендер.

+0

Человек, спасибо! Я пытаюсь понять, что это логика около 3 дней, и теперь я вижу это! Отличная работа! Приветствия из Бразилии! –

0

Этот цикл используется для постоянного времени в игре. Поэтому, если по какой-то причине вы получаете отставание, вы будете делать несколько логических обновлений и один рендер. Я предполагаю, что tick() выполняет некоторые логические операции.

Чтобы быть более точным. Например, у вас есть пуля, а положение пули необходимо обновить на 0,1 с, чтобы выполнить правильный тест столкновения. Если по какой-то причине время дельты возрастет до 0,4, ваша пуля будет пролетать сквозь стены. Чтобы справиться с этим, вы выполняете несколько итераций с меньшим шагом времени, этот цикл делает это.

+0

Спасибо за помощь приятелю, поскольку я новичок в разработке игр, я не мог видеть, что tick() делает только логические обновления, и это была не совсем правильная операция рендеринга! Приветствия из Бразилии! –

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