私のゲームループがシステムの許す限り高速で実行されたときに、害が生じる可能性があるかどうか疑問に思っていましたか?
現在、ナノ秒単位で経過時間を測定することで、問題なく事前定義された速度でゲームロジックとレンダリングロジックを実行するループがあります。実際、私がループ内で行うロジックは、毎秒一定量の呼び出しに合わせてクロックされます。
ループ自体は、私のマシンでは1秒間に約1,170万のループに達するのと同じくらい高速で実行されます。
ループ(単純な擬似コード):
while(!isGameOver){
if(canPollInputs){
pollInputs()
}
while(canStepLogic){
stepLogic()
}
if(canRender){
render()
}
}
私の質問は、基本的に、その単純なループが、制御された速度で実行されていない場合、システムに害を及ぼすことができるかどうかです。
編集:つまり、ロジックは1秒に30回(30 tps)で実行され、レンダラーは60 fpsで実行され、入力を1秒に100回ポーリングしています。 。ただし、ループ自体は調整されません。
編集:Thread.sleep()
たとえば、メインループを1秒あたり250ループまでスロットルすると、削減につながりますが、ループは目的の250ではなく、1秒あたり約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++;
}
}
ご覧のとおり、各ループで実行されるコードはほとんどありませんが、リアルタイムの経過時間に基づいて常に特定の選択が行われます。問題は、その「ワーカーループ」と、それがシステムにどのように影響するかということです。