Saya bertanya-tanya apakah ada bahaya yang mungkin terjadi ketika loop game saya berjalan secepat sistem memungkinkan?
Saat ini saya memiliki loop, yang, dengan mengukur waktu yang berlalu dalam nanodetik, menjalankan logika game dan merender logika pada kecepatan yang telah ditentukan tanpa masalah. Faktanya, logika apa pun yang saya lakukan di loop adalah clock ke sejumlah panggilan setiap detik.
Loop itu sendiri meskipun hanya berjalan secepat yang suka yang muncul hingga sekitar 11,7 juta loop per detik di mesin saya.
Loop (kodesemu sederhana):
while(!isGameOver){
if(canPollInputs){
pollInputs()
}
while(canStepLogic){
stepLogic()
}
if(canRender){
render()
}
}
Pertanyaan saya pada dasarnya adalah apakah loop sederhana itu, jika tidak berjalan pada kecepatan yang terkendali, dapat membahayakan sistem?
Sunting: Itu berarti logika saya berjalan 30 kali per detik (30 tps), penyaji saya berjalan pada 60 fps, saya mengumpulkan input 100 kali per detik dan ada juga beberapa logika untuk mengatasi logika atau membuat waktu lebih lama dari yang diharapkan . Tetapi loop itu sendiri tidak dibatasi.
Sunting: Menggunakan Thread.sleep()
untuk contohnya Throttle loop utama ke 250 loop per detik mengarah ke pengurangan tetapi loop berjalan di sekitar 570 loop per detik, bukan 250 yang diinginkan (akan menambahkan kode ketika saya di mesin desktop saya ..)
Sunting: Ini dia, gameloop java yang berfungsi untuk mengklarifikasi hal-hal. Juga merasa bebas untuk menggunakannya tetapi jangan mengklaim itu milik Anda;)
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++;
}
}
Seperti yang Anda lihat hampir tidak ada kode yang dijalankan pada setiap loop tetapi selalu ada pilihan tertentu berdasarkan berapa banyak waktu nyata telah berlalu. Pertanyaannya mengacu pada 'lingkaran pekerja' itu dan bagaimana hal itu memengaruhi sistem.