第三篇:序列模型
- 雙緩沖模式算是書中第三篇:序列模型中的一個(gè),它與游戲循環(huán)和更新方法組成了第三篇。后兩者可以說是在我做Unity中最常用到的,而且也是游戲引擎本身已經(jīng)實(shí)現(xiàn)了的。謹(jǐn)以下文來說明下序列模型部分的重要性。
電子游戲之所有有趣,很大程度上歸功于它們會(huì)將我們帶到別的地方。 幾分鐘后(或者,誠實(shí)點(diǎn),可能會(huì)更長),我們活在一個(gè)虛擬的世界。 創(chuàng)造那樣的世界是游戲程序員至上的歡愉。
大多數(shù)游戲世界都有的特性是時(shí)間——虛構(gòu)世界以其特定的節(jié)奏運(yùn)行。 作為世界的架構(gòu)師,我們必須發(fā)明時(shí)間,制造推動(dòng)游戲時(shí)間運(yùn)作的齒輪。
這本篇的模式是建構(gòu)這些的工具。 游戲循環(huán)是時(shí)鐘的中心軸。 對象通過更新方法來聆聽時(shí)鐘的滴答聲。 我們可以用雙緩沖模式存儲(chǔ)快照來隱藏計(jì)算機(jī)的順序執(zhí)行,這樣看起來世界可以進(jìn)行同步更新。
雙緩沖
一個(gè)典型的例子
- 這個(gè)例子非常經(jīng)典,就是渲染時(shí)候的雙緩沖。只有當(dāng)一幀的色值數(shù)據(jù)完全計(jì)算出來后,才能在屏幕上展示出來,如果在計(jì)算的同時(shí)就開始渲染,那么屏幕只會(huì)出現(xiàn)一部分的色彩。所以我們在屏幕看到的色彩值其實(shí)往往是GPU算出的上一幀的數(shù)據(jù)。
使用場景
我們需要維護(hù)一些被逐步改變著的狀態(tài)量。
同個(gè)狀態(tài)可能會(huì)在其被修改的同時(shí)被訪問到。
我們希望避免訪問狀態(tài)的代碼能看到具體的工作過程。
我們希望能夠讀取狀態(tài)但不希望等到寫入操作的完成。
我對雙緩沖的理解
- 說白了,雙緩沖是為了維護(hù)完整性。它展示給外界的永遠(yuǎn)是一個(gè)完整的,已經(jīng)準(zhǔn)備好被使用的內(nèi)容。在其內(nèi)部,有一個(gè)緩沖是用于寫入數(shù)據(jù)的,寫入的過程可能是緩慢的,但是沒關(guān)系,另一個(gè)緩沖已經(jīng)做好了被使用的準(zhǔn)備,外界讀取的是這個(gè)已經(jīng)寫好的緩沖。
- 當(dāng)寫入完成時(shí),兩個(gè)緩沖互換,剛剛寫完的這個(gè)緩沖變?yōu)闇?zhǔn)備被讀取的一個(gè),而被讀取的緩沖開始作為寫入緩沖使用。
設(shè)計(jì)決策
-
緩沖區(qū)如何交互?
- 在文中作者使用的是C++,因此交換只不過是一個(gè)指針重定向的過程。
- 如果不能指針重定向,就要考慮數(shù)據(jù)拷貝了。
- C#中一個(gè)集合對象表現(xiàn)出來的也是一個(gè)指針(引用),可以直接做重定向。
-
緩沖的粒度
- 書中提到兩個(gè)粒度,一個(gè)是緩沖區(qū)是單個(gè)整體,也就是渲染的時(shí)候一個(gè)圖像的內(nèi)容就在一個(gè)緩沖區(qū)中。
- 另一種情況就是多個(gè)對象中都存在一個(gè)緩沖數(shù)據(jù)。