Unity百例開發日記 之 靜態批處理原理理解

2021-10-10 14:39:11 字數 1674 閱讀 1530

unity 靜態批處理原理理解

在遊戲匯出的時候,在player setting中勾選static batching,這樣在匯出包的時候就進行批處理,匯出來的包就會比較大。

在遊戲場景中勾選場景物體的static選項,在載入該場景的時候,會進行一次靜態批處理的合併,這樣匯出來的包不大,但是在載入的時候會使得記憶體變大。

場景中有4個物體,abcd,如果都勾選靜態選項,在進行靜態批處理的時候,引擎會判斷這四個物體是否共用同一渲染材質。

如果共用同一渲染材質,則會將這四個物體視為可以批處理的物件,引擎會基於單個渲染物件的大小拷貝出3個,總共變為4個mesh,此時這4個mesh會存在乙個index buffer中,此時會讓資源占用的記憶體變大4倍,這樣在渲染的時候,是將這個更大的mesh傳遞給gpu進行渲染操作的。

在遊戲的執行中,有時候cpu的瓶頸也會至關重要。如果cpu的執行速度較慢,則gpu會出現等待cpu的情況,此時遊戲主要受到cpu的限制。

cpu在遊戲中的主要分工,主要分為兩個部分:設定渲染狀態和呼叫dc。 其中設定渲染狀態屬於比較重要的分工,對於載入到遊戲中的資源和物件等,cpu需要計算其頂點相關的矩陣,渲染所用的貼圖,渲染所用到的材質和shader,渲染所用到的燈光等。

如果每個物體的材質和貼圖等都不一樣,此時cpu的主要工作就是設定這些物體的渲染狀態(當然呼叫dc也會更多,但此時渲染狀態的改變更消耗效能,也就是setpass),遊戲的執行會比較緩慢。所以在常見的遊戲中,對於大量的不需要改變位置的物體,都會採用靜態批處理的方式來解決渲染狀態的瓶頸。

採用批處理的方式,對於相同渲染材質的物體,會合併成乙個更大的渲染物件mesh來進行渲染,這時候設定合併後的渲染物件的渲染狀態,與設定合併前的多個渲染物件的渲染狀態相比會大大減小次數。

此外對於大部分的渲染物件,主要的判斷依據就是渲染狀態和位置矩陣相關的引數。如果渲染狀態一致,則基本可以視為同乙個批處理的物件,然後對於位置矩陣進行單獨的設定即可。其實在引擎的內部,對於需要渲染的物件也會進行乙個渲染排序,會優先將渲染狀態相同的排在一起進行設定,這樣渲染狀態的切換就不會過於頻繁。

通過批處理的方式來降低渲染狀態的切換次數,可以極大的優化cpu的渲染瓶頸,所以在很多時候會採用靜態批處理的方式來優化cpu的瓶頸。

對於靜態批處理後的物體,比如abcd,那麼如何在實際的遊戲中去具體的渲染abcd中的那幾個可見(位於相機的視錐體內)? 這需要解釋一下批處理的合併方式:在unity5中,會構建乙個更大的記憶體buffer空間,依次存放abcd的資料。

在渲染a的時候,會呼叫dx的介面來取這份buffer中的指定起始點和長度的資料出來,傳遞到gpu中進行渲染。如果需要渲染ad兩個物件,則會在前面的基礎上,再將整體取出來(因為d存在末尾),然後傳遞到gpu中進行渲染。注意此時是整體傳遞a或者abcd的資料,不會在cpu進行裁剪的工作。具體的a的哪部分可見,是在gpu的頂點裁剪過程中進行的。

此時相當於要進行兩次渲染,渲染的次數增大了,這樣當然會帶來一定的效能損耗,但是相對於渲染狀態的設定改變帶來的效能損耗,是可以接受的。遊戲中如果大量的物體都採用靜態批處理,此時會出現很大的記憶體buffer,如果渲染頭和尾部的物體,則會使得渲染資料過大(cpu傳遞給gpu),帶來較大效能損耗,所以可以在遊戲中對靜態批處理物件進行乙個分塊的處理。將場景中的物件分成多個塊,每個塊的大小可以依據乙個經驗值來設定,此時就會出現多個靜態批處理的操作,而不是統一的乙個靜態批處理操作。具體的分塊操作取決於具體的專案的場景大小,可以多次測試得到乙個經驗值來進行設定。

Unity百例開發日記 之 抗鋸齒問題處理心得

在使用unity做工藝 等對模型渲染有比較高的要求時,經常會發現模型渲染時邊緣會出現鋸齒波紋狀。那麼鋸齒究竟是從 產生的呢?本質原因是,現今的顯示器螢幕都由畫素陣列組成。現實世界中的物體形狀都是連續的,而螢幕上只能用離散的畫素點來表徵。例如,螢幕上的一條斜線由一排階梯狀的畫素點構成,看起來就顯得鋸齒...

Unity 隨機地牢開發日記 1

本文章首發於我的個人部落格,希望大家多多支援!hi this is showhoop studio 你即將看到的是我的unity隨機地牢遊戲的第一篇開發日記。這個遊戲的靈感 於小白的大冒險,我借鑑了它的主要玩法 也就是隨機地牢,來作為練習,提高自己的遊戲開發技術,同時也豐富一下自己的作品集。在這一篇...

Unity3d遊戲開發設計模式之單例設計模式

後面我將會為大家一一整理出單例模式的寫法分類 我們先了解熟悉一下什麼是單例設計模式 單例模式說明 前言 最近開始花點心思研究下設計模式,主要還是讓自己寫的 可重用性高 保證 可靠性。所謂設計模式,我找了下定義 是一套被反覆使用 多數人知曉的 經過分類編目的 設計經驗的總結。毫無疑問,設計模式於己於他...