扩展阅读
- 开发资源
- 其他
- GPU PRO
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和发热
使用OnBecameVisible和OnBecameIncisible来降低不可见物体的计算
可以有效地降低渲染和逻辑的压力
sqrMagnitude进行Vector大小比较
因为开根的计算量比较大,如果只是比较大小,完全可以不开根比较
使用数组优于ArrayList和List
因为数组是连续空间,效率更优(在确定长度的情况下)
使用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
遮挡剔除
- 使用
OnBecameVisible和OnBecameInvisible
制定渲染的顺序
Arm的部分gpu提供了一种
Pixel Forward Kill的机制
使用深度预通道
Pass {
Zwrite On
ColorMask 0
}
资源优化
- 为静态图片关闭
Read/Write降低内存消耗
- 合并mesh以达成降低 Draw call
手动合并mesh需要注意合并的大小
- 尽量避免mesh的
Read/Writemesh占用的内存
- 使用图集
图集能很好地降低
draw call需要注意:如果改动到mainTextureScale和mainTextureOffset,会导致构建另一张新的材质。但是可以通过修改mesh.uv来实现
shader的优化
Mali 的离线shader编译工具
- shader的数据分析
- 减少算法复杂度
- 加载/存储流线<–>纹理流线
其他可优化项
- 避免register 的溢出
- 静态对象使用世界空间的法线
自定义shader
PREVIOUSUnity的性能优化之路
NEXTUnity内存检查