实时游戏引擎如何在 Windows 上运行?

How do real-time game engines work on Windows?

我来自嵌入式背景,那里非常重视硬实时。对我来说(快速)实时在 Linux 上很棘手,在 Windows 上很可笑,喷射视频游戏似乎做得很好。

显然,因为它只是软实时,而且频率(相对)低,为 60+ Hz,简单的解决方案是尽可能快地渲染并希望最好。但是是否有任何先进的技术可以进一步增强 Windows 的响应能力?

一些具体问题:

  1. 有没有办法处理 Windows 在不利时刻抢占?当其中一些正在做其他事情时,您如何在多个内核上共享工作?
  2. Windows 中的 IO 延迟是确定性的吗?您可以(应该)迫使调度程序尽快进行上下文切换吗?
  3. 最早截止日期优先/速率单调调度(或其他)等调度技术有多普遍? (当然是建立在现有的之上)

欢迎任何见解!

编辑:

我浏览了一些资源并添加了我的结论:

1。 问:当时间关键的计算被抢占时会发生什么?

A: The thread should have higher priority so pre-emption is rare, and when it happens, the interruption should be brief (short interrupts or IO-operations).

Windows 具有将线程移动到其他内核的能力,建议您将它们保持锁定状态(-> 线程亲和性)。

2。 问:IO 操作是否应该比渲染循环具有更高的优先级?

A: Yes, Naughty Dog's engine gives IO-operation higher priority.
  1. 问:使用什么样的调度?
A: In the presentation, a job system is used (similar to reactive programming).

它使用三个不可抢占的优先级。

如果您还没有读过 Ph.D Andrew Tanenbaum 的 Modern Operating System,我建议您阅读它。他的书也有 Unix 和 Windows 体系结构。

一件最重要的事情:游戏编程不同于嵌入式编程

我曾使用 Windows 和 Android(类 Unix)。不仅Windows而且Android非常硬的渲染也满足硬实时。我们减少 CPU、GPU 延迟的技巧之一是使用较低功能的驱动程序支持视觉效果(这意味着如果硬件不支持这个新图形 API,我们将使用旧的 API所以这会使对象的形状和美感减少)或者如果设备不支持该功能并且效果不重要,只需为该设备删除此效果。它将更好地推动 FPS(每秒帧数)。

游戏引擎也是许多图形之间的区别 APIs,使用 Vulkan 或 DX12 (Windows) 或 Metal(Apple 设备)可以提高 FPS 但需要更新的硬件,因为它们很低-level APIs。它将为您提供更好的性能,比 OpenGL 或 DX11 更漂亮,但旧的 APIs 支持旧设备。

还有3个问题,我会用我的知识回答(可能有其他更好的答案):

  1. 我还有一个小问题:为什么不用threadatomicmutex C++ 11 APIs share多核任务 CPU?线程编程更简单,跨平台,无需调度。

    Windows 有经典的 Win32 线程 APIs SetThreadPriority for set the relative priority of a thread. This API isn't recommended for Windows Runtime (Modern Windows concept from Microsoft for Windows 8 and later) which recommended using thread-pool concept 代替(使用现代 API 将自动化多核并行任务,这比手动配置使用更好经典 API).

    在游戏引擎中,有 a presentation of Christian Gyrling from Naughty Dog talking concept Parallel and Sergey Makeev from Roblox implement open source TaskScheduler base this concept in Win32 APIs and Pthread APIs. Jeff Preshing from Ubisoft also have a presentation 使用 C++ 11。

  2. IO 延迟是什么意思?键盘、鼠标还是磁盘 IO?如果您将问题编辑得更清楚,我会编辑答案

  3. 我在 Windows 上找不到文档或任何类似的最早截止日期优先/速率单调调度。可能这是受 Microsoft 阻止内核模式调度的限制。