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

4

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

我的理解是应用程序提交帧以供GPU渲染,这个过程涉及顶点着色器、光栅化和像素着色器(在最基本的渲染形式中)。这使我相信GPU没有关于从一个帧到另一个帧发生了什么的概念。

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

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

1个回答

5
我不知道最新的先进引擎的情况,但上次我查看时,几乎所有游戏状态通常存储在CPU上,数据更经常从CPU写入GPU,很少读回。
这甚至可能包括存储在CPU上的冗余数据(不谈论驱动程序)。例如,引擎可能会在CPU和GPU中都存储三角形网格,在CPU中保留网格以执行胁迫剔除、碰撞检测和拾取等操作。这种冗余的原因之一是因为在GPU代码中撰写大部分游戏逻辑将非常困难,有些情况下可能不可能。例如,您可能能够在GPU端加速一些碰撞检测的部分,但您无法使完全由GPU编写的物理系统推动来自物理系统的事件,以便音频系统播放碰撞事件的声音(GPU无法与音频硬件通信)。另一个原因是GPU在内存方面通常更受限制,例如,CPU可能会在游戏地图中存储所有图像(我将硬盘视为“CPU内存”),除此之外还存储某些活动纹理数据的冗余GPU上(根据情况纹理可能使用较低的分辨率)。
GPU仍然是非常专业化的硬件。毕竟,您甚至无法在GPU上编写Pong游戏,因为它不能直接从键盘、鼠标、游戏手柄读取用户输入或播放音频,或从硬盘加载文件等。CPU仍然像“主脑”一样协调一切。
至于Tweening和Skinning之类的东西,通常在GPU上计算,但这不像“状态管理”。CPU可能仍会存储骨骼层次结构中每个骨骼的矩阵,然后只需将这些矩阵和未变形的顶点位置发送到GPU并让其根据需要动态计算。在这种情况下,不是在GPU上存储/管理游戏状态,而是让GPU在每帧基础上实时计算数据,这些数据不需要首先持续存储。在这些情况下,CPU甚至没有读取返回结果的数据。
通常,GPU并不经常用于管理状态。更多地是在适当的情况下,用于快速计算实时数据。如果有状态存储在那里,它通常是可以丢弃并重新生成的临时状态,因为CPU已经具有足够的数据来这样做。一个例外是我见过的一些GPGPU软件,他们实际上完全将一些应用程序状态存储在GPU上,没有在CPU上任何副本,并且CPU进行了更多的从GPU读取而不是写入操作,但我认为游戏并没有这么做。
大多数情况下,GPU通常对游戏世界和状态并不了解。CPU只是暂时使用它来存储一些可丢弃的数据,例如来自已经有副本的纹理数据和网格图像的VBO,并使用GPU计算和快速输出许多一次性的数据。它并不经常用于存储和输出持久数据。
如果我试图想出一个粗略的比喻,就像披萨店的企业经理会持续地存储客户记录,例如他们的地址。他们可能会暂时将客户地址提供给骑着快速摩托车的披萨外送员,以便向客户交付披萨,但他们不会完全依靠外送员追踪每个客户的地址,因为那会导致太多的来回沟通(此外这些披萨外送员可能无法记住他们交付披萨的每一个客户地址,而经理则拥有能够存储大量客户数据的电脑数据库)。这在很大程度上是单向通信:企业经理->披萨外送员。所以类似于CPU对GPU:"嘿GPU,快速为我计算这个并提供所需的数据"。

1
非常感谢您提供的深入解释,它确实有助于澄清事情。 - Colin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接