Мені було цікаво, чи можлива шкода, коли мій цикл гри працює так швидко, як дозволяє система?
На даний момент у мене є цикл, який, вимірюючи пройдений час у наносекундах, без проблем запускає логіку гри та логіку візуалізації з заданими швидкостями. Насправді будь-яка логіка, яку я виконую в циклі, працює на певну кількість викликів щосекунди.
Сам цикл, хоча просто працює так само швидко, як йому подобається, на мою машину доходить приблизно 11,7 мільйонів циклів в секунду.
Цикл (простий псевдокод):
while(!isGameOver){
if(canPollInputs){
pollInputs()
}
while(canStepLogic){
stepLogic()
}
if(canRender){
render()
}
}
Моє питання в основному, якщо цей простий цикл, якщо його не працює з регульованою швидкістю, може завдати шкоди системі?
Редагувати: Це означає, що моя логіка працює 30 разів на секунду (30 секунд в секунду), мій рендер працює зі швидкістю 60 кадрів в секунду, я опитую вводи 100 разів в секунду, а також є певна логіка, щоб впоратися з логікою або візуалізація займає більше часу, ніж очікувалося . Але сама петля не заглушена.
Редагувати: Використовуючи, Thread.sleep()
наприклад, для зменшення основного циклу до 250 циклів в секунду призводить до зменшення, але цикл працює зі швидкістю 570 циклів на секунду замість потрібних 250 (додасть код, коли я перебуваю на моїй настільній машині ..)
Редагувати: Ось ми працюємо, робочий ігровий цикл 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++;
}
}
Як ви бачите, майже не працює код у кожному циклі, але завжди є певний вибір залежно від того, скільки пройшло реального часу. Питання стосується цього "робочого циклу" та того, як він впливає на систему.