我对应用程序(CPU端)与GPU端之间的界限感到困惑。有人可以帮我理解应用程序在游戏中通常负责的内容吗?
我的理解是应用程序提交GPU渲染帧,这个过程涉及顶点着色器,光栅化和像素着色器(以最基本的渲染形式)。这让我相信GPU没有关于帧到帧发生什么的概念。
这是否意味着应用程序正在跟踪所有对象在世界空间中的位置?如果用户移动一个角色(例如),应用程序是否确定新位置,从而向GPU提交新变换?
这很令人困惑,特别是因为我读到顶点着色器可以用于变形之类的东西,这基本上是基于两个静态姿势随时间推移模型的动画。
答案 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,我真的很快就为我计算这个,这就是你需要做的数据。 “