Unite 2017 干货整理 优化篇

  将Unite 2017的一些演讲做了整理。
  本篇有内存,CPU、GC、UI、渲染性能指标、Tips几个小节。
  内容持续整理中。  

内存:

  1.Model Import Setting:Read/Write Enable
  2.FBX Import Setting : Animation Type Generic ->None
  3.Texture Import Setting:Generate MipMap
  4.Audio import Setting: ios -> mp3, android ->vorbis (Force to mono)
  5.Animation Clip 60 fps ->30 fps
  6.Audio Clip Sampling rate : 40K ->20k
  7.小的音频文件采用Decompress On Load
  8.Model Import Setting : Normals & Tangents -> None
  9.去掉不必要的Alpha通道
  10.表格二进制化

  11.String使用intern处理
  12.删除相同关键帧,自动以关键帧压缩
  13.避免一些临时资源重复创建,例如www.texture
  14.拆分alpha,对于没有渐变过度的alpha图进行尺寸压缩
  15.控制Object池的使用,LRU算法
  16.Android机必须使用ETC,IOS(PVRTC)
  17.声音削减采样,尽量使用单声道或OGG格式
  18.ETC1不支持带Alpha通道压缩纹理,拆分成2张ETC
  19.模型压缩

CPU:

  1. 使用API预先编译Shader:Shader.WarmupAllShader(Shader Variant Collection)
  2. 减少更新
    ·unity animator optimize game object
    ·及时停止不必要的Update
      ·Animator
      ·ParticleSystem
    ·减少Billboard和Animation的Update操作
  3.加载
    ·使用加载队列
    ·人物分帧异步加载
    ·平衡预加载和即时加载的数量和大小
  4.耗时操作分散离散到各帧
  5.主动隐藏不在镜头内的动画对象

GC

  1.尽可能地减少new
  2.优化不合适的new
  3.使用object Pool
  4.自定义的数组分配池,重写容器类
  5.减小内存碎片
  6.减少c#语言特性上的内存分配
    ·foreach
    ·重用函数delegate
    ·string combine/split
    ·减少反射的使用
    ·封包拆包操作
  7.每帧GC建议在100k以内

UI

  1.优化Panel,动静分离,降低Draw Call
  2.针对飘字做特别优化
    ·控制频率
    ·控制数量
  3.适当降低某些UI的更新频率
  4.UI可以多线程合批,性能跟手机核心数有关
  5.UICanvas划分一般准则
    ·一个Canvas包含所有静态和不会改变的UI组件
    ·另一个Canvas存放所有动态UI组件,如果动态UI数量较大,可以继续细分

  6.射线(Raycast)优化
    ·必要的UI组件才开启"Raycast Target"
    ·开启"Raycast Targets"的UI组件越少,层级越浅,性能越好
    ·对于复杂的组件,尽量在根节点开启“”Raycast Targets"
    ·OverrideSorting属性会打断射线,可以降低层级遍历的成本

  7.字体优化
    ·预留足够的空间,避免字体出框(影响体验)
    ·避免字体打断批处理
    ·一般不建议使用best fit

渲染:

  1.减少Shader Map大小(自定义实现)
  2.减少后处理等需要的rt数量和大小
  3.按需重写默认的Shader
  4.优化复杂的Shader
    ·复杂特效的Shader需要特别优化(去除cutout,合并blend,优化指令数)
    ·使用数学手段
    ·使用Shader LOD 显示不同的效果,按机型使用vertex light和pixel light
  5.避免使用alphaTest
  6.适当增加面数,尽量减少后处理
  7.削减PS指令数,转移到VS
  8.注意不透明物体渲染顺序

  9.PC平台建议选择延迟渲染模式
  10.移动平台如果不追求极限画质,建议选择前向渲染模式
  11.如果移动平台追求画质,建议选择延迟渲染模式
    ·要注意移动设备分辨率影响
    ·给低配机器再写一条渲染管线
  12.IOS读取设备机型,安卓读取显卡型号决定渲染质量等级(可建立配置表)
    ·未知型号建立渲染等级判断方案(CPU主频,显存,FPS)
    ·可根据此等级决定Shader和特效的渲染效果

  13.用一个图集处理所有粒子
  14.控制半透明对象数量
  15.多通道Shader不会合批
  16.记得剔除不必要的背面绘制
  17.Zwrite会占用带宽
  18.混合(Blend)可能会导致Overdraw问题
  19.尽量自己写Shader
  20.控制带宽
    ·贴图过滤选项
    ·Mipmap
    ·贴图大小
    ·自定义的Buffer

  21.合并全屏滤镜
  22.尽量使用unity宏
  23.预加载shader
  24.透明
  25.自己写剔除代码
  26.自己实现阴影
  27.不再建议使用grab pass

性能指标

  1.android 2g 低端机型 20-25 fps 内存不超过350mb
  2.iOS 1g 低端机型运行20-25fps 内存不超过300mb
  3.启动过场景速度尽量控制在5秒以内

Tips:

  1.输出2800*2000以上分辨率游戏截图
    void CaptureScreenshot(string filename,int superSize = 0)

  2.并不是上PBR就会比之前效果好
  3.要出好效果需要美术和程序坐在一起细心调试
  4.PBR需要美术调整美术制作流程
  5.PBR并不会大幅度增加硬件开销

  6.配置受光面(光源方向自己传入)
  7.自己算反射源(环境光自己计算)
  8.调整Shader LOD的API:
    Shader.globalMaximumLOD
    Shader.maximumLOD

  9.使用静态分析器优化代码
    ·使用方法(VS2015以后版本)
    1.Tools->NuGet Package Manager ->Manage NuGet Packages for solution
    2.Browse -> UnityEngineAnalyzer

kisence

潮落江平未有风。