Rap*_*eat 0 c++ windows multithreading boost-thread
我有一个DirectX游戏,在双核系统上产生2个增强线程:1个用于游戏/渲染(通常在四核CPU上分成自己的线程),以及另外1个程序生成游戏世界的线程.我相信我的音频中间件也会产生自己的线程来播放SFX和音乐.
游戏总是在CPU上运行100%,这反过来可能会导致音频系统的一些溅射.我希望通过更好地管理Generation Thread的活动来减少CPU负载.虽然有时我需要它全速运行,但有时候(当玩家没有移动太多时)它只是不断更新而不是真的做了很多.
是否可以/建议手动管理线程的活动程度?如果是这样,我可以用什么策略来做到这一点?我一直看到人们说睡眠()功能并不是真的推荐,但我真的不知道还有什么可做的.
或者,我是通过尝试从线程管理中挤出循环来咆哮错误的树,我会通过传统的分析/优化更好地服务吗?
获得100%的处理器利用率意味着您没有游戏时钟.您可能正在以机器允许的速度渲染帧.如果使用多个线程,仍然很难准确地获得100%,这表明您不同步线程.
这可能需要非常激烈的重写.速度应该由主渲染循环设置,即将后缓冲区复制到视频适配器的循环.它设置您的目标FPS,每秒帧数.不常见的是,您使用显示器的垂直消隐间隔,通过确保显示器在正确的时间更新来解决撕裂问题.这会自动使渲染循环达到监视器刷新率.通常在LCD显示器上每秒60次.计时器是另一种选择.这可以防止主线程烧掉100%核心,假设它可以跟上FPS.
你现在有一个稳定的游戏时钟滴答,需要发生事情的离散时刻和需要完成的工作才能更新游戏状态.就像检查玩家输入一样.在渲染循环中,检查鼠标/键盘/控制器输入并使用您获得的任何内容来更新游戏世界对象.
反过来确定工作线程需要做什么.他们将有一次通过渲染循环的持续时间来完成他们需要完成的工作.您使用同步对象来唤醒它们.另外一个,让他们发出信号表示他们已完成当前的游戏循环滴答.这阻止了他们烧掉核心,他们应该不断地等待信号开始在下一帧工作.请注意,存在平衡要求.如果工作线程需要多个游戏标记来完成工作,那么渲染循环将落后并错过视频适配器框架更新.你的视频开始口吃了.这通常是不可能完全消除的,确保它不会影响绝对游戏时钟.
音频应该是更容易解决的问题,你只需要保持声卡缓冲区充满足够的数据,以保持几帧的声音.
落后于目标FPS非常容易确定.您可以通过降低目标FPS自动补偿.因此,程序仍然可以在慢速机器上运行,但不是那么顺利.净效应是你将停止在所有线程上刻录100%核心.
| 归档时间: |
|
| 查看次数: |
818 次 |
| 最近记录: |