gpt4 book ai didi

c# - 如何编码以获得适当的 CPU 使用率?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:20 30 4
gpt4 key购买 nike

请耐心等待,这可能有点难以解释清楚。我试图理解如何编写一个只使用它需要的 CPU 数量的程序。解释起来有点困惑,所以我将使用一个真实的例子。

我制作了一个具有无限主游戏循环的俄罗斯方 block 游戏。我已将其限制为 40 fps。但是循环仍然每秒执行数千甚至数百万次。它只会在经过足够的时间将其限制为 40 fps 时呈现。

因为我有一个 4 核 CPU,当我运行游戏时,一切都很好,游戏运行良好。但游戏进程的 CPU 使用率保持在 25%。这是意料之中的,因为它是一个无限循环并持续运行。

然后我在线阅读以向主循环添加 1 毫秒的延迟。这立即将使用率降低到 1% 左右或更少。这很好,但现在我故意在每个循环中等待 1 毫秒。它之所以有效,是因为我的主循环执行时间要少得多,而且 1 毫秒的延迟不会影响游戏。

但是如果我制作更大的游戏呢?具有更长和更多处理器密集型循环的游戏。如果我需要 1ms 的时间片来顺利运行游戏怎么办?然后,如果我删除延迟,处理器将再次跳到 25%。如果我添加延迟,游戏会很慢并且可能会有一些延迟。

在这种情况下,理想的解决方案是什么?真正的游戏/应用程序是如何编码来防止这个问题的?

最佳答案

由于您在标签中列出了三种不同的语言,因此我将保持笼统,不提供代码示例。

一般来说,为了避免消耗 CPU,从不有一个不是每次迭代的循环:

  • 做有用的工作
  • 根据循环计数器跳过
  • 或调用一些阻塞调用,阻塞 I/O 或线程 wait()

sleep() 是阻塞调用的一个示例,但正如您所观察到的那样,在许多情况下它有点令人困惑。

所以:

while(true) {
if(some_condition) {
foo();
}
}

... 不好。 (我的一个 friend 曾经用这样的代码让共享大型机崩溃)

您需要找到对您的显示 API 的调用,该 API 在垂直同步之前会一直阻塞。我相信 DirectX,如果设备设置正确,device.Present() 就是这样一种调用。

在单线程游戏中,逻辑可能是这样的:

 while(game is active)
read user input
calculate next frame
blocking call to display API

因此,CPU 得到休息,每次都等待垂直同步。

更常规的做法是至少有两个线程,一个处理渲染循环,另一个处理游戏状态。在那种情况下,渲染循环需要像以前一样等待垂直同步。游戏状态循环需要阻塞,直到渲染循环准备就绪。

渲染线程循环:

  while(game is active)
notify()
prepare_frame(game_state)
blocking call to display API

游戏状态线程循环:

  while(game is active)
read user input
update game_state
wait(display_loop_thread)

一定要了解线程等待/通知/加入才能理解这一点。

此模型允许您拥有其他线程,这些线程也会影响游戏状态。例如,另一个线程可能控制一个 AI 敌人。

另一种方法是使计算成为事件驱动的,并在 vsync 之后触发它们:

 while(game is active)
calculate next frame
blocking call to display API
gameLogic.onFrame()

如果 onFrame() 完成的时间超过一帧,那么游戏的帧率将受到影响。这是否重要取决于游戏;解决方案超出了本答案的范围——如果这对您很重要,那么可能是时候购买一本关于视频游戏架构的书了。

关于c# - 如何编码以获得适当的 CPU 使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24261155/

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