首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DirectX和C++保持稳定帧频的最有效方法是什么?

使用DirectX和C++保持稳定帧频的最有效方法是什么?
EN

Stack Overflow用户
提问于 2009-10-17 22:54:02
回答 2查看 3.9K关注 0票数 2

我正在从一本关于游戏编程的书中学习DirectX,它使用以下方法进行游戏循环:

代码语言:javascript
复制
long int start = GetTickCount();
while(true)
    GameRun();

void GameRun()
{
     if(GetTickCount() - start >= 30)
         //do stuff
}

这使得无论时间是多少,start都是相等的(我猜get tick count给出了程序启动以来的‘tick’数),然后,30个tick之后,做所有的AI,渲染等。

我的问题是,首先做所有的人工智能,等等,然后,如果有剩余的时间,等到帧需要改变的时候,不是更有效率吗?

那么,什么是保持稳定帧率的更好方法呢?(最好只使用我已经用于声音、图像和输入的DirectX标头(如d3d9.h))

另外,与此相关的是,GetTickCount()到底做了什么,以及“tick”有多长?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-17 23:33:21

对于您的游戏循环,请阅读this article。它总结了你的选择,让你的选择变得清晰。

现在对于GetTickCount()来说,这是在Windows中获取时间的最简单的方法(我不知道unix OSes的方法)。QueryPerformanceFrequency和QueryPerformanceCounter提供了更高的精确度,但可能很难理解如何正确使用它们。

您可能会对阅读Ogre::Timer class works (Ogre is a well-known open-source real-time 3D rendering library)的方式感兴趣。他们添加了一些代码来处理这些函数的一些潜在问题,并且有几个平台的代码。

您可以获取代码并在您的应用程序中使用它。the license of the coming version of Ogre is MIT

这样你就可以专注于你的游戏循环和游戏代码。

更新时间精度:现在,如果你可以使用最新的boost版本,有提供高精度时钟steady_clock的boost.chrono,它是跨平台和uses QueryPerformanceFrequency and QueryPerformanceCounter on windows的。实际上,chrono是一个添加到C++标准库中的提议。

票数 6
EN

Stack Overflow用户

发布于 2009-10-17 23:07:26

您提供的示例代码是实现游戏循环的最差方法。正如您所注意到的,等待到刷新时间是一种巨大的浪费。

只需选择一个任意的时间步长(例如,一秒),并表示相对于此时间步长的所有度量。

这看起来像这样:

代码语言:javascript
复制
while ( !done )
{
    float alphaTime = timeConstant / (currentTime - lastLoopTime);
    dispatchEvents();
    gameLogic( alphaTime );
}

void gameLogic( float alphaTime )
{
    movePlayer( playerSpeed * alphaTime );
}

这样你就不会浪费时间等待帧率,你可以让你的AI脚本运行,...而且所有的东西都会以相同的速度移动,因为运动是时间因素的倍数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1583436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档