代码之家  ›  专栏  ›  技术社区  ›  Colin

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

  •  3
  • Colin  · 技术社区  · 7 年前

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

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

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

    这让人困惑,尤其是因为我读到顶点着色器可以用于变形之类的事情,变形基本上是基于两个静态姿势随时间为模型设置动画。

    1 回复  |  直到 7 年前
        1
  •  4
  •   user4842163 user4842163    7 年前

    我没有接触过最新的最先进的引擎,但上次我检查时,几乎所有的游戏状态通常都存储在CPU上,数据更经常从CPU写入GPU,而不是像以前那样频繁地读回。

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

    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,快帮我计算一下,这是你需要做的数据。”