# 性能优化建议与最佳实践

本章节主要介绍,常见界面的最佳实践,性能优化策略。

阅读前,可以先浏览 二维系统的整体架构 了解大致运行机制。

通常情况下,由于大部分逻辑在客户端处理,二维部分的性能消耗并不会很高,

大部分情况下,主要的开销在:解析构建,遍历更新。

# 优化建议

# 渲染节点重用

实例化 Prefab ,会触发节点树的构建与组件反序列化赋值,会涉及到客户端组件的创建,成本相比属性更新会更高。

# 渲染节点重用实践

实例化后的 Prefab 节点回收,挂到一个非 active 的子树中,当需要使用时,将整个 Prefab移回场景。

# 遍历优化(增删节点)

二维世界通常存在大量的二维节点,某个渲染节点的增删,会影响整个二维世界渲染顺序的变更,会导致重新遍历取获取渲染队列。

# 遍历优化实践 - 动静分离

使用 UILayer组件 将频繁增删的节点区分在特定的子树中。

# 绘制优化

绘制的成本 - DrawCall数量

# 自动合批策略

客户端在渲染前,会根据相邻的渲染元素,材质(渲染类型、纹理),渲染状态(裁剪状态、混合状态),去匹配是否能进行合批,将多次渲染合成一次。

# 自动合批实践

尽可能将,同一类型,使用 同一贴图 的渲染元素,放在相邻渲染顺序。

# GC(垃圾回收)优化

由于 Javascript 的弱类型语言特性,临时对象需要回收,可能会导致游戏的掉帧。

GC时间:游戏内总对象的数目

GC频率:游戏临时对象的数目

# GC(垃圾回收)优化实践

  • 渲染组件尽可能不使用对象获取接口(position、color、...),而采用对象属性获取接口(positionX...),或只调用对象的setter。
  • 尽可能不创建临时对象,而采用全局临时对象赋值(Vector2、Color...)