一.内存
内存方面主要是不适当的操作造成内存泄露,使得无法及时释放或不能释放已经不再使用的内存,使得减少可用内存的数量从而降低计算机的性能,比如引发频繁的GC,引发频繁内存申请等
减少资源泄露:1.避免一次性堆内存的过大分配2.及时Dispose非托管堆上不再使用的内存3.注意c#的闭包使用4.静态变量并不会被GC回收5.避免ab包冗余:存在一些没有使用或重复打包的资源6.场景切换时及时卸载旧资源
二.渲染
DrallCall
每次CPU准备渲染数据发送给GPU进行处理和渲染的操作。
1.批处理
如果多个对象使用了同一个材质,则unity会一次性将使用了同一材质的对象绘制信息传递给GPU进行批处理,这极大减少了CPU和GPU之间的频繁交互,所以在开发过程中尝试要让多对象共用同一材质,批处理分为静态批处理和动态批处理, 静态合批发生在场景编辑界面。动态合批发生在游戏运行的时候。
1.1动态批处理
如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理,将物体的顶点信息变换到世界空间,合并这些使用了同一个共享材质的网格顶点数据,形成一个新的大网格,然后传给显存,直接渲染这个大网格就相当于渲染了所有的被合并的小网格,而这只需要一次DrawCall。
对顶点属性个数有限制,顶点数量小于900,相同材质的对象必须使用同一个缩放尺寸多通道(Pass)的shader
打断批处理:
物体中夹杂着不同材质的物体
有lightmap的物体(有灯光渲染和没灯光渲染)
多个pass的shader会破坏批处理
1.2静态批处理(无法移动,静止,不适合大量重复的物体) 获取顶点和三角形索引数据
勾选static,在开始阶段把需要静态批处理的GameObject进行一次网格合并操作,将顶点数据变换到世界空间下,将顶点数据保存起来,再次渲染时,直接使用保存的数据增加渲染速度,
主要减低渲染状态切换次数,不减低dracall,会占用更多内存
打断批处理:
使用Renderer.material将会造成一份材质的拷贝,应该使用Renderer.sharedMaterial
物体中夹杂着不同材质的物体
有lightmap的物体
其他减少DrallCall的方法
- 减少实时光照和实时阴影
- 打图集,同一画面的图片放入一个图集中
- 调整渲染顺序,使用相同材质的物体渲染顺序相同
- 使用TextMeshPro实现图文混排(使用富文本在文本框里实现图片+文字)
2.Mipmap
使用Mipmap后,贴图会根据摄像机距离的远近,选择使用不同精度的贴图。
缺点:会占用内存,因为mipmap会根据摄像机远近不同而生成对应的八个贴图,所以必然占内存!
优点:会优化显存带宽,用来减少渲染,因为可以根据实际情况,会选择适合的贴图来渲染,距离摄像机越远,显示的贴图像素越低,反之,像素越高!
3.遮挡剔除
在摄像机内的显示,不在的不显示,勾选ocluder static
4.GPU Instance
生成相同实例,合批Mesh网格
5.Canvas
采用多个Canvas实现静态分离,减少OverDraw