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了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章