1. 程式人生 > >unity 效能優化之遮擋剔除(Occlusion Culling) 官方版

unity 效能優化之遮擋剔除(Occlusion Culling) 官方版

遮擋剔除 (Occlusion Culling) 功能可在物件因被其他物體遮擋,當前在相機中無法看到時,禁用物件渲染。該功能不會在三維計算機圖形中自動開啟,因為在大部分情況下,離相機最遠的物件最先渲染,離相機近的物件覆蓋先前的物體(該步驟稱之為“重複渲染 (overdraw)”)。遮擋剔除 (Occlusion Culling) 與視錐體剔除 (Frustum Culling) 不同。視錐體剔除 (Frustum Culling) 只禁用相機視野外的物件渲染,不禁用視野中被遮擋的任何物體的渲染。注意,使用遮擋剔除 (Occlusion Culling) 功能時,仍將受益於視錐體剔除 (Frustum Culling)。


未開啟遮擋剔除 (Occlusion Culling) 時渲染的場景


開啟遮擋剔除 (Occlusion Culling) 時渲染的相同場景

遮擋剔除過程將使用虛擬相機構建潛在可見物件集的層級檢視,應用於整個場景。執行時各相機使用這些資料來確定可見和不可見物體。有了該資訊,Unity 將確保僅傳送可見物件進行渲染,從而減少繪製呼叫的次數,提高遊戲效能。

遮擋剔除的資料由單元格組成。每個單元格是場景中整個包圍區域的細分部分。更具體來說,單元格組成一個二叉樹。遮擋剔除 (Occlusion Culling) 使用兩棵樹,一個用於檢視單元格 (View Cells)(靜態物件 (Static Objects)),另一個用於目標單元格 (Target Cells)(移動物件 (Moving Objects))。檢視單元格 (View Cells) 對映到定義可見靜態物件的索引列表,使靜態物件的剔除結果更精確。

建立物件時要切記這一點,因為物件大小需要與單元格大小達到良好平衡。理論上說,單元格不應比物件小太多,同時物件也不應占用太多單元格。有時可以將大物件分成幾個小塊,改善剔除效果。也可以合併一些小物件,減少繪製呼叫。只要都在同一個單元格內,遮擋剔除就不會受影響。單元格集合和確定哪些單元格可以在任何其他單元格中可見的可見性資訊被稱為 PVS(潛在可見集合 (Potentially Visible Set))。

設定遮擋剔除 (Occlusion Culling)

如需使用遮擋剔除 (Occlusion Culling) 功能,須手動設定一些項。首先,關卡中的幾何體必須分成幾個大小適中的部分。這也有助於佈置關卡中被牆壁、建築物等大物件相互遮擋的明確定義的小區域。所用原理為單個網格根據遮擋資料開啟或關閉。如果有一個物件包含室內所有傢俱,那麼整套傢俱要麼全被剔除,要麼全不被剔除。這與為每件傢俱製作網格一樣沒有多大意義,以便每件傢俱都能根據相機視點被單個剔除。

須在檢視器 (Inspector) 中將想要成為遮擋的一部分的所有場景物件標記成靜態遮擋物 (Occluder Static)。最快的操作方法為選擇多個想要加入遮擋計算的物件,將其標記為靜態遮擋物 (Occluder Static) 和靜態被遮擋物 (Occludee Static)。

標記物件的遮擋 (Occlusion) 情況

應在什麼時候使用靜態被遮擋物 (Occludee Static)?不會遮擋其他物件的透明物體及也不太可能遮擋的小物件應標為被遮擋物 (Occludees),而不是遮擋物 (Occluders)。也就是說考慮這些物件被其他物件遮擋,其本身不視為遮擋物,幫助減少計算任務量。

遮擋剔除視窗 (Occlusion Culling Window)

對於處理遮擋剔除 (Occlusion Culling) 的大部分操作來說,建議使用遮擋剔除視窗 (Occlusion Culling Window)(視窗 (Window)->遮擋剔除 (Occlusion Culling))。

在遮擋剔除視窗 (Occlusion Culling Window) 中,可處理遮擋物網格及遮擋區域 (Occlusion Areas)。

如果處在遮擋剔除視窗 (Occlusion Culling Window) 的物件 (Object) 選項卡並在場景中選擇了某網格渲染器 (Mesh Renderer),可修改相關靜態 (Static) 標誌:


網格渲染器 (Mesh Renderer) 的遮擋剔除視窗 (Occlusion Culling Window)

如果處在遮擋剔除視窗 (Occlusion Culling Window) 的物件 (Object) 選項卡並選定遮擋區域 (Occlusion Area),可處理相關的遮擋區域 (OcclusionArea) 屬性(如需瞭解更多資訊,請參閱遮擋區域 (Occlusion Area) 部分)。


遮擋區域 (Occlusion Area) 的遮擋剔除視窗 (Occlusion Culling Window)

注意:如果預設不建立任何遮擋區域,遮擋剔除將應用到整個場景。

注意:只要相機位於遮擋區域外,遮擋剔除就不會應用。設定遮擋區域 (Occlusion Area) 覆蓋相機可能出現的位置非常重要,但會把區域放的太大,烘培時耗費效能。

遮擋剔除 (Occlusion Culling) – 烘培 (Bake)


遮擋剔除檢視器中的烘培選項卡。

屬性

技術 (Technique) 選擇遮擋剔除烘培的型別
僅限 PVS (PVS only) 只有靜態物件會被遮擋剔除。動態物件僅根據檢視視錐體進行剔除。該技術的 CPU 耗費最小,但由於動態物件不會被剔除,僅推薦動態物件和角色很少的遊戲採用。所有可見性經過預計算,所以執行時無法開啟或關閉入口。
PVS 和動態物件 (PVS and dynamic objects) 靜態物件使用預計算可見性進行剔除。動態物件使用入口剔除。該技術可有效平衡執行時消耗過大和剔除效率。所有可見性經過預計算,所以執行時無法開啟或關閉入口。
自動生成入口 (Automatic Portal Generation) 入口為自動生成。靜態物件和動態物件通過入口剔除。允許執行時開啟和關閉入口。該技術能最精確地剔除物件,但 CPU 的效能消耗也最大。
檢視單元格大小 (View Cell Size) 每個檢視區域單元格的大小。值越小,精確的遮擋剔除越多。該值是遮擋精確度和儲存大小的折衷。
近裁剪平面 (Near Clip Plane) 近裁剪平面 (Near Clip Plane) 應設為用於遊戲中所有相機的最小近裁剪平面。
遠裁剪平面 (Far Clip Plane) 遠裁剪平面 (Far Clip Plane) 用於剔除物件。距離大於該值的所有物件都將自動被遮擋。(應設為用於遊戲中所有相機的最大遠裁剪平面。)
記憶體限制 (Memory limit) 提示基於 PVS 的烘培,自動生成入口 (Automatic Portal Generation) 模式中不可用。

調整完這些值後,可單擊烘培 (Bake) 按鈕開始處理遮擋剔除 (Occlusion Culling) 資料。如果對結果不滿意,可單擊清除 (Clear) 按鈕刪除之前計算出來的資料。

遮擋剔除 (Occlusion Culling) – 視覺化 (Visualization)


遮擋剔除檢視器中的視覺化選項卡。

近平面和遠平面定義用於計算遮擋資料的虛擬相機。如果不同的近平面或遠平面有幾個相機,應使用所有相機中最小的近平面距離和最大的遠平面距離,以正確包含物件。

場景中的所有物件都影響包圍區域的大小,請儘量將所有物件都包含在場景的可視界限內。

準備好生成遮擋資料時,單擊烘培 (Bake) 按鈕。記得選擇烘培 (Bake) 選項卡中的記憶體限制 (Memory limit)。值越低,生成速度越快,準確性越低;高值用於生成接近釋出效果的質量。

請記住,構建遮擋資料所需的時間由單元格級別、資料大小和選擇的質量決定。Unity 將在主視窗底部顯示 PVS 生成的狀態。

處理完成後,應該可以在檢視區域 (View Area) 看到一些彩色立方體。彩色區域將共享相同的遮擋資料。

如果想移除所有預計算的遮擋剔除 (Occlusion Culling) 資料,請單擊清除 (Clear)。

遮擋區域(僅限專業版)

要對正在移動的物件應用遮擋剔除,您必須建立一個遮擋區域 (Occlusion Area) 並將其大小修改為與正在移動的物件將要被定位的空間匹配(當然,正在移動的物件不能被標記為靜態的)。您可以通過將遮擋區域 (Occlusion Area) 元件新增到空白遊戲物件(在選單中選擇元件 (Component) -> 渲染 (Rendering) -> 遮擋區域 (Occlusion Area) 來建立遮擋區域 (Occlusion Area)。

建立遮擋區域 (Occlusion Area) 之後,請勾選目標體積 (Is Target Volume) 複選框來遮擋正在移動的物件。


用於正在移動的物件的遮擋區域 (Occlusion Area) 屬性。

屬性: 功能:
大小 (Size) 大小 (Size) 定義遮擋區域 (Occlusion Area) 的大小。
中心 (Center) 設定遮擋區域 (Occlusion Area) 的中心。預設情況下,中心的座標為 0,0,0,且位於盒子中心。
目標體積 (Is Target Volume) 定義相機可能的位置。要遮擋位於此遮擋區域 (Occlusion Area) 中的靜態物件,請勾選此項。
Is Target Volume 當您想遮擋正在移動的物件時,請選擇此項。
目標解析度 (Target Resolution) 決定此區域中的遮擋剔除的精確度。此項會影響遮擋區域 (Occlusion Area) 中單元的大小。請注意:此項僅影響目標區域 (Target Area)。
低 (Low) This takes less time to calculate but is less accurate.
中 (Medium) 此設定能平衡處理遮擋剔除資料的精確度和花費的時間。
高 (High) 此設定花費的計算時間更長,但精確度也更高。
非常高 (Very High) 當您需要的精確度比高解析度的精確度更高時,請使用這個值。但請注意,此設定需要的計算時間更長。
極高 (Extremely High) 當您想對可移動物件進行幾乎完全的遮擋剔除時,請使用這個值。請注意:此設定需要很長的計算時間。

新增遮擋區域 (Occlusion Area) 之後,您需要看一看它是如何將盒子分為單元的。要檢視是如何計算遮擋區域 (occlusion area) 的,請選擇編輯 (Edit) 並單擊遮擋剔除預覽面板 (Occlusion Culling Preview Panel) 中的檢視 (View) 按鈕。 in the

測試已生成的遮擋

設定好遮擋後,您可以通過啟用遮擋剔除 (Occlusion Culling)(位於視覺化 (Visualize) 模式下的遮擋剔除預覽面板 (Occlusion Culling Preview Panel) 中)並在場景檢視中四處移動主相機 (Main Camera) 來測試它。


場景檢視 (Scene View) 中的遮擋檢視 (Occlusion View) 模式

隨著您四處移動主相機 (Main Camera)(無論是否在播放 (Play) 模式下),您會看到各種物件禁用它們自己。您需要找出的是遮擋資料中的所有錯誤。如果您在移動的時候看到物件突然彈入檢視中,這就是一個錯誤。如果這種情況發生,您可以通過改變解析度(如果您正在用目標體積屬性播放)或四處移動物件以覆蓋錯誤來修復此錯誤。要除錯遮擋的問題,您可以將主相機 (Main Camera) 移到有問題的位置進行聚光燈檢查

處理完成後,您會在檢視區域 (View Area) 看到一些彩色的立方體。藍色的立方體表示目標體積 (Target Volume) 的單元劃分。白色的立方體表示見體積 (View Volume) 的單元劃分。如果引數設定正確,您會看到一些未被渲染的物件。這是因為這些物件要麼在相機的視見體外要麼被其他物件遮擋住了。

如果遮擋完成後場景內沒有任何物件被遮擋,那麼您可以將物件拆分成更小的塊,以便它們能被完全地包含在單元中。

遮擋門戶

為了建立執行時間可以開啟和關閉的遮擋基元,Unity 使用遮擋門戶 (Occlusion Portal)。

屬性: 功能:
開啟 (Open) 表明門戶是否開啟(可編寫指令碼)
中心 (Center) 設定遮擋區域 (Occlusion Area) 的中心。預設情況下,中心的座標為 0,0,0,且位於盒子中心。
大小 (Size) 定義遮擋區域 (Occlusion Area) 的大小。

相關推薦

unity 效能優化遮擋剔除Occlusion Culling 官方

遮擋剔除 (Occlusion Culling) 功能可在物件因被其他物體遮擋,當前在相機中無法看到時,禁用物件渲染。該功能不會在三維計算機圖形中自動開啟,因為在大部分情況下,離相機最遠的物件最先渲染,離相機近的物件覆蓋先前的物體(該步驟稱之為“重複渲染 (overdraw)

Unity3D-遊戲場景優化遮擋剔除Occlusion Culling的使用

在大型3D遊戲場景中,如何優化遊戲效能是非常重要的一步。一般遮擋剔除是非常常用的。接下來我們看看如何使用遮擋剔除。 假設這是一個遊戲場景。 下面這是相機的視口,相機的視覺是看不到很大立方體後面的那些小的立方體。   在運行遊戲的過程中,我們為了提高遊戲的效能,我們不希望渲染相機看不到的物體。

遮擋剔除Occlusion Culling與視錐體剔除Frustum Culling是否可以同時起作用?

可以的 Occlusion Culling is a feature that disables rendering of objects when they are not currently seen by the camera because they are

Android效能優化檢視篇渲染機制

** 本篇重點是——–如何解決過度繪製 ** 眾所周知的Android系統每隔16ms重新繪製一次activity,也就是說你的app必須在16ms內完成螢幕重新整理的所有邏輯操作,這樣才能達到60幀/s。而使用者一般所看到的卡頓是由於Android的

Unity效能優化程式碼優化

對於Unity效能優化,目前接觸到的大概有這幾個方面: 1. Draw Call 2. 資源(模型、貼圖、粒子) 3. 渲染(相機、光照、Shader) 4. 網路 5. 程式碼(程式碼編寫、資源載入、物理系統) 可以在Unity自帶的Profiler視窗檢視專案效能消耗主要

安卓效能優化懶載入View的懶載入

1、背景:為什麼需要View的懶載入。           我們在做安卓專案的時候,經常會有一個使用場景:需要在執行時根據資料動態決定顯示或隱藏某個View和佈局。       上述場景,我們通常的解決方案就是:就是把可能用到的View先寫在佈局裡,再初始化其可見性都設為

Android系列Viewpager+Fragment 優化懶載入預載入的實現

今天帶來的就是fragment的優化,怎麼去實現懶載入 懶載入(預載入) 懶載入字面意思就是當需要的時候才會去載入,不需要就不要載入 為什麼Fragment需要懶載入呢,一般我們都會在onCreate()或者onCreateView()裡去啟動一些資料載入操作,比如從本

HDFS配置引數及優化實戰經驗Linux hdfs

HDFS優化之實戰經驗Linux系統優化一、禁止檔案系統記錄時間 Linux檔案系統會記錄檔案建立、修改和訪問操作的時間資訊,這在讀寫操作頻繁的應用中將帶來不小的效能損失。在掛載檔案系統時設定noatime和nodiratime可禁止檔案系統記錄檔案和目錄的訪問時間,這對HD

JavaScript效能優化小竅門彙總含例項

在眾多語言中,JavaScript已經佔有重要的一席之地,利用JavaScript我們可以做很多事情 , 應用廣泛。在web應用專案中,需要大量JavaScript的程式碼,將來也會越來越多。但是由於JavaScript是一個作為解釋執行的語言,而且它的單

HDFS配置參數及優化實戰經驗Linux hdfs

機架 reduce abi pro 不同類 暫時 連接 接下來 系統優化 HDFS優化之實戰經驗 Linux系統優化 一、禁止文件系統記錄時間 Linux文件系統會記錄文件創建、修改和訪問操作的時間信息,這在讀寫操作頻繁的應用中將帶來

【MySQL資料庫】效能優化索引及優化

一、Mysql效能優化之影響效能的因素 1.商業需求的影響 不合理的需求造成的資源投入產出,這裡就用一個看上去很簡單的功能分析。需求:一個論壇帖子的總量統計,附加要求:實時更新。從功能上看來是非常容易實現的,執行一條select count(*)from表名就可以得到結果,但是如果我們採

Android進階——效能優化程序拉活原理及手段完全解析

引言 上一篇文章Android進階——效能優化之程序保活原理及手段完全解析(一)總結了Android程序和執行緒的相關知識,主要介紹了幾種提升程序優先順序的手段,通常僅僅是提高優先順序只能讓你的程序存活時間久一點,但是真正的被殺死之後就不會自動拉活的,如果你的程

系統間通訊方式ActiveMQ的使用效能優化冰火兩重天5十六

7、ActiveMQ的持久訊息儲存方案 前文已經講過,當ActiveMQ接收到PERSISTENT Message訊息後就需要藉助持久化方案來完成PERSISTENT Message的儲存。這個介質可以是磁碟檔案系統、可以是ActiveMQ的內建資料庫,還可以是某種外部提供的關係型資料庫。本節筆者將向讀

瀏覽器渲染原理效能優化如何減少重排和重繪

繼續上篇《瀏覽器位址列裡輸入URL後的全過程》 前言 為什麼要了解瀏覽器的渲染原理?瞭解瀏覽器的渲染原理有什麼好處?我們做前端開發為什麼非要了解瀏覽器的原理?直接把網頁做出來,什麼需求,直接一把梭,擼完收工不好嗎。 但是經常會有人會問,什麼是重排和重繪? 重排也叫迴流(Re

Android 效能優化記憶體洩漏檢測以及記憶體優化

Android 記憶體洩漏檢測   通過上篇部落格我們瞭解了 Android JVM/ART 記憶體的相關知識和洩漏的原因,再來歸類一下記憶體洩漏的源頭,這裡我們簡單將其歸為一下三類:自身編碼引起由專案開發人員自身的編碼造成;第三方程式碼引起這裡的第三

App效能優化View優化2——UI問題的解決

一.概況 上一篇中App效能優化之View優化(1)——UI問題的檢測主要講的是我們在寫完程式碼之後,如何發現程式碼中的問題。從問題中提取經驗,規範好自己之後的程式碼編寫,本文就是講如何規範的進行UI關聯程式碼的書寫。 二.主要的點 View控制元件

Linux效能優化磁碟優化

前言 關於本章內容,設計的東西比較多。這裡會有關於檔案系統、磁碟、CPU等方面的知識,以及涉及到關於這方面的效能排查等。 術語 檔案系統通過快取和緩衝以及非同步I/O等手段來緩和磁碟的延時對應用程式的影響。為了更詳細的瞭解檔案系統,以下就簡單介紹一些相關術語: 檔案系統:一種把資料組織成檔案和目錄的儲存方式

Spark效能優化道——解決Spark資料傾斜Data Skew的N種姿勢

摘要 本文結合例項詳細闡明瞭Spark資料傾斜的幾種場景以及對應的解決方案,包括避免資料來源傾斜,調整並行度,使用自定義Partitioner,使用Map側Join代替Reduce側Join,給傾斜Key加上隨機字首等。 為何要處理資料傾斜(Da

Android 效能優化記憶體洩漏檢測以及記憶體優化

Android 記憶體優化   上篇部落格描述瞭如何檢測和處理記憶體洩漏,這種問題從某種意義上講是由於程式碼的錯誤導致的,但是也有一些是程式碼沒有錯誤,但是我們可以通過很多方式去降低記憶體的佔用,使得應用的整體記憶體處於一個健康的水平,下面總結一下記憶

Android效能優化五年

記得在上學的時候,就聽說在某個方面堅持學習一年,也就入門了。很慶幸,工作五年了,一直都在做Android效能優化。一般來說,工作三年左右會是工作的一個門檻,五年左右會是另外一個門檻,所以最近非常的低落、迷茫。昨晚外面下著漂泊大雨,輾轉反側的我,在想自己這從業五年