Unity优化 优化一

在这里我先开个头,后面会不断更新。。。

先贴几篇优化总结的文章,多少可以吸取点知识!

http://blog.csdn.net/candycat1992/article/details/42127811



1、Draw Calls

那么什么是Draw Call呢?如果你学过OpenGL,那么你一定还记得在每次绘图前,我们都需要先准备好顶点数据(位置、法线、颜色、纹理坐标等),然后调用一系列API把它们放到GPU可以访问到的指定位置,最后,我们需要调用_glDraw*命令,来告诉GPU,“嘿,我把东西都准备好了,你个懒家伙赶紧出来干活(渲染)吧!”。而调用_glDraw*命令的时候,就是一次Draw Call。


减少Draw Calls

批处理(Batching)

Unity中有两种批处理方式:一种是动态批处理,一种是静态批处理。对于动态批处理来说,好消息是一切处理都是自动的,不需要我们自己做任何操作,而且物体是可以移动的,但坏消息是,限制很多,可能一不小心我们就会破坏了这种机制,导致Unity无法批处理一些使用了相同材质的物体。对于静态批处理来说,好消息是自由度很高,限制很少,坏消息是可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动了。

动态批处理

Unity进行动态批处理的条件是,物体使用同一个材质并且满足一些特定条件。

动态批处理虽然自动得令人感动,但它对模型的要求很多:
  • 顶点属性的最大限制为900,而且未来有可能会变。不要依赖这个数据。

  • 一般来说,那么所有对象都必须需要使用同一个缩放尺度(可以是(1, 1, 1)、(1, 2, 3)、(1.5, 1.4, 1.3)等等,但必须都一样)。但如果是非统一缩放(即每个维度的缩放尺度不一样,例如(1, 2, 1)),那么如果所有的物体都使用不同的非统一缩放也是可以批处理的。这个要求很怪异,为什么批处理会和缩放有关呢?这和Unity背后的技术有关系,有兴趣的可以自行谷歌,比如这里。

  • 使用lightmap的物体不会批处理。多passes的shader会中断批处理。接受实时阴影的物体也不会批处理。
静态批处理

把物体后面的“Static Flag”勾选上


但是静态批处理有个缺点就是会增加内存消耗,如果这类使用同一网格的对象很多,那么这就是一个问题了,这种时候我们可能需要避免使用静态批处理,这意味着牺牲一定的渲染性能。例如,如果在一个使用了1000个重复树模型的森林中使用静态批处理,那么结果就会产生1000倍的内存,这会造成严重的内存影响。这种时候,解决方法要么我们可以忍受这种牺牲内存换取性能的方法,要么不要使用静态批处理,而使用动态批处理(前提是大家使用相同的缩放大小,或者大家都使用不同的非统一缩放大小),或者自己编写批处理的方法。目前市面上的移动平台上的游戏,几乎没有用实时光照的,基本用的都是光照烘焙,因为对于大部分人而言,一个非常漂亮的光照烘焙过的场景已经足够好了,不用实时变化。而且如果你开了实时光照,基本上就和性能说byebye了。


2、不要使用实时光照

目前市面上的移动平台上的游戏,几乎没有用实时光照的,基本用的都是光照烘焙,因为对于大部分人而言,一个非常漂亮的光照烘焙过的场景已经足够好了,不用实时变化。而且如果你开了实时光照,基本上就和性能说byebye了。



你可能感兴趣的:(Unity优化,unity,优化)