gpt4 book ai didi

c++ - 我的多线程游戏一直处于 100% CPU 状态。如何管理线程事件以减少 CPU 负载?

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

我有一个 DirectX 游戏,它在双核系统上生成 2 个增强线程:1 个用于游戏/渲染(通常在四核 CPU 上拆分为它们自己的线程),另外 1 个线程按程序生成游戏世界.我相信我的音频中间件也会产生自己的线程来播放 SFX 和音乐。

游戏始终在 CPU 上以 100% 的速度运行,这反过来会导致音频系统出现一些杂音。我希望我可以通过更好地管理该生成线程的事件来减少 CPU 负载。虽然有时我需要它全速运行,但也有其他时候(当播放器移动不多时)它只是不断更新而不是真正做很多事情。

是否可以/建议手动管理线程的活跃程度?如果是这样,我可以使用什么策略来做到这一点?我一直看到人们说 sleep() 函数并不是真正推荐的,但我真的不知道还能做什么。

或者,我试图从线程管理中挤出周期是不是找错了树,传统的分析/优化会更好地为我服务吗?

最佳答案

达到 100% 的处理器利用率意味着您没有游戏时钟。您可能正在按照机器允许的速度渲染帧。如果您使用多个线程,仍然很难准确地达到 100%,这表明您也不同步线程。

这可能需要进行相当大的重写。速度应该由主渲染循环设置,主渲染循环将后台缓冲区复制到视频适配器。它设置您的目标 FPS,每秒帧数。通常,您会为此使用显示器的垂直消隐间隔,它通过确保显示器在正确的时间得到更新来解决撕裂问题。这会自动使渲染循环与显示器刷新率同步。在 LCD 显示器上通常每秒 60 次。计时器是另一种选择。这可以防止主线程消耗 100% 的核心,假设它可以跟上 FPS。

您现在有一个稳定的游戏时钟滴答声,离散的时间点,在这些时间点需要发生事情并需要完成工作以更新游戏状态。就像检查玩家输入一样。在渲染循环中,检查鼠标/键盘/ Controller 输入并使用您获得的任何东西来更新游戏世界对象。

进而决定工作线程需要做什么。他们将有一次通过渲染循环的持续时间来完成他们需要做的工作。您使用同步对象来唤醒它们。还有一个,每个,让他们发出信号,表示他们已经完成了当前的游戏循环滴答。这阻止了他们燃烧核心,他们应该不断等待信号开始处理下一帧。请注意,有一个平衡要求。如果一个工作线程需要个游戏时间来完成工作,那么渲染循环将落后并错过视频适配器帧更新。您的视频开始卡顿。这通常是不可能完全消除的,请确保它不会影响绝对游戏时钟。

音频应该是更容易解决的问题,您只需要让声卡缓冲区充满足够的数据,以便在几帧的声音中存活下来。

落后于目标 FPS 很容易确定。您可以通过降低目标 FPS 来自动对此进行补偿。所以该程序在慢速机器上仍然可以正常运行,只是不那么流畅。最终效果是您将停止在所有线程上消耗 100% 的核心。

关于c++ - 我的多线程游戏一直处于 100% CPU 状态。如何管理线程事件以减少 CPU 负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21491454/

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