unity的arm优化阅读要点

扩展阅读

ice cave 的demo

https://www.youtube.com/watch?v=gsyBMHJVhXAs

通用

project Setting

  • Pixel Light Count
  • Texture Quality
  • Antialiasing
  • Soft Particles
  • Anisotropic Texture
  • Shadows
  • Realtime Reflection Probes
  • Cubemap Resolution
  • Culling Mask
  • Cubemap Updating

Coroutines

优先使用coroutine代替invoke

避免使用硬编码

  • Tag
    if(gameObject.CompareTag("Player"))
    {
    }
    

减少物理计算的次数

通过修改 Fixed Timestep来降低物理更新的频率

移除空的方法

void Awake()
{

}

避免在每帧中使用GameObject.Find()

这个方法在unity有比较高的消耗,最好是在Start之类的方法中缓存起来使用

使用stringBuilder

string.format+进行字符串拼接产生的消耗远大于stringbuilder,所以尽量使用stringbuilder来进行字符串拼接。

使用CompareTag代替Tag的直接比较

if (obj.CompareTag(tagName))
{

}

使用对象池

减低GC和发热

使用OnBecameVisibleOnBecameIncisible来降低不可见物体的计算

可以有效地降低渲染和逻辑的压力

sqrMagnitude进行Vector大小比较

因为开根的计算量比较大,如果只是比较大小,完全可以不开根比较

使用数组优于ArrayListList

因为数组是连续空间,效率更优(在确定长度的情况下)

使用planes作为碰撞目标

如果粒子只需要和平面的物体产生碰撞,将粒子的Collision类型改为Planes会大大地降低计算

使用原始碰撞器组合(非mesh碰撞)

如果不需要太细腻的碰撞表现,可以使用简单的unity提供的碰撞原型进行拼接

GPU

使用静态合批

使用 4X MSAA

ARM对4X MSAA的底层支持

使用LOD

LOD 降低渲染负载

避免在shader中使用一些高消耗的函数

  • pow()
  • exp()
  • log()
  • cos()
  • sin()
  • tan()

lightmaps 和 light probes

光照环境,实时消耗最大,其次是light probes,最优是lightmaps

ASTC的压缩格式

目前ios的不考虑太老的机器,都可以直接使用ASTC的格式 但是android还是有不少机器目前还没有支持ASTC的,所以android最好还是使用ETC2

图片格式

  • ui不用开启mipmaps 使用mipmap能很好提升展示效果和游戏的性能(内存换时间)

阴影

  • Shadow Resolution
  • Shadow Distance
  • Shadow Cascades

遮挡剔除

  • 使用OnBecameVisibleOnBecameInvisible

制定渲染的顺序

Arm的部分gpu提供了一种Pixel Forward Kill的机制

使用深度预通道

Pass {
    Zwrite On
    ColorMask 0
}

资源优化

  • 为静态图片关闭Read/Write

    降低内存消耗

  • 合并mesh以达成降低 Draw call

    手动合并mesh需要注意合并的大小

  • 尽量避免mesh的Read/Write

    mesh占用的内存

  • 使用图集

    图集能很好地降低draw call 需要注意:如果改动到mainTextureScalemainTextureOffset,会导致构建另一张新的材质。但是可以通过修改mesh.uv来实现

shader的优化

Mali 的离线shader编译工具

  • shader的数据分析
  • 减少算法复杂度
  • 加载/存储流线<–>纹理流线

其他可优化项

  • 避免register 的溢出
  • 静态对象使用世界空间的法线

自定义shader