《遊戲引擎架構》讀書筆記(二)

2021-07-04 08:53:39 字數 2889 閱讀 2348

(1)基礎除錯

a)   日誌及追蹤,有些bug難以用vs自帶的除錯來進行單步除錯,最好的解決方案就是printf除錯法,列印一組資料,觀察情況。之前我的做法是單獨生成乙個控制台,不過vs自帶了乙個outputdebugstring()的方法,可以列印除錯資訊。不過這個只支援char*內容,我們可以將這個函式加工一下,使其支援不同型別的資料,甚至可以使其接受可變引數個數。

b)   冗長級別:我們有時想要列印,有時又不想列印,所以可以設定列印內容的級別,每個資訊設定乙個級別,然後設定乙個全域性的級別,大於這個級別的列印,然後可以通過調節全域性級別,控制列印內容的範圍。

c)      頻道:再擴充套件的想一想,有很多要列印的內容時,就會比較亂,那麼,將不同模組的列印資訊分成不同的頻道就可以解決問題了,再增加乙個頻道的引數,就可以控制列印哪個頻道的相關資訊啦。

d)      日誌:有時候程式會莫名的崩掉,這時候就不單單要只看列印資訊了,我們需要將程式的執行過程寫入日誌檔案來供執行後檢視結果。這裡有個糾結的地方,如果每次列印都輸入到日誌檔案,會保證日誌的完整性,但是會損失效能,如果緩衝滿了才輸出到日誌,有可能程式崩了就沒辦法將緩衝區的內容輸出了,所以這是個取捨的問題。

e)  崩潰報告:崩潰報告也是一種日誌,不過是程式崩潰時才有的日誌,多數作業系統有乙個頂層的異常處理函式,可以在此函式中列印各種異常資訊,甚至傳送電子郵件給程式團隊(這個有點6啊),這些異常資訊包括玩家狀態,關卡,正在執行的指令碼,堆疊資訊等等幫助我們發現bug的資訊。

(2)遊戲中特有的除錯功能

上面的一般的程式也可以使用,不過下面的這個應該是遊戲中特有的東東了,繪圖除錯。

遊戲幾乎全是數學內容驅動的,我們用數學來定位物體,比如碰撞檢測,投射光線,檢測視線等等,如果我們這些東東都列印出來,一方面特別麻煩,另一方面也不好觀測,更好的解決方案是用繪圖將資訊繪製出來,比如乙個包圍盒,那就把它畫出來,正所謂一圖頂千言,畫面是最好的表現方式。

除錯繪圖api:應該簡單易用,圖形包擴直線,球體,點,座標軸(x紅色,y綠色,z藍色),包圍盒,文字。最好加上可以控制顏色,線的寬度,球體半徑,座標軸長度等的功能。

我們可以通過引數調節這些圖元的位置,大小等等,自由度很高。而且這些內容可以使用乙個debugdrawmanager類來進行管理,將除錯繪圖內容新增到除錯內容佇列中,在渲染時一起渲染出來。

(3)遊戲內建選單,或者主控台也是很好的選擇,我們可以通過選單或者控制台在遊戲中對遊戲進行控制,如果支援強大的指令碼語言,甚至可以操縱整個遊戲。比如乙個ai,可以去掉其ai,改用手動控制ai以達到除錯的目的。

(4)我們在除錯遊戲的時候,可以給人物手動新增點buff,比如去掉碰撞檢測,移動到任意場景。

(5)攝像機移動:有時在除錯遊戲時,從某個角度我們不能很好的看到遊戲的情況,所以我們可以設計乙個在遊戲暫停執行時也可以移動的攝像機來幫助我們除錯。

(6)截圖也是乙個很重要的除錯方法,有些時候我們不能很好的重現bug,這種情況下截圖或者螢幕錄製就可以很好的幫我們定位bug。

(7)效能檢測:遊戲是實時系統,保證fps很重要,我們要把握好效能,一種方法是檢視函式的呼叫時間,一方面是函式本身的執行時間,另一方面則是函式的呼叫次數。

(8)如果資源載入失敗,應該給出明確的log提示資訊,或者直接在遊戲中顯現出來。

(9)記憶體以及記憶體洩露檢測也是很重要的。

渲染引擎是遊戲引擎中的重中之重,同時也是最難的部分。作為乙個圖形學,dx還沒怎麼學的小白,表示這一章並看不懂多少,只是知道一些概念,得繼續惡補了。

(1)      首先就是介紹3d世界構成的那些元素:頂點,三角網格,光照,材質紋理,光照模型,攝像機,光柵化,z快取,抗鋸齒等等。

(2)      渲染管道:渲染的架構是基於管道(pipeline)的,管道最大的優勢就是並行性,各個階段的計算同時進行,極大的增大了渲染系統的吞吐量。

(3)      渲染管線廣義上的劃分:

a)        工具階段(離線):定義幾何體和材質

b)        資產調節階段(離線):調節幾何體和材質資料,使之變成引擎可用的格式

c)        應用程式階段(cpu):識別出潛在可視的網格例項,將他們及其材質送至圖形硬體以供渲染。

d)        幾何階段(gpu):頂點變換,光照,投影至齊次裁剪空間

e)        光柵化階段(gpu):三角形轉化為片段,對片段著色。經過多重測試(深度測試,alpha測試,模板測試等)最終和幀緩衝融合。

(4)      在渲染之前設定世界矩陣,光源方向向量,紋理繫結,紋理定址及過濾模式,基於時間的紋理滾動或動畫效果,深度測試(禁用或者啟用),alpha混合選項。在提交圖元之前要進行設定,繪製只有有時需要還原設定。如果我們忘記了,則會造成渲染狀態洩露,即上乙個圖元的渲染狀態影響了下乙個圖元的渲染狀態。

(5)      設定渲染狀態是全域性的,對整個gpu有效,改變渲染狀態時,整個gpu管道必須完成工作才能換上新的設定,所以對於渲染的順序一定要把握好,不然會有效能損失。最好是按照材質排序來渲染,但是如果按材質來,又會有overdraw即重複渲染同乙個畫素。解決的辦法是使用gpu的深度預渲染步驟(z prepass),即第一次迅速產生深度緩衝內容,第二次才用完整的顏色填進幀緩衝。

(6)      場景圖(scene graph):所謂場景圖不是圖,而是管理場景中物件的資料結構,在平頭截體剔除之前先進行顯示物件剔除,通常為四叉樹,八叉樹,bsp樹,kd樹,空間雜湊技術等。四叉樹和八叉樹使用的是遞迴的思想,將場景不斷細分,查詢的開銷維持在最小。bsp樹使用乙個平面將空間平分,即傳說中的二元空間分割樹。

bsp樹或者入口系統:用於室內環境

四叉樹:室外平坦地形,上帝視角

額外剔除機制:室外大場景,第一人稱或第三人稱遊戲

(7)      好吧,剩下的我基本都看不懂了…諸如:法線貼圖,高動態範圍光照(hdr),全域性光照(gi),伽馬校正,全屏後期處理(動態模糊,景深模糊,暈影,著色等等)

遊戲引擎真的是博大精深,即使十年時間,也不一定能全部搞懂。做遊戲簡單,前提是有引擎。做乙個引擎真的是太難了!

《架構整潔之道》讀書筆記(二)

在本書的第二部分重新審視了一下三種基本的程式設計正規化 結構化程式設計 物件導向的程式設計與函式式程式設計,並提出了乙個重要觀點 從1946年圖靈為電子計算機寫下第一行 到現在,軟體的基本規則一直沒有變過。電腦程式的最基本構件始終是順序 執行 選擇 遞迴和間接應用 indirection 程式設計正...

軟體架構讀書筆記

我們自己不知不覺地設定了事物之間的界限,並把這些界限 層次與邏輯井然的東西稱為 系統 當我們從那些無序的事物中識別出了這樣的 系統 並用一些概念 名詞去定義了他們之後,我們對此的一切知識也就固化了。當這種秩序被建立起來之後,我們也就得到了對有序和無序價值的識別與肯否 當我們設定了種種價值 觀念 觀察...

讀書筆記 IT治理架構

it治理是公司治理的一部分。美國it治理協會給it治理的定義是 it治理是一種引導和控制企業各種關係和流程的結構,這種結構安排,旨在通過平衡資訊科技及其流程中的風險和收益,增加價值,以實現企業目標 可以看出,it治理在遵循資訊化戰略的基礎上,內容本質是一種結構安排,目的是平衡資訊化過程中風險和收益,...