其实这是个网上视频课程,http://www.unitytrain.cn/course/18,课时1。
我想把里面的内容整出来,看网上已经有人整了,就转过来。

Unity手游优化总概

分为以下三个方面:
一、资源方面(游戏中的美术资源)
二、引擎方面优化(引擎内部有一些可以优化的选项)
三、代码方面优化(根据代码的运行方式,选择优化高效的运行代码)

一、资源方面

1> 动态物体(场景中可以移动的物体 - 游戏主角、怪物、NPC等)

  1. 控制面片数量(控制在300 - 2000之间),一般1500左右就可以做出比较好的效果。
  2. 控制Skinned mesh render(蒙皮渲染器) 为1个。这样引擎底部就会十分优化,主要是对多边形网格的更新。
  3. 控制材质数量(控制在1 - 3个)如果一个人物有3个材质,则需要进行3次绘制。通过控制材质数量可以控制人物的drawCall数量,从而提高性能。
  4. 控制骨骼数量(小于30根)骨骼越多,带来CPU的消耗就会越多。

2> 静态物体(指在场景中不会移动的物体)

  1. 控制网格顶点数(少于500个)
  2. 在unity中将静态物体在Inspector中标记为static。标记为static,unity底部就会利用static batching进行优化。

3> Animation组件

如果不需要,尽量不要附加(附加则会带来CPU消耗)。

4> 自带地形

  1. 控制地形高度小于257(地形资源比较占用内存))
  2. 地形纹理中尽量使用少的混合纹理数目(控制不要超过4个)

5> 纹理数据

  1. 纹理格式尽量采取压缩格式 好处:
    1>你会带来太多的性能消耗;
    2>缩短时间的使用 ;
  2. 纹理尺寸应该长宽小于1024
  3. 建议使用Mipmap Mipmap会增加程序的大小,增加大小为原来程序的百分之三十三,但在增大程序的前提下,会提高渲染效率。

6> 音频数据

  1. 长时间的音乐,可以使用.ogg或.mp3的压缩文件格式
  2. 短时间的音乐,可以使用.wav或.aif格式的未压缩格式

二、引擎方面优化

1> 光源设置

  1. 如果所有的灯光都会参入实时的计算,消耗的计算量是非常大的。unity会根据场景的需要对需要的灯光进行计算,这样对性能有很大的提升。因此在满足效果的前提下,控制场景中光源的数量,尽量不要添加多余的光源。
  2. 控制Important光源的数量 Important光源的含义是:实时的、永远的作用于场景中的动态物体。 设置当前光源是否是Important光源:在light中的Render Mode中选择。 控制Important的个数为1个或干脆没有。 个数越多,drawcall越多。
  3. Pixel Light Count(控制场景中非Important灯光)也就是说,在场景中有多个光源,场景中的动态物体最多受几个pixel light光源的影响,一般的设置为1 – 2个。这个参数不会影响Important光源。

2> 相机设置

设置合理的相机的剪切平面。

3> 粒子特效

  1. 屏幕上的粒子总数建议小于200个(非绝对)。
  2. 每个粒子发射器所发射的粒子总数建议不超过50个。
  3. 粒子的大小,如果可以的话,粒子的size应该尽量的小(size是指在屏幕中占用的大小)
  4. 对于非常小的粒子,在其粒子纹理中可以去除Alpha通道。

4> 物理引擎的优化

  1. 尽可能的使用Sphere Collider和Box Collider,尽量避免使用Mesh Collider。Mesh Collider在检测时会产生大量的运算。
  2. 尽可能的避免使用Alpha Test和Alpha Blend。Alpha Test的性价比比较低,可能的话,使用Alpha Blend来代替Alpha Test。将使用Alpha Test和Alpha Blend的像素数降至最低(尽量不要超过两个屏幕的像素数,否则预留给场景的性能空间会比较小)。

5> DrawCall Batching

Unity在渲染时,可以将一些物体合并,从而可以使用一个DrawCall来渲染他们,这成为DrawCall Batching。 理论上来讲,Unity Batching的物体越多,则会得到更多的渲染性能。

6> Static Batching(静态合并)

针对静态物体进行Batching, 原理:对相同材质的物体合并成一个大的顶点网格,然后根据相机的裁剪的结果来生成索引Buffer,最终显示到屏幕上。 好处:可以大大的降低drawcall 缺点:使用static batching后会额外的增加内存开销来存储Batch后的数据。

7> Dynamic Batching(动态合并)

对于相同材质的动态物体,Unity会自动对其进行Batching。无需人工干预。 原理:动态VertexBuffer + 动态IndexBuffer。 注意:1、目前仅支持小于900顶点的网格物体。 2、如果shade里使用position、normal、uv三种属性,则只能batch 300顶点以下的物体 3、如果使用了position、normal、UV、UV1、Tangent等属性,则只能batch 180顶点以下的物体 4、缩放物体无法与非缩放物体进行batch。

8> 纹理合并Texture Batching

两个物体使用的shader是一样的,但是纹理是不一样的,unity会认为这是两个不同的材质。此时我们可以把这两个纹理合并生成一个纹理,然后让两个物体的材质都使用这个相同的纹理,此时unity就会认为这两个是相同的材质,从而会对这种使用相同纹理的物体进行batching。

9> 遮挡剔除(Occlusion Culling)

三、代码优化

  1. 对于有的函数,可以每隔几秒执行一次
  2. 通过使用InvokeRepeating函数实现定时重复调用,比如,启动0.5秒后每隔1秒执行一次DoSomeThing函数:
<code class="hljs cpp has-numbering"><span class="hljs-keyword">void</span> Start() 
{ 
    InvokeRepeating(<span class="hljs-string">"DoSomeThing"</span>,<span class="hljs-number">0.5f</span>,<span class="hljs-number">1.0f</span>); 
} </code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>



  1. 尽量少使用临时变量,特别是在Update OnGUI等实时调用的函数中。
  2. 优化数学运算,避免使用float,而使用int,特别是在手机游戏中,尽量少用复杂的数据函数,比如sin,cos等函数。改除法为乘法。