![]() |
1
4
我没有接触过最新的最先进的引擎,但上次我检查时,几乎所有的游戏状态通常都存储在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,快帮我计算一下,这是你需要做的数据。” |
![]() |
Ahmed Zaidan · 快速ui转换无法按预期工作 1 年前 |
|
Armand · 为什么我的图像与另一个图像相交时不会被删除 1 年前 |
![]() |
Frakcool · 满足条件时,SwiftUI动画背景颜色更改 2 年前 |
![]() |
Ancross · 为什么我的小CSS动画不会触发? 2 年前 |
|
C.Bernabei · 灯丝动画混合 2 年前 |
![]() |
Neo78 · CSS动画将返回其原始位置,但不应该 2 年前 |
![]() |
Wikson · 我想在滚动时启动JS函数 2 年前 |