gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:10:30 25 4
gpt4 key购买 nike

我正在创建一个依赖系统时间的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com