在這裏我先開個頭,後面會不斷更新。。。
先貼幾篇優化總結的文章,多少可以吸取點知識!
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了。