扩展阅读
- 开发资源
- 其他
- 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/Write
mesh占用的内存
- 使用图集
图集能很好地降低
draw call
需要注意:如果改动到mainTextureScale
和mainTextureOffset
,会导致构建另一张新的材质。但是可以通过修改mesh.uv
来实现
shader的优化
Mali 的离线shader编译工具
- shader的数据分析
- 减少算法复杂度
- 加载/存储流线<–>纹理流线
其他可优化项
- 避免register 的溢出
- 静态对象使用世界空间的法线
自定义shader
PREVIOUSUnity的性能优化之路
NEXTUnity内存检查