这是一个GPU游戏
“DOP”与 "ECS架构",这两者都是针对 CPU 的性能压榨,而 CPU 硬件的性能发展,早就没法大规模的提升单核性能,只能靠提升核心数量。而在很多实际应用的情况下,对核心数量的提升,远不如增加一点点单核频率提升的性能多。即使我们很多的逻辑,都可以通过多线程来分担主线程的压力,但是,对于游戏逻辑与渲染所需要的庞大计算量,多线程也依然负担不了。
所以为了解决这个问题,GPU 这个天生擅长大规模并行计算的硬件就必须去分担大量的 CPU 计算任务。
以下为我们游戏中,GPU 分担的传统游戏需要在 CPU 上处理的计算任务(不解释技术细节)
动态遮挡剔除 由于在屏幕外的对象是不需要渲染的,所以我们通过 GPU 来筛选哪些对象满足条件需要渲染,大致流程就是将场景所有对象的 Position + ID 数组创建为一个 GPU Buffer,同时声明一个 ID Buffer 来存筛选出来的所有对象 ID 数组,最后将它们全部传入我们写好的 Culling Compute Shader,这样我们就通过 GPU 的计算,获得了经过遮挡剔除后的数据
骨骼动画 由于我们项目的可动单位数量是以万计的,那么 CPU 是不可能负担得起如此天量的计算任务的(10多个骨骼节点,乘以上万单位,就有几十万骨骼节点需要每帧计算,CPU 是不可能驾驭得了的),所以我们通过自己编写的动画编辑器,生成我们自己的骨骼动画格式,在游戏运行时将它们全部转换成 GPU Buffer,在最后渲染那一步,根据实时传入的数据,再在Shader中计算具体的骨骼位置和骨骼旋转,当这些流程走完之后,我们几乎零性能开销的成本达成了通过 CPU 计算骨骼动画同样的效果。
说回 GPU 的本质工作,渲染,我们游戏一样的把性能优化做到了极致。
众所周知,目前市面上 NFT 都是由多部件构成的,动不动就是10000+个独一无二的 NFT,而对于不一样的物件渲染,传统的渲染方式就是每一个对象提交一次drawcall(Cpu 将 渲染任务提交到 GPU),drawcall 的开销是非常大的,而经过我们对渲染流程和渲染资源的定制化处理,几万不同单位的游戏场景所需要的 drawcall 数量也不过100多次。
经过上述努力,我们的游戏就能够呈现数以万计的不同单位同时播放不同动画施放不同技能,而游戏体验依然丝滑。
Last updated