如果您曾经使用过XNA游戏工作室4,那么您熟悉更新方法。默认情况下,其中的代码每秒处理60次。我一直在努力在c ++中重现这样的效果。
我想创建一种方法,它每秒只处理代码x次数。我尝试过的每一种方式都可以同时处理,就像循环一样。我尝试过for
个循环,while
,goto
,并且所有内容都会立即处理完毕。
如果有人能告诉我如何以及如果我能用c ++实现这样的事情,我将不胜感激。
答案 0 :(得分:1)
根据您目前的知识水平,我可以获得具体的知识:
你不能用循环,fors,ifs和gotos做你想做的事情,因为我们不再处于MS-DOS时代了。
您也无法以精确每秒60帧的速度运行代码。
在Windows上,系统应用程序在称为“事件循环”的内容中运行。
通常,在事件循环中,大多数GUI框架都会调用“onIdle”事件,该事件发生在应用程序什么也不做的时候。
您可以在onIdle事件中调用update。
你的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;
}
您需要编写自己的更新函数,更新函数应该花费自上一帧以来经过的时间,并且您需要使用GetTickCount,QueryPerformanceCounter或类似函数编写getFrameTime()函数。
或者您可以使用系统计时器,但与onIdle()事件相比,这是一个坏主意 - 如果您的应用程序运行速度太慢。
简而言之,你前面还有很长的路要走。
你需要学习一些(最好是跨平台的)GUI框架,学习如何创建一个窗口,一个事件循环的概念(没有它今天就做不了什么),然后编写自己的“update()” “并获得多线程编程和系统事件的基本概念。
祝你好运。答案 1 :(得分:-1)
由于您熟悉XNA,我假设您也熟悉“输入”和“绘制”。你可以做的是为这3个函数分配独立的线程,并有一个计时器来查看它是否有时间运行一个线程。
例如输入可能会触发绘制,绘制和输入都会触发更新方法。
- 处理此问题的另一种方法是我的消息事件。如果您使用的是Windows,请查看Windows消息循环。通过执行操作系统触发的事件,这将使您的输入,更新和绘制事件更容易。