Unreal

《盗贼之海》聚合Tick技术优化大规模场景

来自盗贼之海的分享

https://www.bilibili.com/video/av65606108

介绍解决方案

初始情况

从更新占比可以看到Tick占比非常高

其中CPU Cache是比较重要的一块

L1到L2到RAM速度越来越慢

如果Tick顺序混乱的话会反复读取,造成效率低下。

放到一起之后效率会更高

如何做?

禁用Tick,用集合注册,用UClass为Key,单个TickFunction。

更好的缓存友好,降低不必要的工作,SIMD以及向量计算友好,上下文敏感。

实际使用

要获取水面高度

我们可以看到Tick被分散在几块

如果把这些都聚合在一起?

聚合

压缩完成之后的结果

1.3倍的改良。

我们会反复获取全局服务。

我们去除组件Tick,只剩下单个Tick

实际上是做了batch

自动矢量化以及SIMD

例如上面的例子,编译器会自动进行优化,无需手动编写

效果拔群。

在不同的设备上有相同的优化趋势

如果组件更多则效果更明显

不同的设备我们需要不同的缩放

我们可以对不同的设备可以进行分帧,每一帧限制tick数量

但是会造成卡顿,失去平滑性。

我们需要做上下文敏感的优化。

在客户端上我们关注的是质量。

我们根据距离,设置tick的频率,可能看上去是下图一样。

不同设备上也使用不同的模式

另外的例子

船帆的骨骼动画

粒子系统也可以使用

使用了Tick合并的组件

缺陷

  • 必须手动处理
  • 如果在Tick时销毁一个物体会出现问题
  • 我们需要逐个编写系统
  • 不同的tick对象无法有依赖关系

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注