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

1 c++ windows directx frame-rate

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

long int start = GetTickCount();
while(true)
    GameRun();

void GameRun()
{
     if(GetTickCount() - start >= 30)
         //do stuff
}
Run Code Online (Sandbox Code Playgroud)

start无论时间是什么,这都是平等的(我猜测得到滴答计数给出了自程序启动以来'滴答'的数量),然后,30个滴答之后,完成所有AI,渲染等.

我的问题是,首先执行所有AI等不是更有效率,然后,如果时间剩余,等到帧需要更改?

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

并且,在相关的说明中,GetTickCount()究竟做了什么,以及'tick'有多长

Kla*_*aim 5

对于您的游戏循环,请阅读本文.它总结了您的选择并使您的选择清晰.

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

您可能有兴趣阅读Ogre :: Timer类的工作方式(Ogre是一个着名的开源实时3D渲染库).他们添加了一些代码来处理这些函数的一些潜在问题,并且有几个平台的代码.

您可以获取代码并在应用中使用它.即将推出的Ogre版本的许可证是麻省理工学院

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


更新时间精度:现在如果你可以使用最后一个升级版本,那么boost.chrono提供了一个高精度时钟,steady_clock,这是跨平台的,在Windows上使用QueryPerformanceFrequency和QueryPerformanceCounter.实际上,chrono是添加到C++标准库的命题.