3D 游戏中的 CPU 和 GPU:谁在做什么?

Col*_*lin 4 3d shader animation

我对应用程序(CPU 端)与 GPU 端之间的界限感到困惑。有人可以帮助我了解应用程序在游戏中通常负责什么吗?

我的理解是应用程序提交帧供GPU渲染,这个过程涉及顶点着色器、光栅化和像素着色器(最基本的渲染形式)。这让我相信 GPU 不知道帧与帧之间发生了什么。

这是否意味着应用程序正在跟踪所有对象在世界空间中的位置?例如,如果用户移动角色,应用程序是否会确定新位置并因此向 GPU 提交新转换?

这很令人困惑,特别是因为我读到顶点着色器可用于变形之类的事情,这基本上是基于两个静态姿势随着时间的推移对模型进行动画处理。

小智 5

我没有与最新的最先进的引擎保持联系,但上次我检查时,几乎所有的游戏状态通常都存储在 CPU 上,并且数据更频繁地从 CPU 写入到 GPU,而不是几乎同样频繁地回读。

这甚至可以包括存储在 CPU 上的冗余数据(而不是谈论驱动程序的作用)。例如,引擎可能会在 CPU 和 GPU 中存储三角形网格,同时将网格保留在 CPU 中以执行视锥体剔除、碰撞检测和拾取等操作。造成这种冗余的原因之一是因为在某些情况下用 GPU 代码编写大量游戏逻辑即使不是不可能,也太困难了。例如,您可能能够在 GPU 端加速碰撞检测的某些部分,但您无法使物理系统完全用来自物理系统的 GPU 推送事件编写,以便音频系统在碰撞事件上播放声音(GPU无法与音频硬件通信)。另一个是 GPU 通常在内存方面受到更多限制,例如,因此 CPU 除了存储一些游戏地图之外,还可能存储游戏地图的所有图像(我将硬盘驱动器称为“CPU 内存”)。 GPU 上冗余的活动纹理数据(并且纹理可能根据情况使用较低的分辨率)。

GPU 仍然是一个非常专业的硬件。毕竟,您甚至无法在 GPU 上编写 Pong,因为它无法直接从键盘、鼠标、游戏手柄读取用户输入,或者播放音频,或者从硬盘驱动器加载文件,或者类似的东西。CPU仍然像协调一切的“主脑”。

至于补间和蒙皮之类的事情,通常是在 GPU 上计算的,但这与“状态管理”不同。CPU 可能仍然存储骨骼层次结构中每个骨骼的矩阵,然后将这些矩阵和未变形的顶点位置发送到 GPU,让它动态计算内容。在这种情况下,游戏状态并不是在 GPU 上存储/管理,而是让 GPU 在每帧的基础上动态计算数据,在这些情况下它可以超快地完成任务,甚至不需要持久地存储在第一位。在这些情况下,CPU 甚至不会读回结果数据。

通常,GPU 不会太多用于管理状态。它更常用于在适合的情况下快速快速地计算事物。如果那里存储了状态,那么它通常是可以丢弃和重新生成的临时状态,因为 CPU 已经有足够的数据来执行此操作。一个例外是我见过的一些 GPGPU 软件,它们实际上只在 GPU 上存储一些应用程序状态,而在 CPU 上没有任何副本,CPU 从 GPU 读取的数据多于向 GPU 写入的数据,但我认为游戏不会正在做同样多的事情。

所以在大多数情况下,是的,GPU 通常会忽略游戏世界和状态。CPU 只是使用它临时存储一些可丢弃的数据,例如来自网格和图像的纹理数据和 VBO,它已经拥有副本,并使用 GPU 快速计算和输出大量可丢弃的数据。它不经常用于存储和输出持久数据。

如果我尝试做一个粗略的类比,就像披萨店的业务经理会持续存储客户记录(例如他们的地址)。他们可能会暂时给披萨送货员一个地址,让他用他的快速摩​​托车将披萨送货给顾客,但他们不会完全让披萨送货员跟踪每个顾客的地址,因为这会导致太大量的来回沟通(加上那些披萨送货员可能无法记住他们将披萨送货到的每一个客户地址,而经理则拥有带有数据库的计算机来存储大量客户数据)。这主要是业务经理->披萨送货员的单向沟通。所以这就像是,“嘿,骑着快速摩托车的披萨家伙,去把披萨送到这个地址”,对于 CPU 到 GPU 来说也是类似的事情:“嘿 GPU,快去帮我计算一下,这是你需要做的数据。 ”