来自盗贼之海的分享
https://www.bilibili.com/video/av65606108
介绍解决方案
初始情况
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-53.png)
从更新占比可以看到Tick占比非常高
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-54.png)
其中CPU Cache是比较重要的一块
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-55.png)
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-56.png)
L1到L2到RAM速度越来越慢
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-57.png)
如果Tick顺序混乱的话会反复读取,造成效率低下。
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-58.png)
放到一起之后效率会更高
如何做?
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-59.png)
禁用Tick,用集合注册,用UClass为Key,单个TickFunction。
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-60.png)
更好的缓存友好,降低不必要的工作,SIMD以及向量计算友好,上下文敏感。
实际使用
要获取水面高度
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-61.png)
我们可以看到Tick被分散在几块
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-62.png)
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-63.png)
如果把这些都聚合在一起?
聚合
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-64.png)
压缩完成之后的结果
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-65.png)
1.3倍的改良。
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-67.png)
我们会反复获取全局服务。
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-68.png)
我们去除组件Tick,只剩下单个Tick
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-69.png)
实际上是做了batch
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-70.png)
自动矢量化以及SIMD
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-71.png)
例如上面的例子,编译器会自动进行优化,无需手动编写
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-72.png)
效果拔群。
在不同的设备上有相同的优化趋势
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-73.png)
如果组件更多则效果更明显
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-74.png)
不同的设备我们需要不同的缩放
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-75.png)
我们可以对不同的设备可以进行分帧,每一帧限制tick数量
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-76.png)
但是会造成卡顿,失去平滑性。
我们需要做上下文敏感的优化。
在客户端上我们关注的是质量。
我们根据距离,设置tick的频率,可能看上去是下图一样。
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-77.png)
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-78.png)
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-79.png)
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-80.png)
不同设备上也使用不同的模式
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-81.png)
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-82.png)
另外的例子
船帆的骨骼动画
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-83.png)
粒子系统也可以使用
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-84.png)
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-85.png)
使用了Tick合并的组件
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-86.png)
缺陷
![](http://www.resetoter.cn/wp-content/uploads/2020/10/image-87.png)
- 必须手动处理
- 如果在Tick时销毁一个物体会出现问题
- 我们需要逐个编写系统
- 不同的tick对象无法有依赖关系