Unity3D性能优化

    技术2022-07-17  82

    https://blog.csdn.net/leonwei/article/details/18042603

    1.不是每个主流手机都支持的技术(就是如果可以不用就不用或有备选方案)

    屏幕特效动态的pixel光照计算(如法线)实时的阴影

    2.优化建议

    - 渲染 1.不使用或少使用动态光照,使用light mapping 和 light probes(光照探头) 2.不使用法线贴图(或者只在主角身上使用),静态物体尽量将法线渲染到贴图 3.不使用稠密的粒子,尽量使用UV动画 4.不使用fog,使用渐变的面片(参考shadow gun) 5.不要使用alpha-test(如那些cutout shader),使用alpha-blend代替 6.使用尽量少的material,使用尽量少的pass和render次数,如反射、阴影这些操作 7.如有必要,使用Per-Layer Cull Distances,Camera.layerCullDistances 8.只使用mobile组里面的那些预制shader 9.使用occlusion culling 10.远处的物体绘制在skybox上 11.使用drawcall batching: 对于相邻动态物体,如果使用相同的shader,将texture合并 对于静态物体,batching要求很高,详见Unity Manual>Advanced>Optimizing Graphics Performance>Draw Call Batching 12.批处理: 1)动态批处理:要求比较高,对面数、定点数、材质球都有要求 2)静态批处理:把不动的物体标记为static,相同材质球、相同预设体 13.减少模型数量,骨骼数,面片数 14.减少场景的大小,树,草 15.灯光烘焙光照探测 16.遮挡剔除Occlision 17.LOD、MipMap(会增大内存) 18.减少透明效果,反射效果 19.减少不必要的层级:打包图集最好不要超过1024*1024 20.使用序列帧动画代替粒子系统(增大内存)

    规格上限: 1.每个模型只使用一个skinned mesh renderer 2. 每个mesh不要超过3个material 3.骨骼数量不要超过30 4.面数在1500以内将得到好的效率

    - 物理 1.真实的物理(刚体)很消耗,不要轻易使用,尽量使用自己的代码模仿假的物理 2.对于投射物不要使用真实物理的碰撞和刚体,和自己的代码处理 3.不要使用mesh collider,使用简模代替 4.在edit->project setting->time中调大FixedTimestep(真实的物理的帧率)来减少cpu损耗

    - 脚本编写 1.尽量不要动态的Instantiate和Destroy Object,使用Object Pool 2.尽量不要在Update函数中做复杂计算,如有需要,可以隔n帧计算一次 3.不要动态的产生字符串,如Debug.Log(“boo”+“hoo”),尽量预先创建好这些字符串资源,如字符串拼接使用System.Text.StringBuilder代替string的相加操作 4.Cache一些东西,在Update里面尽量避免Search,如GameObject.FindWithTag("")、GetComponent这样的调用,可以在Start中预先存起来使用全局变量 5.尽量减少函数调用栈,用x=(x>0?x:-x)代替x=Mathf.Abs(x) 6.不要在函数中new一个表,可以设置为全局变量多次使用,或使用pool.Get/pool.Add 7.使用for循环代替foreach,使用List代替ArrayList尽量少使用装箱拆箱的操作 8.可以break掉的循环直接退出,减少不必要的循环 9.少使用复杂运算,如除法、开平方根、反余弦,可以使用+、*代替 10.FixedUpdate等频繁调用的方法可以扩大间隔,可以使用协程、Invokerepeating 11.使用对象池减少对GC的使用 12.Dll,减少使用多余的类库,使用小的类库

    https://blog.csdn.net/Blues1021/article/details/71104680?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase 13.例如:obj.transform.position=pos可以写成静态导出函数可以换成 class LuaUtil { static void SetPos(GameObject obj,float x,float y,float z) { obj.transform.position=new Vector3(x,y,z); } }

    - shader编写 1.数据类型 fixed/lowp-for colors,lighting information and normals half/mediump-for texture UV coordinates float/highp-avoid in pixed shaders,find to user in vertex shader for position calculations 2.少使用的函数:pow,sin,cos等

    - GUI 不要使用内置的OnGUI函数处理gui,使用其他方案,如NGUI

    3.格式

    1.贴图压缩格式:ios上尽量使用PVRTC,android上使用ETC

    Processed: 0.012, SQL: 9