ฉันสงสัยว่ามีอันตรายใด ๆ ที่เป็นไปได้หรือไม่เมื่อลูปเกมของฉันทำงานเร็วเท่าที่ระบบอนุญาต
ขณะนี้ฉันมีลูปซึ่งโดยการวัดเวลาที่ผ่านไปในหน่วยนาโนวินาทีเรียกใช้ตรรกะของเกมและตรรกะการเรนเดอร์ด้วยความเร็วที่กำหนดไว้ล่วงหน้าโดยไม่มีปัญหา ในความเป็นจริงตรรกะใด ๆ ที่ฉันทำในการวนซ้ำนั้นถูกโอเวอร์คล็อกไปที่การโทรในแต่ละวินาที
การวนซ้ำตัวเองนั้นวิ่งได้เร็วเท่าที่มันชอบซึ่งมีประมาณ 11.7 ล้านลูปต่อวินาทีในเครื่องของฉัน
วน (pseudocode ง่าย):
while(!isGameOver){
if(canPollInputs){
pollInputs()
}
while(canStepLogic){
stepLogic()
}
if(canRender){
render()
}
}
คำถามของฉันนั้นก็คือถ้าลูปแบบง่ายนั้นถ้ามันไม่ทำงานด้วยความเร็วที่ควบคุมสามารถทำอันตรายต่อระบบได้หรือไม่?
แก้ไข: นั่นหมายความว่าตรรกะของฉันทำงาน 30 ครั้งต่อวินาที (30 tps), เครื่องมือแสดงภาพของฉันทำงานที่ 60 fps, ฉันสำรวจสัญญาณอินพุต 100 ครั้งต่อวินาทีและยังมีตรรกะบางอย่างที่จะรับมือกับตรรกะหรือการแสดงผลนานกว่าที่คาดไว้ . แต่ห่วงไม่ได้ควบคุมปริมาณ
แก้ไข: การใช้Thread.sleep()
เช่น Throttle การวนลูปหลักลงไปที่ 250 ลูปต่อวินาทีนำไปสู่การลดลง แต่ลูปทำงานที่ประมาณ 570 ลูปต่อวินาทีแทนที่จะเป็น 250 ที่ต้องการ (จะเพิ่มรหัสเมื่อฉันอยู่ที่เครื่องเดสก์ท็อปของฉัน .. )
แก้ไข: เราไปกันแล้ว java gameloop ที่ใช้งานได้เพื่อชี้แจงสิ่งต่างๆ อย่าลังเลที่จะใช้มัน แต่อย่าอ้างสิทธิ์ว่าเป็นของคุณ)
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++;
}
}
อย่างที่คุณเห็นว่าแทบจะไม่มีโค้ดที่ทำงานในแต่ละลูป แต่จะมีการเลือกบางอย่างตามจำนวนเวลาจริงที่ผ่านไป คำถามหมายถึง 'ห่วงผู้ปฏิบัติงาน' และมันมีผลต่อระบบอย่างไร