贴图优化:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.贴图格式设置,尺寸应为4的倍数(如64*64,128*128,256*256 等等)
2.贴图如果可以不带Alpha(透明像素)尽量避免Alpha(透明像素),如避免掉某些立绘的4个圆角
3.Android平台设置为RGB ETC 4bits,Compressor Quality设置为Best
4.iOS平台设置为RGB PVRTC 4bits,Compressor Quality设置为Best
5.带Alpha的图片考虑RGB和A存到两张图上分别压缩,在Shader中分开采样。其中RGB图看需求可用RGB16 bits或PVRTC 4bits,A图可把alpha存在RGB通道中用pvrtc 4 bits压缩或用Alpha8 bits格式
6.2D图不开启mipmap,3D图开启mipmap。如UI及正交镜头下的用的图片去掉mipmap,而场景贴图,模型贴图等在透视镜头下会近大远小的用上mipmap
7.开启mipmap的图片开启StreamingMipMap,qualitysetting中开启texturestreaming 并为高、中、低配置设置合理的memorybudget :高:100,中:60,低:40
8.TextureQuality 高FullRes 中、低是Half Res,极低是Quarter Res
8.统一关闭图片的Read/Write Enable(会使内存翻倍),如果后期有用到的再单独开启
9.如果一些大图,考虑到包体或者下载可以考虑用png或jpg格式,并且后缀为.bytes或其它,避免被unity压缩,在runtime的时候用Texture2D.LoadImage()加载
10.九宫,平铺,在保证效果的前提下让图片尺寸尽量的小
11.大的对称图,考虑切1/4,或1/2来减少图片尺寸。用的时候镜像拼接
12.裁剪掉图片周围的透明像素,需要对中心点的可以做成prefab
网格优化:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.减少顶点数, 视游戏类型而定
同屏三个左右(高精度人物),高配:2.3万面, 中配:1.2万面, 低配:0.8万面
2.统一关闭Mesh的Read/Write Enable(会使内存翻倍),如果后期有用到的再单独开启
3.编译期的static batching会生成多余的mesh在包中用运行期的UnityEngine.StaticBatchingUtility.Combine(staticBatchRoot);代替
4.配合美素设置meshCompression
5.Normals&Tangents的是否用到,用不到不导入
6.总面数控制建议值 高配:40万面 中配:25万面 低配:15万面
7.阴影用低面数模型产生阴影;更低要求的用投影平面实现;更更低要求用一个mesh面片实现;
动画优化:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.容错范围 position, rotation, scale
2.制作多个AnimationController,包含不同的animation,如果只用到idle和run,那么我们加载的AnimationController里面只包含这两个动作的动画
3.项目配置优化:
4.Strip EngineCode和Managed Stripping Level
5.x86
代码优化: 尤其是底层代码和固定间隔执行的代码以及其它容易频繁执行的代码~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.Log做好开关,避免运行时的大量Log输出,频繁输出LOG的公共类,用具体的宏开关
2.减少函数调用,降低本身的开销,用x = (x > 0 ? x : -x);代替x = Mathf.Abs(x)
3.尽量避免在Update函数中写代码,更不要写一个Update的空方法,用间隔稍微长点的协程代替
4.避免 yield return new WaitForSeconds(1f); 对class的new
5.少调用Getcomponent,特别是在循环中,应该在循环前Getcomponent,用循环中直接使用
6.不要直接访问gameObject的tag属性。比如if (go.tag ==“human”)最好换成if (go.CompareTag (“human”))。因为访问物体的tag属性(每次Object.name也会分配39B的堆内存.)会在堆上额外的分配空间。如果在循环中这么处理,留下的垃圾就可想而知了。
7.string/StringBuilder,避免string的拼接,toString的调用,
8.切换场景后调用 UnityEngine.Resources.UnloadUnusedAssets(); System.GC.Collect();释放内存
9.战斗中特效,常用ICON,常用模型用对象池的处理
10.对象池缓存的数量大小,可以根据机器配置设定
11.Unity3d5.x中foreach循环已经不在有GC了,可以放心的用
12.减少C#和Lua之间的调用次数,Lua全局变方法定义为local再使用,减少去_G中的的查询开销,Lua用完c#对像后设置为nil,少用闭包
13.避免使用LINQ,因为有内存分配
14.减少接口调用中的new 用ref使用外部new好的变量
15.用BoxCollider,SphereCollider代替MeshCollider
16. 使用 int.MaxValue,string.Empty,Vector3.zero,Vector3.one
17.用泛型代替object的装箱、拆箱, 但泛型编译成il2cpp后内存比较大
18.Lua中的
CPU优化:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.drawcall 合批和GPU Instancing, MaterialPropertyBlock 使用减少材质的生成,及合批(动态,静态,UI中的合批,避免交叉)
2.物理
3.GC 对象池
4.代码质量
5.FPS
6.关闭垂直同步
GPU优化:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.减少模型顶点
2.图片格式设置(压缩,mipmap,Read/Write透明区,)
3.overdraw
4.LOD, HLOD(远处物体的合批),Lod动态加载mesh
5,FPS
6.粒子优化, 减少中,低配置的特效质量
7.透明物体,灯光,雾效,
8.shader 优化(mobile shader ,pass 数,float, half, fixed, 复杂计算,效果允许的情况下能到尽量在vert中代替frag中运算)
9.ShaderWarmup
10. alpha test 中部分低端机上的性能问题 clip函数