遊戲編程模式 (Game Programming Patterns) 游戏编程模式

尼斯卓姆 (Robert Nystrom)

買這商品的人也買了...

商品描述

<內容介紹>

遊戲開發一直是熱門的領域,掌握良好的遊戲編程模式是開發人員的應備技能。本書細緻地講解了遊戲開發需要用到的各種編程模式,並提供了豐富的示例。
全書共分20章,通過三大部分內容全面介紹了與遊戲編程模式相關的各類知識點。首部分介紹了基礎知識和框架;第二部分深入探索設計模式,並介紹了模式與遊戲開發之間的關聯;第三部分介紹了13種有效的遊戲設計模式。
本書提供了豐富的代碼示例,通過理論和代碼示例相結合的方式幫助讀者更好地學習。無論是遊戲領域的設計人員、開發人員,還是想要進入遊戲開發領域的學生和普通程序員,都可以閱讀本書。

<章節目錄>

第1篇概述
第1章架構,性能和遊戲3
1.1什麼是軟件架構3
1.1.1什麼是好的軟件架構3
1.1.2你如何做出改變4
1.1.3我們如何從解耦中受益5
1.2有什麼代價5
1.3性能和速度6
1.4壞代碼中的好代碼7
1.5尋求平衡8
1.6簡單性9
1.7準備出發9
第2篇再探設計模式
第2章命令模式13
2.1配置輸入14
2.2關於角色的說明16
2.3撤銷和重做18
2.4類風格化還是函數風格化21
2.5參考22
第3章享元模式23
3.1森林之樹23
3.2一千個實例25
3.3享元模式26
3.4紮根之地26
3.5性能表現如何30
3.6參考31
第4章觀察者模式33
4.1解鎖成就33
4.2這一切是怎麼工作的34
4.2.1觀察者35
4.2.2被觀察者35
4.2.3可被觀察的物理模塊37
4. 3它太慢了38
4.4太多的動態內存分配39
4.4.1鍊式觀察者39
4.4.2鍊錶節點池42
4.5餘下的問題43
4.5.1銷毀被觀察者和觀察者43
4.5.2不用擔心,我們有GC 44
4.5.3接下來呢44
4.6觀察者模式的現狀45
4.7觀察者模式的未來46
第5章原型模式47
5.1原型設計模式47
5.1.1原型模式效果如何50
5.1.2生成器函數51
5.1.3模板51
5.1.4頭等公民類型(First-class types) 52
5. 2原型語言範式52
5.2.1 Self語言53
5.2.2結果如何54
5.2.3 JavaScript如何55
5.3原型數據建模57
第6章單例模式61
6.1單例模式61
6.1.1確保一個類只有一個實例61
6.1.2提供一個全局指針以訪問唯一實例62
6.2使用情境63
6.3後悔使用單例的原因65
6.3.1它是一個全局變量65
6.3.2它是個畫蛇添足的解決方案66
6.3.3延遲初始化剝離了你的控制67
6.4那麼我們該怎麼做68
6.4.1看你究竟是否需要類68
6.4.2將類限制為單一實例70
6.4.3為實例提供便捷的訪問方式71
6.5剩下的問題73
第7章狀態模式75
7.1我們曾經相遇過75
7.2救星:有限狀態機78
7.3枚舉和分支79
7.4狀態模式82
7.4.1一個狀態接口82
7.4.2為每一個狀態定義一個類83
7.4.3狀態委託84
7.5狀態對象應該放在哪裡呢84
7.5.1靜態狀態84
7.5.2實例化狀態85
7.6進入狀態和退出狀態的行為86
7.7有什麼收穫嗎88
7.8並發狀態機88
7.9層次狀態機89
7.10下推自動機91
7.11現在知道它們有多有用了吧92
第3篇序列型模式
第8章雙緩衝95
8.1動機95
8. 1.1計算機圖形系統是如何工作的(概述) 95
8.1.2第一幕,第一場96
8.1.3回到圖形上97
8.2模式98
8.3使用情境98
8. 4註意事項98
8.4.1交換本身需要時間98
8.4.2我們必須有兩份緩衝區99
8.5示例代碼99
8.5.1並非只針對圖形102
8.5.2人工非智能102
8.5.3緩存這些巴掌106
8.6設計決策107
8.6.1緩衝區如何交換107
8.6.2緩衝區的粒度如何109
8.7參考110
第9章遊戲循環111
9 .1動機111
9.1.1 CPU探秘111
9.1.2事件循環112
9.1.3時間之外的世界113
9.1.4秒的長短113
9.2模式114
9.3使用情境114
9.4使用須知114
9.5示例代碼115
9.5.1跑,能跑多快就跑多快115
9.5.2小睡一會兒115
9.5.3小改動,大進步116
9. 5.4把時間追回來118
9.5.5留在兩幀之間119
9.6設計決策120
9.6.1誰來控制遊戲循環,你還是平臺121
9.6.2你如何解決能量耗損121
9.6.3如何控制遊戲速度122
9.7參考123
第10章更新方法125
10.1動機125
10.2模式127
10.3使用情境128
10.4使用須知128
10.4.1將代碼劃分至單幀之中使其變得更加複雜128
10.4.2你需要在每幀結束前存儲遊戲狀態以便下一幀繼續128
10.4.3所有對像都在每幀進行模擬,但並非真正同步129
10.4.4在更新期間修改對象列表時必須謹慎129
10.5示例代碼130
10.5.1子類化實體132
10.5.2定義實體132
10.5.3逝去的時間135
10.6設計決策136
10.6.1 update方法依存於何類中136
10.6.2那些未被利用的對象該如何處理137
10.7參考137
第4篇行為型模式
第11章字節碼141
11.1動機141
11.1.1魔法大戰141
11.1.2先數據後編碼142
11.1.3解釋器模式142
11.1.4虛擬機器碼145
11.2字節碼模式145
11.3使用情境145
11.4使用須知146
11.4.1你需要個前端界面146
11.4.2你會想念調試器的147
11.5示例147
11.5.1法術API 147
11.5.2法術指令集148
11.5.3棧機149
11.5.4組合就能得到行為153
11.5.5一個虛擬機155
11.5.6語法轉換工具155
11. 6設計決策157
11.6.1指令如何訪問堆棧157
11.6.2應該有哪些指令158
11.6.3值應當如何表示158
11.6.4如何生成字節碼161
11.7參考162
第12章子類沙盒163
12.1動機163
12.2沙盒模式165
12.3使用情境165
12.4使用須知165
12.5示例166
12.6設計決策168
12.6.1需要提供什麼操作168
12.6.2是直接提供函數,還是由包含它們的對象提供169
12.6.3基類如何獲取其所需的狀態170
12.7參考173
第13章類型對象175
13.1動機175
13.1.1經典的面向對象方案175
13.1.2一個類的類177
13.2類型對像模式178
13.3使用情境179
13.4使用須知179
13.4.1類型對象必須手動跟蹤179
13.4.2為每個類型定義行為更困難179
13.5示例180
13.5.1構造函數:讓類型對象更加像類型181
13.5.2通過繼承共享數據183
13.6設計決策185
13.6.1類型對象應該封裝還是暴露186
13.6.2持有類型對像如何創建187
13.6.3類型能否改變187
13.6.4支持何種類型的派生188
13. 7參考189
第5篇解耦型模式
第14章組件模式193
14.1動機193
14.1.1難題194
14.1.2解決難題194
14.1.3寬鬆的末端194
14.1.4捆綁在一起195
14.2模式196
14.3使用情境196
14.4註意事項196
14.5示例代碼197
14.5.1一個龐大的類197
14.5.2分割域198
14.5.3分割其餘部分200
14.5.4重構Bjorn 202
14.5.5刪掉Bjorn 204
14.6設計決策206
14.6.1對像如何獲得組件206
14.6.2組件之間如何傳遞信息207
14.7參考210
第15章事件隊列211
15.1動機211
15.1.1用戶圖形界面的事件循環211
15.1.2中心事件總線212
15.1.3說些什麼好呢213
15. 2事件隊列模式215
15.3使用情境215
15.4使用須知215
15.4.1中心事件隊列是個全局變量216
15.4.2遊戲世界的狀態任你掌控216
15.4.3你會在反饋系統循環中繞圈子216
15.5示例代碼217
15.5.1環狀緩衝區219
15.5.2匯總請求222
15.5.3跨越線程223
15.6設計決策224
15.6.1入隊的是什麼224
15.6.2誰能從隊列中讀取224
15.6.3誰可以寫入隊列225
15.6.4隊列中對象的生命週期是什麼226
15.7參考227
第16章服務定位器229
16.1動機229
16.2服務定位器模式230
16.3使用情境230
16.4使用須知231
16.4.1服務必須被定位231
16.4.2服務不知道被誰定位231
16.5示例代碼231
16.5.1服務231
16.5.2服務提供器232
16.5.3簡單的定位器232
16.5.4空服務233
16.5.5日誌裝飾器235
16.6設計決策236
16.6.1服務是如何被定位的236
16.6.2當服務不能被定位時發生了什麼239
16.6.3服務的作用域多大240
16.7其他參考241
第6篇優化型模式
第17章數據局部性245
17.1動機245
17.1.1數據倉庫246
17.1.2 CPU的托盤247
17.1.3等下,數據即性能248
17. 2數據局部性模式249
17.3使用情境249
17.4使用須知250
17.5示例代碼250
17.5.1連續的數組251
17.5.2包裝數據255
17.5.3熱/冷分解258
17.6設計決策260
17.6.1你如何處理多態260
17.6.2遊戲實體是如何定義的261
17.7參考263
第18章臟標記模式265
18.1動機265
18.1 .1局部變換和世界變換266
18.1.2緩存世界變換267
18.1.3延時重算268
18.2臟標記模式269
18.3使用情境269
18.4使用須知270
18.4. 1延時太長會有代價270
18.4.2必須保證每次狀態改動時都設置臟標記271
18.4.3必須在內存中保存上次的衍生數據271
18.5示例代碼271
18. 5.1未優化的遍歷272
18.5.2讓我們“臟”起來273
18.6設計抉擇275
18.6.1何時清除臟標記275
18.6.2臟標記追蹤的粒度多大276
18 .7參考276
第19章對像池277
19.1動機277
19.1.1碎片化的害處277
19.1.2二者兼顧278
19.2對像池模式278
19.3使用情境279
19.4使用須知279
19.4.1對像池可能在閒置的對像上浪費內存279
19.4.2任意時刻處於存活狀態的對像數目恆定279
19.4.3每個對象的內存大小是固定的280
19 .4.4重用對像不會被自動清理281
19.4.5未使用的對象將佔用內存281
19.5示例代碼281
19.6設計決策287
19.6.1對像是否被加入對像池287
19 .6.2誰來初始化那些被重用的對象288
19.7參考290
第20章空間分區291
20.1動機291
20.1.1戰場上的部隊291
20.1.2繪製戰線292
20.2空間分區模式293
20.3使用情境293
20.4使用須知293
20.5示例代碼293
20.5.1一張方格紙294
20.5.2相連單位的網格294
20.5.3進入戰場296
20.5.4刀光劍影的戰鬥297
20.5.5衝鋒陷陣298
20.5.6近在咫尺,短兵相接299
20.6設計決策302
20.6.1分區是層級的還是扁平的302
20. 6.2分區依賴於對象集合嗎302
20.6.3對像只存儲在分區中嗎304
20.7參考305