c++ - 每秒仅运行 60 次代码

标签 c++

我正在创建一个依赖系统时间的 directx 应用程序(因为它必须准确), 我需要在后台每秒运行 60 行代码(在由 boost::thread 创建的线程中)。这等于 60 FPS(每秒帧数),但不依赖于主要应用程序的帧速率。

//.................
void frameThread()
{
    // I want to run codes inside this loop for *exactly* 60 times in a second.
    // In other words, every 16.67 (1000/60) milliseconds
    for(;;)
    {
      DoWork();
      //.........
    }
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
   initialize();
   //.....stuffs
   boost::thread framethread(frameThread);
   //......
}

有办法吗?

任何形式的帮助将不胜感激:)

最佳答案

由于 60 Hz 是常见的显示器刷新率,听起来您想要启用 V-Sync,而不是摆弄定时器和 sleep 。

您提到您正在使用 DirectX - 如果您正在使用 DirectX 9,请指定 D3DPRESENT_INTERVAL_ONE创 build 备时,应用程序将与监视器刷新率同步。通常这是 60 Hz - 但理论上也可以是任何频率,例如 50Hz、85Hz 或 120Hz。不过,你会得到一个非常漂亮的无撕裂显示 - 如果你不使用 V-sync,你可能会在滚动时出现撕裂现象。

这就提出了一个问题:如果帧速率变化如此之大,您如何使游戏以相同的速度进行?答案很简单——使用高分辨率计时器(如 Windows 上的 QueryPerformanceCounter),并测量每帧之间的时间。然后,您需要根据这个“增量时间”值进行任何运动或移动。无论如何,这都是一件好事,即使帧速率是固定的 - 它可以防止您的游戏在计算机运行缓慢且玩家只能获得 20fps 时突然以慢动作运行。

这是一个以每秒 100 像素的速度水平移动对象的示例,无论帧速率如何:

object.x += 100.0f * delta_time; // same speed no matter the framerate

这个 IMO 是一种更好的方法,特别是考虑到它无撕裂、独立于帧率并且与用户的显示器同步,而不是您自己设置的任意帧率。

关于c++ - 每秒仅运行 60 次代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2514086/

相关文章:

c++ - 为什么当我输入定点符号时,我的输出是 0.00?

c++ - 如何从一个 map 键列表中减去另一个 map 键列表并获得新 map ( map A - mab B = map C)

c++ - 取消引用不适用于 std::vector<std::vector<double>>

c++ - 为什么 boost intrusive list 的 push_back 函数需要左值?

c++ - unique_ptr : linked list entry deletion

c++ - 如何在 C++ 14 的类中启动线程?

c++ - 类 x(继承)C++ 不存在默认构造函数

c++ - 迭代器作为 C++ 中的函数输入?

c++ - 仅使用 4 个字节将整数存储到 QByteArray

C++通过制作索引数组进行排序