2012-06-03 4 views
1

이것은 어쨌든, 나를 실행하는 모든 Windows 컴퓨터에서 내 간단한 게임에서 동일한 속도로 동일한 속도를 보장하기 위해 시도 미친, 운전. 메신저는 1/60 값을 지정하고 마지막으로 호출 된 이후로 값이 경과 할 때까지 프레임 캔트가 실행되도록합니다. 어떤 문제로 인해 im은 1/60이 30hz와 같아서 60hz를 얻으려면 1/120로 설정해야합니다. 그것도 조금 더 빨라 60hz에 강타하지 않습니다.gameloop framerate 제어 문제

내가 여기에 붙여 넣으면 다른 사람이 틀린 것을 볼 수 있는지 알려 줄 수 있습니까? 어쩌면 그것을하는 더 정확한 방법일까요?

float controlFrameRate = 1./60 ; 

while (gameIsRunning) 
{ 
    frameTime += (system->getElapsedTime()-lastTime); 
    lastTime = system->getElapsedTime(); 

    if(frameTime > controlFrameRate) 
    { 
     gameIsRunning = system->update(); 
        
     //do stuff with the game 

        frameTime = .0f;          
    } 
} 

답변

3

getElapsedTime을 두 번 호출하지 마십시오. 두 번의 호출간에 약간의 차이가있을 수 있습니다. 대신 값을 저장 한 다음 다시 사용하십시오. 또한, frameTime을 0으로 설정하는 대신 controlFrameRate를 빼면 프레임 하나가 조금 더 오래 걸리면 다음 프레임이 조금 짧아 져서 그 프레임을 보충 할 것입니다.

while (gameIsRunning) 
{ 
    float elapsedTime = system->getElapsedTime(); 

    frameTime += (elapsedTime-lastTime); 
    lastTime = elapsedTime; 

    if(frameTime > controlFrameRate) 
    { 
     gameIsRunning = system->update(); 

     //do stuff with the game 

     frameTime -= controlFrameRate; 
    } 
} 

요금을 1/120로 설정해야하는 것과 관련하여 확실하지 않습니다. 어떤 타이밍 API를 사용하고 있습니까?

+0

젠체하는 사람은 프레임 속도를 강하게 받았을뿐만 아니라 내가 가지고있는 1./60!=60hz 문제를 해결했습니다. 당신은 천재였습니다. 건배. –

+0

나는 그래픽 로직을 가능한 한 많이 새로 고치는 것이 현명하다. 즉, 프레임 타임 검사 이외의 렌더러에 대한 호출이 있습니까? –