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

时间:2017-11-22 04:10:31

标签: animation 3d shader

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我没有与最新的最先进的引擎保持联系,但是上次我检查时,几乎所有的游戏状态通常存储在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对游戏世界和国家都不了解。 CPU只是使用它临时存储一些可丢弃的数据,如纹理数据和来自网格和VBO的VBO,它已经有了副本,并且使用GPU可以快速地计算和输出大量可丢弃的数据。它不经常用于存储和输出持久数据。

如果我尝试提出一个简单的比喻,那就像披萨餐馆的业务经理会持续存储客户记录,例如他们的地址。他们可能会用他的快速摩​​托车暂时给披萨送货员送一个地址给顾客送披萨,但他们并不是专门留下披萨送货员跟踪每个顾客的地址,因为这样做也会导致很多来回沟通(加上那些披萨送货员可能无法记住他们提供比萨饼的每个客户地址,而经理们喜欢带有数据库的计算机来存储大量客户数据)。这主要是来自业务经理的单向沟通 - &>披萨送货员。所以它就像是,“嘿比萨饼家伙用快速摩托车,给这个地址送披萨”,以及CPU到GPU的类似事情:“嘿GPU,我真的很快就为我计算这个,这就是你需要做的数据。 “