游戲設(shè)計(jì)模式讀書筆記:雙緩沖

第三篇:序列模型

  • 雙緩沖模式算是書中第三篇:序列模型中的一個(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ù)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,798評(píng)論 11 349
  • iPhone的標(biāo)準(zhǔn)推薦是CFNetwork 庫編程,其封裝好的開源庫是 cocoa AsyncSocket庫,用它...
    Ethan_Struggle閱讀 2,359評(píng)論 2 12
  • 前提: navigationBar 和 tabBar 放開毛玻璃效果時(shí),為了避免讓navigationBar 和 ...
    F森閱讀 634評(píng)論 0 1
  • 什么是 Vim 插件 見 :h plugin : Vim's functionality can be exten...
    liuchengxu閱讀 4,082評(píng)論 0 4

友情鏈接更多精彩內(nèi)容