Oyun döngümün sistemin izin verdiği kadar hızlı çalıştığında herhangi bir zarar olup olmadığını merak ediyordum?
Şu anda nanosaniyede geçen zamanı ölçerek, oyun mantığını ve mantığı önceden tanımlanmış hızlarda sorunsuz bir şekilde çalıştıran bir döngü var. Aslında, döngüde yaptığım herhangi bir mantık, her saniye belirli bir miktarda çağrıya saatlenir.
Döngünün kendisi, makinemde saniyede yaklaşık 11,7 milyon döngüye kadar çıktığı kadar hızlı çalışır.
Döngü (basit sahte kod):
while(!isGameOver){
if(canPollInputs){
pollInputs()
}
while(canStepLogic){
stepLogic()
}
if(canRender){
render()
}
}
Benim sorum temelde bu basit döngü, kontrollü bir hızda çalışmıyorsa, sisteme herhangi bir zarar verebilir mi?
Düzenleme: Bu, mantığımın saniyede 30 kez (30 tps) çalıştığı, oluşturucumun 60 fps'de çalıştığı, girişleri saniyede 100 kez yokladım ve ayrıca mantıkla başa çıkmak veya mantık beklenenden daha uzun sürüyor . Ancak döngünün kendisi kısıtlanmaz.
Düzenleme: Thread.sleep()
Örneğin kullanarak ana döngü saniyede 250 döngü aşağı Gaz kelebeği bir azalmaya yol açar, ancak döngüler istenen 250 yerine saniyede 570 döngüde çalışır (masaüstü makinemdeyken kod ekler ..)
Düzenleme: İşte başlıyoruz, işleri netleştirmek için çalışan bir java gameloop. Ayrıca kullanmaktan çekinmeyin, ancak size ait olduğunu iddia etmeyin;)
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++;
}
}
Gördüğünüz gibi, her döngüde neredeyse hiç kod çalıştırılmaz, ancak her zaman ne kadar gerçek zaman geçtiğine bağlı olarak belirli bir seçim vardır. Soru, bu 'işçi döngüsüne' ve bunun sistemi nasıl etkilediğine atıfta bulunmaktır.