2013-07-18 5 views
0

게임의 루프를 제어하는 ​​코드를 이해하는 데 막대한 어려움을 겪고 있습니다.이 while 루프의 목적을 이해할 수 없습니다. "while (unprocessedSeconds> secondsForEachTick)"왜 FPS 카운터 그 내부에 원하는 (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()이 로직 업데이트 만하는 것은 알 수 없었습니다. 실제로 적절한 렌더링 작업이 아니 었습니다! 브라질에서 건배! –