Tôi đã tự hỏi nếu có bất kỳ tác hại có thể có khi vòng lặp trò chơi của tôi chạy nhanh như hệ thống cho phép?
Tôi hiện có một vòng lặp, bằng cách đo thời gian trôi qua tính bằng nano giây, chạy logic trò chơi và kết xuất logic ở tốc độ được xác định trước mà không gặp vấn đề gì. Trong thực tế, bất kỳ logic nào tôi thực hiện trong vòng lặp đều được ghi ở một số lượng cuộc gọi nhất định mỗi giây.
Bản thân vòng lặp mặc dù chỉ chạy nhanh như nó muốn với khoảng 11,7 triệu vòng một giây trên máy của tôi.
Vòng lặp (mã giả đơn giản):
while(!isGameOver){
if(canPollInputs){
pollInputs()
}
while(canStepLogic){
stepLogic()
}
if(canRender){
render()
}
}
Câu hỏi của tôi về cơ bản là nếu vòng lặp đơn giản đó, nếu nó không chạy ở tốc độ được kiểm soát, có thể gây hại gì cho hệ thống không?
Chỉnh sửa: Điều đó có nghĩa là logic của tôi đang chạy 30 lần một giây (30 tps), trình kết xuất của tôi đang chạy ở tốc độ 60 khung hình / giây, tôi bỏ phiếu đầu vào 100 lần một giây và cũng có một số logic để đối phó với logic hoặc kết xuất mất nhiều thời gian hơn dự kiến . Nhưng bản thân vòng lặp không phải là điều tiết.
Chỉnh sửa: Sử dụng Thread.sleep()
để điều chỉnh vòng lặp chính xuống 250 vòng mỗi giây dẫn đến giảm nhưng các vòng lặp chạy ở khoảng 570 vòng mỗi giây thay vì 250 vòng mong muốn (sẽ thêm mã khi tôi ở máy tính để bàn của mình ..)
Chỉnh sửa: Ở đây chúng tôi đi, một gameloop java hoạt động để làm rõ mọi thứ. Cũng cảm thấy thoải mái khi sử dụng nó nhưng đừng yêu cầu nó là của bạn;)
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++;
}
}
Như bạn có thể thấy, hầu như không có mã nào chạy trên mỗi vòng lặp mà luôn luôn là một lựa chọn nhất định dựa trên thời gian thực đã trôi qua. Câu hỏi đề cập đến 'vòng lặp công nhân' đó và nó ảnh hưởng đến hệ thống như thế nào.