使用c ++中的自定义费率处理创建更新方法

时间:2015-06-17 08:54:22

标签: c++ visual-c++ visual-studio-2013 xna

如果您曾经使用过XNA游戏工作室4,那么您熟悉更新方法。默认情况下,其中的代码每秒处理60次。我一直在努力在c ++中重现这样的效果。

我想创建一种方法,它每秒只处理代码x次数。我尝试过的每一种方式都可以同时处理,就像循环一样。我尝试过for个循环,whilegoto,并且所有内容都会立即处理完毕。

如果有人能告诉我如何以及如果我能用c ++实现这样的事情,我将不胜感激。

2 个答案:

答案 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消息循环。通过执行操作系统触发的事件,这将使您的输入,更新和绘制事件更容易。