12個優化Unity/GearVR應用的小技巧 比起那些普通應用,VR應用所需的計算性能要求大了太多,讓優化成爲了一項重要工做。若是你的目標是相似 Gear VR 這種移動設備,那麼要求會更高。異步
如下爲一些基本的標杆:編輯器
➜➜單眼 50 個繪製調用(Draw Call)。Unity5 更加精準地稱之爲口令設置程序調用(setpass calls)。 ➜➜少於50000-100000個頂點數以及50000-100000個多邊形數量。 確實是很嚴苛的要求,而這裏有一些小技巧來助你一臂之力。性能
靜態批處理(Static batching) 在一個場景裏,可能有一堆靜態幾何圖形,好比牆、椅子、燈光和各類靜止網格(Mesh)。你能夠在編輯器裏把它們標成靜態。確保將他們標記成靜態光源映射來獲得烘焙好的光照貼圖紋理。被標記成靜態的物品會被組成一個網格,而非每繪製一次物品就產生調用。 但靜態批處理有一個關鍵的要求:全部物品必須都有一樣的材質。若是你有木頭材質的靜態牆壁和一個鋼鐵材質的靜態椅子,全部牆壁會被組合成一個網格,消耗一個繪製調用,而椅子則也會有一個網格,佔用另外一個繪製調用。優化
紋理集合(Texture atlasing) 如上文所說起,每一個不一樣材質都會至少致使一個新的繪製調用。你可能會覺得一個木頭門和鐵椅子必須使用不一樣的材質,畢竟它們使用了不一樣的紋理。可是,若是它們 能使用一樣的着色器,你可使用紋理集合來建立一個材質,同時兼容這兩個物體。一個紋理集合其實就是一個大紋理貼圖,裏面包含了各類各樣的小紋理。你可讓某個材質加載幾個紋理而非讓一堆材質加載一堆紋理。每一個物體都能經過不一樣的紋理映射來加載這個紋理集合上不一樣座標位置的一小片紋理。 你能夠手動去作這個事,而做爲參考,Juan Sebastian’s Pro Draw Call Optimizer 很是有用。它能自動生成紋理集合,而不會干擾你的 assets。動畫
動態批處理(Dynamic batching) 移動的非靜態物品也能被動態批處理爲單一繪製調用。這對於 CPU 來講開銷較大,每幀都通過計算,但就優化最終結果來講仍是不錯的。不過要注意的是這隻對低於 900 個頂點並有着一樣材質的物體纔有用。使用紋理集合來爲你的動態物體建立一個單一材質,而後你就能獲得簡單的動態批處理了。設計
多細節層次(Level Of Details) 多細節層次組也是一個提高表現的簡單方式。使用擁有多個細節層次的 assets 並讓離鏡頭遠的物體採起低細節的幾何圖形進行渲染。Unity 能自動在攝像頭和物體之間的距離發生改變時過渡到不一樣的細節層次。 填充率,重複繪製,過濾剔除(Fillrate、overdraw and culling) 下降重複繪製,不要讓遠處物體的像素被繪製了後,近處覆蓋在這個像素的物體上面時又繪製了一次。對於平時在PC上倒不是太所謂,但對於移動VR,這也是性能開銷啊。大量的重複繪製和高分辨率影響了你的填充率,而紋理填充率也是GPU的限制之一。 目前,解決方式包括遮擋剔除(occlusion culling)和層次視錐剔除(frustum culling)。層次視錐剔除能將攝像機視野錐體外的東西都剔除掉,畢竟渲染那些你根本沒有看着的東西毫無心義。而遮擋剔除則是不渲染那些被擋住的物體,好比門後的房間,沙發後的桌子什麼的。默認狀態下遮擋剔除能搞定你的整個當前場景,但若是關卡設計得當,整個關卡都能被剔除掉。 多細節層次組也能剔除掉離攝像頭太遠的物體,以進一步下降填充率。遊戲
關卡設計(Level design) 若是你的遊戲是讓玩家從一個房間(地區)到另外一個房間(地區),那基本的方式就是讓整個遊戲只在一個關卡中。但這樣會致使太高的內存開銷 – 每個房間內的物體和材質都會被加載到內存裏,即使在當前場景中是不可見的。因此,將房間放到不一樣的關卡里,經過代碼設計來分開加載。內存
異步加載(Asynchronous loading) 當玩家快要接近到加載下一關的門時,加載下一關。不要同時使用Application.LoadLevel(),這會致使遊戲暫停卡頓。即使頭部跟蹤只停了一小會,也會讓玩家很是不適。 所以,採起Application.LoadLevelAsync()。關於範例你能夠查看Oculus Mobile SDK 下的BlockSplosion樣品,在StartupSample.cs裏。文檔
光照烘焙(Baked lighting) 關閉實時陰影!獲得實時陰影的物體將沒法被批處理,致使大量的額外繪製調用的開銷。 在PC上,你能僅經過單一的即時方向光來獲得不錯的動態陰影,但在移動端,請用烘焙好的光照,不要用實時陰影。it
陰影(Shadows) 尤爲對於移動體驗來講,請對立體物品的陰影使用之前那些小技巧。半真實的陰影能夠經過在物體下面增長一個平面模糊灰色圖形來達到。 好比,千萬不要用這種高端電腦才能搞定的GTA V實時動態陰影。 但你能夠用相似這種:下圖來自2002年的GTA罪惡城市,只是在人物下面增長了一個模糊的小圓球而已。
光照探針(Light probes) 當使用烘焙好的光線後,那些動態物品看起來違和感很高,而靜態物品很是好。解決的辦法之一就是經過光照探針來模擬動態光源。 光照探針是烘焙好的立方體貼圖,在場景中的各個點上存儲直接、間接乃至發散的光線。當動態物體移動時,它會提取最近的幾個光照探針的樣品來模擬在那個部位的光線。這是模擬真實光線而無需依賴昂貴的實時光線的方式。 Unity提供了一個不錯的文檔來告訴你應該如何放置光照探針。 避免透明和多材質物品 使用透明着色器的物品,好比玻璃、窗戶等都很是昂貴。還有一些專門讓物品看起來更真實的方式,好比在牆壁前增長一層鏽色或灰塵透明的材質等等。這類多材質alpha融合都很是昂貴,每一個材質都會增長一個繪製調用。可是,多紋理就無所謂了,因此你應該只用一個材質,並用一個能夠經過alpha融合來融合多個紋理的着色器。
蒙皮網格渲染器(Skinned mesh renderers) 蒙皮網格渲染器在渲染那些有動畫部件的角色時比較經常使用,能經過物理或定製的動畫來達到真實的網格變形。 不幸的是,蒙皮網格渲染器不會被整合進批處理中去。每一個場景裏的角色都會致使單眼增長几個繪製調用。