目錄
針對復(fù)雜模型熄云,使用簡單的碰撞器代替網(wǎng)格碰撞器
面向英特爾? x86 平臺的 Unity* 優(yōu)化指南: 第 2 部分
編輯器優(yōu)化
遮擋剔除是 Unity 的一種特性鳞滨,可幫助您剔除被攝像頭可視范圍內(nèi)其他物體遮擋的物體恤煞。我們以奇幻 MMORPG
為例來做簡單說明癞松。如果玩家前往一座具有延綿大城的巨大城堡函卒,那么您真的希望將系統(tǒng)資源用于渲染城墻內(nèi)所有被遮擋住的商店/玩家嗎适瓦?答案是否定的驯遇。遮擋剔
除可幫您解決這個問題(圖 21)。
圖 24.遮擋說明
遮擋剔除可通過整體減少繪制調(diào)用的發(fā)送來緩解 GPU 的處理壓力(如果遮擋剔除計算可相比保存驅(qū)動程序調(diào)用花費更少的時間捎琐,則可能還會減輕 CPU 負(fù)載)抑钟。 在設(shè)置遮擋剔除時,了解 Unity 使用的一些術(shù)語會比較有幫助野哭,因為這可以幫助您設(shè)置執(zhí)行剔除的場景。
遮擋物 (Occluder) – 充當(dāng)屏障的任何物體幻件,可防止對可視范圍內(nèi)被遮擋的物體(被遮擋物)進(jìn)行渲染拨黔。
被遮擋物 (Occludee) - 由于被遮擋物遮擋而無法被渲染到屏幕上的任何物體。
您碰到的大部分物體都有可能會成為被遮擋物或遮擋物绰沥,具體取決于攝像頭方向和游戲邊界篱蝇。比較值得推薦的做法是,通覽全部場景徽曲,選擇多個應(yīng)
該包含在遮擋剔除計算中的物體零截,并將其標(biāo)記為“靜態(tài)遮擋物 (Occluder Static)”或“靜態(tài)被遮擋物 (Occludee
Static)”。
圖 25.如何在檢視面板中設(shè)置遮擋物和被遮擋物
增加遮擋剔除流程的最后一步是烘培場景秃臣。
這可通過打開遮擋剔除窗口(位置:Window>Occlusion Culling)來完成涧衙。 您將會看到一個如圖 20
所示的窗口,其中具有從較高性能 / 較低準(zhǔn)確率到較低準(zhǔn)確率 / 較高性能的各種不同的調(diào)整技巧奥此。 您應(yīng)該在您的應(yīng)用中使用“最低有效量”技巧弧哎。
圖 26.遮擋窗口和調(diào)整按鈕
設(shè)置完遮擋剔除系統(tǒng)之后,請認(rèn)真設(shè)置您的遮擋區(qū)域稚虎。在默認(rèn)情況下撤嫩,Unity 將整個場景作為遮擋區(qū)域,這可導(dǎo)致沒有意義的計算蠢终。 為確保不使用整個場景序攘,需手動創(chuàng)建遮擋區(qū)域,并環(huán)繞僅包含在計算中的區(qū)域寻拂。
Unity 可支持您形象地看到遮擋剔除系統(tǒng)中的每一部分程奠。 要想查看您的相機卷、可見性線和門戶兜喻,則只需打開遮擋剔除窗口 (Window
> Occlusion Culling) 并點擊 Visualization 選項卡便可梦染。
這樣您便可形象地看到場景視圖中的所有這些要素了。
圖 27.場景視圖中的遮擋剔除可視化圖
更多信息請訪問:http://docs.unity3d.com/Manual/class-OcclusionArea.html
細(xì)節(jié)級別 (LOD) 組件可支持游戲?qū)ο笤诓煌募?xì)節(jié)級別上轉(zhuǎn)換網(wǎng)格,具體取決于物體與攝像頭的距離帕识。 LOD
特性可幫助顯著降低一個幀對內(nèi)存的要求泛粹,同時幾乎不會對視覺逼真度產(chǎn)生影響。 通過在較低的 LOD 級別上提供較少的幾何圖形肮疗,調(diào)整 LOD
可緩解輸入裝配器和頂點著色器的壓力晶姊。
您可以通過查看 Unity 分析器來確認(rèn) LOD 特性是否已啟用。 具體方式為:打開“CPU 使用”分析器伪货,并向下導(dǎo)航至 Camera.Render > Drawing > Culling们衙,然后檢查是否顯示 “LOD.ComputeLOD”。
圖 28.在 Unity 分析器中核實 LOD 的使用
您還可以使用 GPA 捕捉一個幀碱呼,選擇模型相應(yīng)的繪制調(diào)用蒙挑,然后點擊 Geometry
選項卡,進(jìn)而驗證是否啟用正確的模型愚臀。您將能夠借此清晰地看到提交的實際模型的幾何圖形以及其他有用的統(tǒng)計數(shù)據(jù)(如頂點數(shù))忆蚀。您可以驗證頂點數(shù)是否與在攝
像頭捕捉距離內(nèi)使用的理想模型相一致。
細(xì)節(jié)級別通常取決于頂點姑裂。 如果每個頂點需要過多的計算的話馋袜,則會阻礙其性能。使用移動版 Unity 著色器可顯著減少每個頂點所需的計算舶斧。 如果物體偏小或偏遠(yuǎn)欣鳖,則可在不需要這些細(xì)節(jié)時限制 LODGroup 中的頂點數(shù)。
圖 29.要想為游戲?qū)ο筇砑?LOD 組件茴厉,則需點擊 Component->Rendering->LOD Group
圖 30.在 LOD Group 中調(diào)整
圖 31.高質(zhì)量
圖 32.低質(zhì)量
陰影能夠占用大量的 GPU 性能泽台。要想了解陰影所占用的系統(tǒng)資源量,請查看 Profiler > GPU > Shadows
部分矾缓。您可以通過多種優(yōu)化方式來最大限度地提高陰影性能师痕,具體取決于您的場景布局。例如而账,如果大部分場景陰影因平行光而起胰坟,則縮短陰影距離(設(shè)置路
徑:Project Settings > Quality)可顯著提升陰影性能。 陰影距離大多與片段著色器的性能緊密相關(guān)泞辐。在 GPA
幀捕捉中笔横,您可以選擇一個從陰影貼圖中采樣的繪制調(diào)用,然后查看片段著色器執(zhí)行單元的停止/激活指標(biāo)和采樣器的讀取/寫入指標(biāo)咐吼。陰影距離值可在代碼中動態(tài)
設(shè)置吹缔。 對于點光燈來說,調(diào)整陰影分辨率有助于降低內(nèi)存帶寬開銷锯茄,因為這在移動網(wǎng)絡(luò)上成本非常之高厢塘。
以下簡要介紹了 Project Settings > Quality 提供的每種陰影選項(更多信息請參考《Unity 質(zhì)量設(shè)置指南》):
陰影過濾– 用于過濾陰影的一種方法
硬陰影 - 當(dāng)從陰影貼圖中采樣時茶没,Unity 會選擇距離最近的陰影貼圖像素
軟陰影 - 取幾個陰影貼圖像素的平均值,創(chuàng)建更平滑的陰影晚碾。 這種方法成本更高抓半,但是可以打造更自然的陰影
陰影分辨率– 生成的陰影貼圖的分辨率
如果使用多個點光燈/聚光燈,則會顯著影響其性能
陰影投射– 用于投射陰影的一種方法
穩(wěn)定 - 渲染分辨率較低的陰影格嘁,攝像頭移動時不會引起顫動
緊密配合 - 渲染分辨率較高的陰影貼圖笛求,攝像頭移動時可輕微顫動
陰影級聯(lián)– 在級聯(lián)陰影貼圖中使用的平行碎片的數(shù)量(距離觀者越近的級聯(lián)分辨率越高,以便提升質(zhì)量)
可嚴(yán)重影響平行光的性能
圖 33.未啟用任何陰影級聯(lián)
圖 34.啟用四個陰影級聯(lián)
陰影距離– 距離投射陰影的物體的最大距離
如果使用平行光糕簿,則會嚴(yán)重影響片段著色器的性能
可通過腳本動態(tài)更改
性能結(jié)果將會有所變化探入,因為 GPU 的使用取決于場景以及投射/接收陰影的物體數(shù)量。 而有一點始終至關(guān)重要懂诗,即應(yīng)該使用所需的最低質(zhì)量設(shè)置來獲得理想的外觀蜂嗽。 通常建議將默認(rèn)的陰影距離更改至一個較低的值。
圖 35.Unity Bootcamp 演示中基于陰影距離的 FPS殃恒。
要想查看 Unity 生成的陰影貼圖徒爹,您可以捕捉場景的其中一幀,然后在 GPA 幀分析器中進(jìn)行查看芋类。 前往最終的渲染目標(biāo),并導(dǎo)航至 Textures 選項卡查看陰影貼圖界阁。
圖 36.生成的級聯(lián)陰影貼圖在 GPA 幀分析器中的視圖
有時候為了達(dá)成某些特定的效果侯繁,使用多個攝像頭也能夠理解。例如泡躯,如果您想創(chuàng)造視差效應(yīng)贮竟,那么其中一種方法便是使用以不同速率移動的多個攝像頭。
但您可能沒意識到的是较剃,每個攝像頭都需要一組獨立的 Clear 調(diào)用來連接顯卡 API 和新渲染目標(biāo)咕别。如果使用 3 個攝像頭和一個 UI
攝像頭(canvas 物體需要一個額外的攝像頭)從簡單場景中捕獲其中一幀,則僅 Clear 就會占據(jù) 5.4% 的場景写穴。
圖 37.與 4 個攝像頭拍攝所得的某一場景相關(guān)的繪制調(diào)用時間表惰拱。紅色中的色彩 / 深度 / 模板清除循環(huán)。
圖形編程中有一個概念叫做過度繪制啊送,是指一個像素被不必要地繪制了多次偿短,從而導(dǎo)致顯卡資源浪費。 Unity 提供了一種方法來確定不同模型的渲染順序馋没,即渲染隊列屬性昔逗。渲染隊列屬性是一個可通過網(wǎng)格渲染器材質(zhì)進(jìn)行設(shè)置的數(shù)值。
為了解該特性的優(yōu)勢篷朵,我們來繪制一個上面具有大量物體的地面勾怒。 首先對地面進(jìn)行渲染婆排,確保半個屏幕上的每個像素點都有涉及。 接下來所有物體都將在這個地面上進(jìn)行渲染笔链。 這產(chǎn)生了許多不必要的工作段只。 在這個例子中,與任何物體接觸的任何像素都被繪制了兩次卡乾。
圖 38.通過可切換的渲染隊列排序方法(默認(rèn)或智能)所獲得的正常場景翼悴。
圖 39.在默認(rèn)的渲染隊列排序模式下使用 GPA 系統(tǒng)分析器時,同一場景的過度繪制可視化圖幔妨○惺辏灰色區(qū)域表示過度繪制。 注意误堡,之前所示屏幕截圖中的地面在形成綠色漂浮方形區(qū)之前進(jìn)行了繪制古话。
圖 40.在智能渲染隊列排序模式使用 GPA 系統(tǒng)分析器時,同一場景的過度繪制可視化圖锁施∨悴龋灰色區(qū)域表示過度繪制。注意悉抵,唯一過度繪制的部分是超出地面方形區(qū)的綠色漂浮方形區(qū)肩狂。通過認(rèn)真地手動排列問題繪制調(diào)用順序,您可以避免大量的像素計算姥饰。
光照貼圖是指針對場景中的物體傻谁,首次將所有場景燈光烘培到一個從著色器中采樣的光照貼圖(帶有預(yù)計算燈光數(shù)據(jù)的紋理),而非在著色器中動態(tài)計算燈光
值列粪。在內(nèi)存帶寬 / 采樣器的使用都不會成為阻礙的情況下审磁,這種方法可顯著提升性能。Unity 可支持您通過這種方式將燈光烘培到場景中岂座。
Unity 還支持您通過使用燈光探測器為動態(tài)物體生成烘培的燈光數(shù)據(jù)态蒂。 燈光探測器是您放在場景中的點,可對周圍的燈光和陰影條件進(jìn)行采樣费什。 當(dāng)一個動態(tài)物體經(jīng)過受燈光探測器限制的區(qū)域時钾恢,則會對這些燈光探測器產(chǎn)生的數(shù)據(jù)進(jìn)行采樣。 經(jīng)過的物體所使用的燈光/陰影值可在所有周圍探測器之間進(jìn)行插值替換鸳址。 放在場景周圍的探測器能夠形成一個三維體赘那,并在動態(tài)物體可能覆蓋的區(qū)域周圍更加密集地分散開來。
圖 41.左側(cè):Unity 生成的平行光照貼圖氯质。右側(cè):Unity 生成的密集光照貼圖募舟。(如 GPA 幀分析器所示。)
為烘培燈光數(shù)據(jù)闻察,請在檢視面板(“遮擋剔除”部分所提及的檢查框)中將所有靜態(tài)幾何圖形標(biāo)記為靜態(tài)拱礁,并將燈光探測器放在場景周圍琢锋,形成一個三維體以
覆蓋即將接收燈光數(shù)據(jù)的動態(tài)物體的所有潛在路線。 物體標(biāo)記完成并且燈光探測器到位以后呢灶,通過 Wndow->Lighting
打開光照貼圖窗口吴超,并點擊 “Bake Scene” 按鈕。
圖 42.通過光照貼圖烘培場景
您將會在窗口右下方看到一個小型加載進(jìn)度條鸯乃。烘培完成之后鲸阻,便大告成功了!您可以移除/禁用場景中不需要的所有動態(tài)燈光缨睡,但如果您在檢視面板中將燈
光標(biāo)記為“烘培”的話鸟悴,就不必費此一舉了。烘培的燈光將會自動加以應(yīng)用奖年。跟蹤場景中烘培燈光的一種簡單方法便是將其全部置于一個空白游戲?qū)ο笙孪钢睿员阍谛?/p>
要重新烘培時快速激活/停用。如果您選擇這種方式陋守,則請確認(rèn)您的光照貼圖烘培工作流模式未設(shè)置為自動模式震贵。
針對復(fù)雜模型,使用簡單的碰撞器代替網(wǎng)格碰撞器
對于可碰撞的復(fù)雜物體來說水评,使用原型碰撞器組合非常重要猩系,而不是簡單地將網(wǎng)格碰撞器投擲在一切之上。 原型碰撞器是一個簡單的三維體(容器中燥、球體寇甸、盒裝等),而網(wǎng)格碰撞器是您試圖啟用碰撞的網(wǎng)格褪那。 如果可能的話,請選擇原型碰撞器式塌,而非網(wǎng)格碰撞器博敬。
圖 43.三個原型碰撞器用于這種大型結(jié)構(gòu)。其性能遠(yuǎn)超網(wǎng)格碰撞器峰尝。