- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 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/
我有一个在 Android 市场上相当流行的应用程序,它允许数以万计的用户按下一个按钮并向它发出语音命令。然后我就可以做很多不同的事情,比如给他们提供当前的天气预报等等...... 无论如何,我的应用
令人惊讶的是,标题基本上解释了它。我们有一个我们的客户制作的页面,我们正在重新创建该页面。 页面高度会一直增加,直到(我假设是这样)浏览器达到它的极限。我已经尝试过 Firebug 和 W3 验证器,
我是 react-native 的新手,试图创建我自己的组件,但它一直显示一个空屏幕。 这是我的组件代码 class BoxComponent extends Component { cons
我正在为我的 PHP 元素创建一个非常简单的博客,但遇到了一个简单的问题。我无法让我的页眉图像一直 float 。我有一个横幅,左边有一些文字,我有一个 1px 的切片,在可以选择的任何分辨率的宽度上
为什么我可以在另一个 Controller 的 View 中访问一个 Controller 的辅助方法?有没有办法在不破解/修补 Rails 的情况下禁用它? 最佳答案 @George Schreib
我正在使用带有最新 ADT 插件的 Eclipse Kepler SP2。每隔一分钟 Eclipse 就会说“为 Android 4.4.2 加载数据”并阻止我想做的一切。我在不同的文件夹中有几个 E
我是一名优秀的程序员,十分优秀!