优化,老生常谈。 游戏优化与网站和软件优化没有任何不同。 除了编码的质量和使用方法以外,是那些空间时间、效果性能的老做法。
带有*标记的东西是极其重要的优化手段,即使没有用也要理解。
调试工具介绍静态
个人资料
内存优化【合适的垃圾回收】GC有两种触发方式: 1内存不足自动触发,双手动触发。
首先在内存不足时自动进行GC,反复进行了测试,但不是什么好方法。 内存不足的话cpu的压力也会变大,所以GC之前会发生纸箱现象,GC的时候会发生更严重的纸箱现象。 最好的方法还是手动GC。 但是,一定要设计触发条件。 因为过于频繁的GC也会影响性能。
函数优化【使用for循环减少foreach】foreach涉及迭代器的使用,但据说每个循环生成的迭代器会带来24字节的垃圾。
(【不直接访问gameobject的tag属性】(例如if(object.tag==“target”)为if ) object.compare tag (“target”) ) )
【使用对象池实现对象复用】通过将场景中的对象放入池中调用,节省了重复实例化的开销
减少GetComponent方法调用组件】脚本中三个Transform组件的调用方式在响应时间上有很大的不同。 如果按照时间对应的毫秒数的大小排列,就会变成这样。 getcomponentransform=60 msmytransformcache
因此,您应该复用对组件的引用,而不是每次都使用GetComponent。
*【仅执行相机视野内的物体的脚本】使用void OnBecameVisible (和void OnBecameVisible ),减少相机业务外脚本执行的开销。 这两个函数分别由当前物体是在摄影机范围内还是远离摄影机范围触发。
【尽量使用内置值,减少new开销】使用数组内置值,如Vector3.zero,而不是new vector (0,0,0 )。
【位置、旋转、缩放的数值请使用低精度】设定位置的旋转和缩放时,请不要使用高精度的变换。 会发生模型抖动的问题。
贴图、材质优化【纹理大小最好的2的整数幕】【使用纹理贴图集】类似于前端的精灵图。 使用包含许多子贴图的大贴图,而不是一系列小贴图。 加载效率提高,批量处理变得容易。
必须使用Renderer.sharedMaterial代替Renderer.material
【减少透明物体的使用】透明没有打开深度写入,会导致过驱动。
【使用共享材质】共享材质可以减少材质的数量,便于批量处理。
必须使用Renderer.sharedMaterial代替Renderer.material
【纹理压缩】unity综合了纹理压缩的方法。 按质量水平选择就可以了。 但是,压缩质量越高,画质越差。 GUI最好不要压缩。 质量的影响很明显。
【使用方法步骤】
单击地图文件- inspector-default-compression,然后选择压缩质量
*【使用多层淡入度纹理MipMap】与模型细节相似,分阶段生成多个低精度贴图,根据需要使用适当的贴图。 缺点是增加了内存占用量,优化了典型区域的交换时间。
【操作步骤】
映射文件-单击“生成映射映射-应用”。
此时,单击Sprite Editor打开窗口,然后拖动右上角的拉杆即可看到结果。
优化照明*【减少照明、灯光纹理烘焙或使用灯光探测器】如果对物体使用了多个过程的着色器,则使用照明很可能会降低性能。 这是因为实时照明会生成更多的计算量,动态批处理和静态批处理还不可用。
1使用灯光纹理烘焙技术(GI,bake )预先将灯光烘焙到一个灯光纹理,然后映射与运行时对应的纹理以实现照明效果。 这样不仅性能变好,效果也变好。 但是,物体有必须静态设置的缺点。 对移动的物体来说不太合适。
2此时,使用“光探测器”是一种好方法
3如果需要使用更多的实时灯光,也可以将其替换为逐顶点灯光。
【减少实时阴影】使用烘焙将静态物体的阴影信息存储在灯光纹理中,并仅对动态物体使用合适的实时阴影。
模型优化【尽可能删除隐藏面】可以减少顶点和三角面的处理。 例如我们的照相机在阳台上,附近高楼林立。 那么,实际上需要前、左、右面的只有前面几层。 远处的大楼不需要左边和右边的面。 因为看不见。
【合并消息】优化网格合并、材质合并和批处理
【减少顶点】建模时尽量减少模型的顶点。 根据触发动态静态批处理的规则,简单着色器模型的顶点数必须小于900。 如果着色器同时使用顶点位置、法线和UV值这三个属性,则模型中的顶点数必须小于300。 着色器同时使用顶点位置、法线、UV0、UV1和切线向量这五个属性时
则模型顶点数必须小于180。 *【减少模型缩放(Scale)】模型缩放会导致创建新的Batch。不利于动态、静态批处理
【不使用mesh collider】尽量使用cube collider 等内置colliser。性能会提高很多
*【使用模型的LOD (Level ofDetail )】使用模型的多级细节技术,在不同的距离使用不同精度的模型、材质。提升cpu、gpu型能,加重内存负担。典型的空间换时间优化技术。
*【使用遮挡剔除( Occlusion Culling )】 *【使用动态批处理(Baches,Saved by batching)】【使用条件&步骤】
场景中存在多个相同模型。如果不是多个相同模型,则批处理无意义。模型顶点数必须小于900。如果着色器同时使用顶点位置、法线、UV值三种属性则模型顶点数必须小于300。如果着色器同时使用顶点位置、法线、UV0、UV1、切向量五种属性则模型顶点数必须小于180。不能进行缩放 Scale。每次调整模型的大小都会产生新的Batch。不能修改材质。每次修改材质都会缠身新的Batch。不能使用lightmap(烘焙光照贴图),除非是先烘焙,后实例化物体。多通道的shader会妨碍批处理操作。比如,几乎unity中所有的着色器在前向渲染中都支持多个光源,并为它们有效地开辟多个通道材质勾选 “Enable Gpu instancing” *【使用静态批处理】【使用条件&步骤】
点击目标物体,在Inspector窗口勾选Static。
要注意静态批处理不允许改变位置
相比较其他内置shader,mobile性能更好
【尽量把计算放在对象或逐顶点着色器中】优化对象数量 > 顶点运算 > 像素运算。
尽量不要把运算拖在片源元色器中计算。
1 float 计算速度最慢,适合存储顶点坐标,在顶点着色器中使用。
2 half 计算速度快些,适用纹理坐标等变量。
3 fixed 计算速度最快,适用于颜色变量和归一化后的方向矢量,适合在片元着色器中使用。
与模型的 LOD 技术类似, Shader的LOD技术可以根据条件启用shader片段,当Shader 的 LOD 值满足条件设才会渲染。
【根据硬件性能和平台,调整效果方案】根据不同的硬件性能,选择性的启用特效。
【尽量不要关闭深度测试】由于被遮挡的物体无法通过深度测试,就不会再进行后面的渲染处理。
*【控制绘制顺序队列】从前往后绘制,比从后往前绘制性能好的多。这是因为深度测试的存在减少了被遮挡部分的绘制。
【从前往后绘制的队列 - 不透明物体(Opaque)】
Shader中渲染队列值小于2500的对象都被认为是不透明(Opaque)的物体。如“Background"、“Geometry”、“Alpha Test”。
【从后往前绘制的队列 - 透明物体(Transparent)】
Shader中渲染队列值大于2500的对象都被认为是透明(Transparent)物体。如"Transparent"、"Overlay"等
尽可能地把物体的染队列值设置大于2500从而实现从前向后的渲染提升性能。
【优化粒子效果的CD】
当一个特效包含多个粒子系统时,需要设置不同的layear 才能成功减少cd。
例如一个特效包含3个粒子单位,默认情况下 当该特效同时出现3次时 cd的数量就会变为3*3 = 9
,但如果将每个粒子特效的OrderInLayer设置为不同的层级,就可以成功将cd数量控制在 3
Build settings -> compression Method中设置压缩
*【摄像机视锥剔除( Occlusion culling)】剔除掉那些不在摄像机的视野范围内的对象,从而避免不必要的计算。
【用法&步骤】
点击摄像机 -> Inspector窗口 -> Camera组件 -> 勾选Occlusion Culling。
剔除掉那些被其他物体遮挡的看不到的物体,从而提升性能。
【用法&步骤】
unity工具栏 -> Windows -> Rending -> Occlusion culling -> Occlusion窗口 -> 作相关设置 -> Bake
指定特效作用范围,不要设置ervay thing。这是因为比如GUI之类的东西没有必要被计算。
【gui和场景使用不同的摄像机渲染】GUI由于其特殊性大多需要设置成透明。如果GUI与场景物体一同西汉时,并且屏幕占比太多,就会造成很多不必要的overdraw。
可以用两个相机分别渲染ui和场景。
降低屏幕分辨率是 非常有效 的性能优化手段。尤其对于大屏幕低配置的设备。这时可以使用等比例缩小屏幕分辨率的方法来适当优化。用部分效果来换取性能山的提升
【用法&步骤】
对咯对咯忘记renderBuffer了
这个东东在渲染重复图形的时候会有高额的性能提升。基本原理就是将某一模型存入buffer,在目标位置重复调用渲染该buffer。比如地上的草。可以设置以人为中心,不断重复渲染预置范围内的草显示。 一个比较有名的例子就是和平精英手游。魁梧的纸飞机趴在草中的时候你会草遮挡,但远处的人看你的时候,你就是趴在光秃秃的地上。有人误认为是lod技术,那是不对的。这个就是renderbuffer的典型应用。
unity官方移动平台优化文档
unity性能优化