게임 루프가 시스템이 허용하는 한 빨리 실행될 때 가능한 해가 있는지 궁금합니다.
나는 현재 통과 시간을 나노초로 측정하여 문제없이 사전 정의 된 속도로 게임 로직과 렌더링 로직을 실행하는 루프를 가지고 있습니다. 실제로 루프에서 수행하는 모든 논리는 초당 특정 양의 호출로 클럭됩니다.
루프 자체는 원하는 속도만큼 빠르게 실행되며 내 컴퓨터에서 초당 약 1,170 만 루프가 발생합니다.
루프 (간단한 의사 코드) :
while(!isGameOver){
if(canPollInputs){
pollInputs()
}
while(canStepLogic){
stepLogic()
}
if(canRender){
render()
}
}
내 질문은 기본적으로 간단한 루프가 제어 된 속도로 실행되지 않으면 시스템에 해를 끼칠 수 있는지 여부입니다.
편집 : 그것은 내 논리가 초당 30 번 (30 tps) 실행되고 내 렌더러가 60fps로 실행 중이며 입력을 초당 100 회 폴링하고 논리에 대처하는 논리가 있거나 예상보다 오래 걸리는 렌더링이 있음을 의미합니다 . 그러나 루프 자체는 조절되지 않습니다.
편집 : Thread.sleep()
예를 들어 메인 루프를 초당 250 루프로 낮추면 루프가 줄어들지 만 루프는 원하는 250 대신 초당 약 570 루프로 실행됩니다 (내 데스크탑 컴퓨터에있을 때 코드가 추가됩니다 ..)
편집 : 여기에 물건을 명확히하기 위해 작동하는 Java 게임 루프가 있습니다. 또한 자유롭게 사용하되 자신의 것으로 주장하지 마십시오.)
private void gameLoop() {
// Time that must elapse before a new run
double timePerPoll = 1000000000l / targetPPS;
double timePerTick = 1000000000l / targetTPS;
double timePerFrame = 1000000000l / targetFPS;
int maxFrameSkip = (int) ( (1000000000l / MINIMUM_FPS) / timePerTick);
int achievedPPS = 0;
int achievedFPS = 0;
int achievedTPS = 0;
long timer = TimeUtils.getMillis();
int loops = 0;
int achievedLoops = 0;
long currTime = 0l;
long loopTime = 0l;
long accumulatorPPS = 0l;
long accumulatorTPS = 0l;
long accumulatorFPS = 0l;
long lastTime = TimeUtils.getNano();
while(!isRequestedToStop) {
currTime = TimeUtils.getNano();
loopTime = currTime - lastTime;
lastTime = currTime;
loops = 0;
accumulatorPPS += loopTime;
accumulatorTPS += loopTime;
accumulatorFPS += loopTime;
if(accumulatorPPS >= timePerPoll) {
pollInputs();
playerLogic();
achievedPPS++;
accumulatorPPS -= timePerPoll;
}
while(accumulatorTPS >= timePerTick && loops < maxFrameSkip) {
tick();
achievedTPS++;
accumulatorTPS -= timePerTick;
loops++;
}
// Max 1 render per loop so player movement stays fluent
if(accumulatorFPS >= timePerFrame) {
render();
achievedFPS++;
accumulatorFPS -= timePerFrame;
}
if(TimeUtils.getDeltaMillis(timer) > 1000) {
timer += 1000;
logger.debug(achievedTPS + " TPS, " + achievedFPS + " FPS, "
+ achievedPPS + " Polls, " + achievedLoops + " Loops");
achievedTPS = 0;
achievedFPS = 0;
achievedLoops = 0;
}
achievedLoops++;
}
}
보시다시피 각 루프에서 실행되는 코드는 거의 없지만 실제 경과 시간에 따라 항상 특정 선택이 이루어집니다. 문제는 그 '작업자 루프'와 그것이 시스템에 어떻게 영향을 미치는지에 관한 것입니다.