Если вы когда-либо использовали игровую студию XNA 4, вы знакомы с методом обновления. По умолчанию код внутри обрабатывается 60 раз в секунду. Я изо всех сил пытался воссоздать такой эффект в C ++.
Я хотел бы создать метод, где он будет обрабатывать код только количество раз в секунду. Каждый способ, которым я пробовал, обрабатывает все сразу, как это делают циклы. я пробовал for
петли, while
, goto
и все обрабатывает все сразу.
Если кто-нибудь может сказать мне, как и если я могу достичь такой цели в C ++, это будет высоко ценится.
С вашим текущим уровнем знаний это настолько конкретно, насколько я могу получить:
Вы не можете делать то, что хотите, с циклами, форсами, ifs и gotos, потому что мы больше не в эпохе MS-DOS.
Вы также не можете иметь код на точно 60 кадров в секунду.
В Windows системное приложение выполняется в рамках так называемого «цикла обработки событий».
Как правило, из цикла событий, большинство структур GUI вызывают событие «onIdle», которое происходит, когда приложение ничего не делает.
Вы вызываете update изнутри события onIdle.
Ваша функция onIdle () будет выглядеть так:
void onIdle(){
currentFrameTime = getCurrentFrameTime();
if ((currentFrameTime - lastFrameTime) < minUpdateDelay){
sleepForSmallAmountOfTime();//using Sleep or anything.
//Delay should be much smaller than minUPdateDelay.
//Doing this will reduce CPU load.
return;
}
update(currentFrameTime - lastFrameTime);
lastFrameTime = currentFrameTime;
}
Вам нужно написать свою собственную функцию обновления, ваша функция обновления должна занимать время, прошедшее с последнего кадра, и вам нужно написать функцию getFrameTime () с использованием либо GetTickCount, QueryPerformanceCounter, либо какой-либо подобной функции.
В качестве альтернативы вы можете использовать системные таймеры, но это плохая идея по сравнению с событием onIdle () — если ваше приложение работает слишком медленно.
Короче, впереди долгий путь.
Вы должны изучить некоторую (предпочтительно кроссплатформенную) структуру GUI, научиться создавать окно, концепцию цикла обработки событий (сегодня ничего не может сделать без него), а затем написать свой собственный метод «update ()» и получить основная идея многопоточного программирования и системных событий.
Удачи.
Поскольку вы знакомы с XNA, то я предполагаю, что вы также знакомы с «входом» и «отрисовкой». То, что вы могли бы сделать, это назначить независимые потоки этим трем функциям и иметь таймер, чтобы узнать, пора ли запускать поток.
Например, ввод, вероятно, будет вызывать отрисовку, а отрисовка и ввод будут инициировать метод обновления.
-Другой способ справиться с этим — мои сообщения о событиях. Если вы используете Windows, то загляните в цикл сообщений Windows. Это облегчит ввод, обновление и отрисовку события, выполняя события, вызванные ОС.