遊戲編程權威指南(第4版)

遊戲編程權威指南(第4版)

《遊戲編程權威指南(第4版)》是2016年人民郵電出版社出版的圖書,作者是[美] 麥克沙福瑞、格雷海姆。

內容簡介

遊戲編程的用戶需求和發展速度近年來很快,閱讀遊戲開發類圖書的需求也越來越大。本書是一本遊戲開發指南,是開發、部署、運行商業遊戲的讀物。

全書分為4個部分共24章。首部分是遊戲編程基礎,主要介紹了遊戲編程的定義、遊戲架構等基礎知識。第二部分是讓遊戲跑起來,主要介紹了初始化和關閉代碼、主循環、遊戲主題和用戶界面等。第三部分是核心遊戲技術,主要介紹了一些更為複雜的代碼示例,如3D編程、遊戲音頻、物理和AI編程等。第四部分是高級知識和綜合套用,主要介紹了網路編程、多道程式設計和用C#創建工具等,並利用前面所講的知識開發出一款簡單的遊戲。
本書適合遊戲開發人員、遊戲架構設計人員和遊戲引擎用戶參考閱讀,也適合想要進入遊戲開發領域的讀者閱讀。

目錄

第1章 什麼是遊戲編程 1

1.1 好的方面 1

1.1.1 工作 2

1.1.2 遊戲玩家 2

1.1.3 同事 3

1.1.4 工具—軟體開發工具包(SDK) 4

1.1.5 硬體 5

1.1.6 平台 6

1.1.7 展會 9

1.2 不好的地方 9

1.2.1 遊戲編程很難 10

1.2.2 零碎檔案 10

1.2.3 那不是bug—而是特性 11

1.2.4 工具 12

1.3 黑暗的一面 13

1.3.1 命中移動的目標 13

1.3.2 加班模式(和加班大餐) 13

1.3.3 呸!胡扯 15

1.3.4 作業系統地獄 15

1.3.5 雇員流動的性質 16

1.4 這一切都是值得的,對嗎 16

第2章 遊戲中有什麼 18

2.1 遊戲架構 18

2.2 使用遊戲架構 20

2.3 套用層 22

2.3.1 讀取輸入 22

2.3.2 檔案系統和資源快取 22

2.3.3 記憶體管理 23

2.3.4 初始化、主循環和關閉 23

2.3.5 其他套用層代碼 24

2.4 遊戲邏輯 25

2.4.1 遊戲狀態和數據結構 25

2.4.2 物理學和碰撞 26

2.4.3 事件 26

2.4.4 進程管理器 27

2.4.5 命令解釋器 28

2.5 人類玩家的遊戲視圖 28

2.5.1 圖形顯示 29

2.5.2 音頻 30

2.5.3 用戶界面表示 31

2.5.4 進程管理器 31

2.5.5 選項 31

2.5.6 多人遊戲 31

2.6 AI代理的遊戲視圖 31

2.7 網路遊戲架構 32

2.7.1 遠程遊戲視圖 33

2.7.2 遠程遊戲邏輯 33

2.8 必須使用DirectX嗎 34

2.8.1 DirectX的設計理念 34

2.8.2 Direct3D或OpenGL 35

2.8.3 DirectSound還是 35

2.8.4 DirectInput或自己實現 36

2.9 其他內容 36

2.10 補充書目 36

第3章 拯救了我的編碼趣聞和風格 37

3.1 通用編碼風格 38

3.1.1 大括弧 38

3.1.2 一致性 39

3.2 智慧型代碼設計實踐 40

3.2.1 避免隱藏代碼和重要操作 41

3.2.2 類結構:保持簡單 42

3.2.3 繼承VS.組合 42

3.2.4 變壞的虛函式 43

3.2.5 使用接口類 44

3.2.6 考慮使用工廠 45

3.2.7 封裝變化的組件 46

3.2.8 使用流來初始化對象 46

3.3 智慧型指針和裸指針 47

3.3.1 引用計數 48

3.3.2 C++的shared_ptr 49

3.4 正確使用記憶體 52

3.4.1 了解不同類型的記憶體 53

3.4.2 最佳化記憶體訪問 55

3.4.3 記憶體對齊 56

3.4.4 虛擬記憶體 57

3.4.5 編寫自己的記憶體管理器 58

3.5 各種有用的東西 59

3.5.1 一個很棒的隨機數生成器 60

3.5.2 集合的偽隨機遍歷 61

3.5.3 記憶體池 62

3.6 開發出適合自己的風格 67

3.7 補充書目 68

第4章 生成遊戲 69

4.1 一個小動機 69

4.2 創建項目 70

4.2.1 生成配置 70

4.2.2 創建堅不可摧的目錄結構 71

4.2.3 將遊戲引擎和工具放在何處 73

4.2.4 設定Visual Studio生成選項 74

4.2.5 多平台項目 76

4.3 原始碼庫和版本控制 77

4.3.1 微軟Visual SourceSafe的相關歷史 79

4.3.2 Subversion和TortoiseSVN 79

4.3.3 Perforce軟體的Perforce 80

4.3.4 Avid的AlienBrain 81

4.3.5 使用原始碼控制分支 81

4.4 生成遊戲:一門黑色藝術 84

4.4.1 自動化生成 85

4.4.2 生成計算機 85

4.4.3 自動化生成腳本 85

4.5 創建生成腳本 87

4.5.1 標準生成 87

4.5.2 里程碑生成 88

4.5.3 多個項目和共享代碼 90

4.5.4 最後的建議 91

第5章 遊戲初始化和關閉 92

5.1 初始化101 92

5.2 C++初始化的一些陷阱 93

5.3 遊戲的套用層 95

5.3.1 WinMain:Windows入口點 95

5.3.2 套用層:GameCodeApp 97

5.3.3 InitInstance():檢查系統資源 97

5.3.4 檢查遊戲的多個實例 98

5.3.5 檢查硬碟空間 99

5.3.6 檢查記憶體 99

5.3.7 計算CPU速度 100

5.3.8 你擁有的是個垃圾袋嗎 101

5.3.9 初始化資源快取 101

5.3.10 載入文本字元串 102

5.3.11 腳本管理器和事件系統 104

5.3.12 初始化DirectX並創建 視窗 104

5.3.13 創建遊戲邏輯和遊戲視圖 105

5.3.14 設定遊戲保存目錄 105

5.3.15 預載入從快取中選定的 資源 106

5.4 收尾工作:乾淨漂亮地退出 107

5.4.1 我怎樣才能離開呢 107

5.4.2 強制關閉模態對話框 109

5.4.3 關閉遊戲 110

5.4.4 遊戲機怎么樣 110

5.5 進入和退出 111

第6章 遊戲主體和組件架構 112

6.1 初次嘗試創建遊戲主體 112

6.2 組件架構 115

6.3 創建主體和組件 116

6.4 定義主體和組件 120

6.5 存儲並訪問主體 122

6.6 將它們組合起來 123

6.7 數據共享 124

6.7.1 直接訪問 125

6.7.2 事件 125

6.7.3 兩全其美 126

第7章 主循環的控制 127

7.1 組織主循環 127

7.1.1 硬編碼的更新 127

7.1.2 多執行緒主循環 128

7.1.3 一種混合技術 129

7.1.4 簡單的協同式多任務處理器 131

7.1.5 非常簡單的進程示例:DelayProcess 135

7.1.6 Process派生類的使用 137

7.2 良好地適應作業系統 137

7.3 使用DirectX 11框架 138

7.3.1 渲染和呈現顯示 138

7.3.2 用於更新和渲染的回調函式 139

7.4 我現在可以製作遊戲了嗎 141

第8章 遊戲數據的載入與快取 142

8.1 遊戲資源:格式和存儲要求 143

8.1.1 3D對象格線和環境 143

8.1.2 動畫數據 145

8.1.3 地圖/關卡數據 146

8.1.4 紋理數據 146

8.1.5 點陣圖顏色深度 147

8.1.6 聲音和音樂數據 149

8.1.7 視頻和預渲染的過場動畫 150

8.2 資源檔案 152

8.2.1 將資源打包到一個檔案中 153

8.2.2 打包資源的其他好處 153

8.2.3 數據壓縮和性能 154

8.2.4 Zlib:開源壓縮 154

8.3 資源高速快取 158

8.3.1 IResourceFile接口 161

8.3.2 ResHandle:跟蹤載入的資源 161

8.3.3 IResourceLoader接口和DefaultResourceLoader 163

8.3.4 ResCache:簡單的資源高速快取 163

8.3.5 將資源快取入DirectX等 169

8.3.6 世界設計和高速快取預測 170

8.4 我的快取不夠用了 173

第9章 輸入設備編程 174

9.1 獲取設備狀態 174

9.2 使用XInput或DirectInput 177

9.3 一些安全提示 179

9.4 使用雙軸控制器 182

9.4.1 捕獲桌面上的滑鼠 182

9.4.2 使用滑鼠拖拽 184

9.5 使用遊戲控制器 186

9.5.1 非靈敏區 187

9.5.2 正常輸入 189

9.5.3 單桿、雙桿、紅色拉桿和藍色拉桿 190

9.5.4 增加控制值 190

9.6 使用鍵盤 191

9.6.1 Mike的鍵盤窺探器 191

9.6.2 GetAsyncKeyState()和其他函式 195

9.6.3 處理Windows中的Alt鍵 195

9.7 什麼?沒有跳舞毯 195

第10章 用戶界面編程 197

10.1 DirectX的文本助手和對話框資源管理器 197

10.2 人類的遊戲視圖 198

10.3 WASD移動控制器 206

10.4 螢幕元素 208

10.5 自定義的MessageBox對話框 210

10.6 模態對話框 215

10.7 控制項 218

10.8 控制項識別 219

10.9 命中測試和焦點順序 221

10.10 控制項狀態 222

10.11 更多控制項屬性 223

10.11.1 熱鍵 223

10.11.2 工具提示 223

10.11.3 上下文相關幫助 224

10.11.4 可拖拽 224

10.11.5 聲音和動畫 224

10.12 最後的用戶界面提示 225

第11章 遊戲事件管理 226

11.1 遊戲事件 226

11.1.1 事件和事件數據 227

11.1.2 事件監聽器委託 230

11.1.3 事件管理器 231

11.1.4 示例:將所有內容整合在一起 238

11.2 哪些遊戲事件是重要的 239

11.3 事件和進程的區別 241

11.4 補充書目 241

第12章 使用Lua編寫腳本 242

12.1 遊戲程式語言的簡史 242

12.1.1 彙編語言 243

12.1.2 C/C++ 244

12.1.3 腳本語言 245

12.2 使用腳本語言 246

12.2.1 快速原型法 246

12.2.2 專注於設計 247

12.2.3 速度和記憶體成本 247

12.2.4 它們之間的界限是什麼 247

12.3 腳本語言集成策略 248

12.3.1 自己進行編寫 248

12.3.2 使用現有的語言 248

12.3.3 選擇一種腳本語言 249

12.3.4 Python 249

12.3.5 Lua 249

12.4 Lua速成課程 250

12.4.1 注釋 250

12.4.2 變數 250

12.4.3 函式 252

12.4.4 表 253

12.4.5 流程控制 255

12.4.6 操作符 257

12.4.7 接下來是什麼 257

12.5 Lua中的面向對象編程 258

12.5.1 元表 259

12.5.2 創建一個簡單的類抽象 261

12.6 記憶體管理 263

12.7 將Lua綁定到C++ 263

12.7.1 Lua C API 263

12.7.2 tolua++ 263

12.7.3 luabind 264

12.7.4 LuaPlus 264

12.8 LuaPlus速成課程 264

12.8.1 LuaState 264

12.8.2 LuaObject 265

12.8.3 表 266

12.8.4 全局 267

12.8.5 函式 268

12.8.6 從Lua調用C++函式 269

12.9 將所有內容整合在一起 271

12.9.1 管理Lua狀態 271

12.9.2 腳本導出 273

12.9.3 進程系統 274

12.9.4 事件系統 282

12.9.5 腳本組件 287

12.10 Lua開發和調試 289

12.11 結語 289

12.12 補充書目 289

第13章 遊戲音頻 290

13.1 聲音的工作原理 290

13.1.1 數字錄音和重現 291

13.1.2 聲音檔案 293

13.1.3 執行緒和同步的簡介 293

13.2 遊戲語音系統架構 294

13.2.1 聲音資源和句柄 295

13.2.2 IAudioBuffer接口和AudioBuffer類 303

13.2.3 IAudio接口和Audio類 305

13.2.4 DirectSound實現 308

13.2.5 聲音進程 317

13.2.6 啟動音效 321

13.3 其他技術難題 322

13.3.1 聲音和遊戲對象 322

13.3.2 定時和同步 322

13.3.3 混合問題 324

13.4 一些隨記 326

13.4.1 數據驅動的聲音設定 326

13.4.2 背景環境聲音和音樂 327

13.4.3 語音 328

13.5 結語 330

第14章 3D圖形基礎 331

14.1 3D圖形流水線 331

14.2 3D數學101 332

14.2.1 坐標和坐標系 333

14.2.2 向量數學 335

14.3 C++數學類 340

14.3.1 向量類 340

14.3.2 矩陣數學 341

14.3.3 四元數數學 351

14.3.4 變換 358

14.3.5 幾何體 360

14.3.6 光照、法線和顏色 361

14.3.7 材質 363

14.3.8 貼有紋理的頂點 365

14.3.9 紋理 365

14.3.10 二次採樣 365

14.3.11 mip映射 367

14.3.12 ID3D11Device和ID3D11DeviceContext簡介 367

14.3.13 在D3D11中載入紋理 368

14.3.14 三角形格線 370

14.4 你還在嗎 373

第15章 3D頂點和像素著色器 374

15.1 頂點著色器和著色器語法 375

15.2 編譯頂點著色器 379

15.3 頂點著色器的C++輔助類 380

15.4 像素著色器 386

15.5 像素著色器的C++輔助類 387

15.6 使用著色器輔助類進行渲染 390

15.7 著色器—這只是一個開始 391

15.8 補充書目 391

第16章 3D場景 392

16.1 場景圖基礎 392

16.1.1 ISceneNode接口類 392

16.1.2 SceneNodeProperties和 RenderPass 394

16.1.3 SceneNode—一切都是從這裡開始的 396

16.1.4 Scene類 401

16.2 特殊的場景圖節點 408

16.2.1 獨立渲染通道的實現 408

16.2.2 一個簡單的攝像機 411

16.2.3 在場景中放入燈光 413

16.2.4 天空的渲染 416

16.2.5 在場景中使用格線 420

16.3 遺漏的內容 424

16.4 還沒滿足 425

16.5 補充書目 425

第17章 碰撞和簡單的物理學 426

17.1 物理學中的數學知識 427

17.1.1 米、英尺、肘尺還是Kellicam 427

17.1.2 距離、速度和加速度 427

17.1.3 質量、加速度和力 428

17.1.4 轉動慣量、角速度和扭矩 431

17.1.5 距離和交集的計算 431

17.2 選擇一種物理SDK 432

17.3 對象屬性 434

17.4 碰撞體 435

17.4.1 良好的碰撞幾何體的要求 436

17.4.2 可見幾何體VS碰撞幾何體 437

17.4.3 人類角色的碰撞體 437

17.4.4 特殊對象:樓梯、門道和樹 439

17.5 碰撞系統的使用 439

17.6 集成一個物理SDK 441

17.6.1 Bullet SDK的組件 444

17.6.2 初始化 445

17.6.3 關閉 446

17.6.4 物理系統的更新 447

17.6.5 創建簡單的物理對象 449

17.6.6 凸面格線的創建 451

17.6.7 觸發器的創建 452

17.6.8 力和力矩的套用 453

17.6.9 物理調試渲染器 454

17.6.10 接收碰撞事件 455

17.6.11 物理SDK集成的最後內容 457

17.7 等一下,我還有話要說 458

第18章 遊戲AI簡介 459

18.1 AI技術 459

18.1.1 硬編碼AI 460

18.1.2 隨機化 461

18.1.3 加權隨機 462

18.2 有限狀態機 463

18.3 決策樹 467

18.4 模糊邏輯 471

18.5 效用理論 474

18.6 以目標為導向的行動計畫 477

18.7 路徑查找 478

18.7.1 A* (A-Star) 479

18.7.2 動態規避 481

18.8 補充書目 482

第19章 多玩家遊戲的網路編程 483

19.1 網際網路的工作原理 483

19.1.1 Winsock還是Berkeley 484

19.1.2 Internet地址 484

19.1.3 域名系統 486

19.1.4 有用的程式和檔案 487

19.2 套接字API 488

19.2.1 套接字效用函式 488

19.2.2 域名服務(DNS)函式 490

19.2.3 套接字初始化和關閉 491

19.2.4 創建套接字和設定套接字選項 491

19.2.5 伺服器函式 495

19.2.6 套接字讀取和寫入 498

19.3 使用套接字製作一款多玩家遊戲 499

19.3.1 數據包類 500

19.3.2 核心套接字類 501

19.3.3 用於監聽的套接字類 506

19.3.4 套接字管理器類 508

19.4 核心客戶端類 515

19.5 核心伺服器端類 516

19.6 將套接字連線到事件系統中 517

19.7 如果真的這么簡單就好了 522

第20章 多道程式設計簡介 523

20.1 多道程式設計是什麼 523

20.2 創建執行緒 525

20.3 進程同步 527

20.3.1 測試與置位、信號量和互斥 528

20.3.2 Windows臨界區 528

20.4 有趣的執行緒問題 530

20.5 執行緒安全 531

20.6 GameCode4中的多執行緒類 531

20.6.1 RealtimeProcess類 532

20.6.2 從實時進程傳送事件 534

20.6.3 接收實時進程中的事件 537

20.7 Zip檔案的後台解壓縮 538

20.8 進一步工作 540

20.9 關於硬體 541

20.10 關於未來 541

20.11 補充書目 542

第21章 “茶壺大戰”遊戲 543

21.1 製作遊戲 544

21.2 核心類的創建 545

21.2.1 茶壺大戰的套用層 545

21.2.2 遊戲邏輯 546

21.2.3 人類玩家的遊戲視圖 553

21.3 遊戲事件 556

21.4 遊戲玩法 556

21.4.1 關卡的載入 557

21.4.2 主體管理器 558

21.4.3 傳送和接收事件 560

21.4.4 進程 562

21.5 留給讀者的練習 563

第22章 C#中簡單的遊戲編輯器 565

22.1 為什麼要使用C# 565

22.2 如何將編輯器組合起來 565

22.3 編輯器架構 566

22.3.1 套用層 566

22.3.2 編輯器的邏輯類 567

22.3.3 編輯器視圖 568

22.3.4 訪問遊戲引擎的函式 569

22.3.5 創建DLL 578

22.3.6 編輯器架構的封裝 578

22.4 C#編譯器應用程式 579

22.4.1 託管代碼和非託管代碼之間的區別 580

22.4.2 NativeMethods類 581

22.4.3 Program類 582

22.4.4 MessageHandler類 583

22.5 C#編輯器用戶界面 585

22.5.1 EditorForm類 585

22.5.2 ActorComponentEditor類 595

22.6 後續工作 603

22.7 補充材料 604

第23章 對遊戲進行調試和分析 605

23.1 處理錯誤的藝術 606

23.2 調試基礎 607

23.2.1 調試器的使用 609

23.2.2 安裝Windows符號檔案 611

23.2.3 對全螢幕遊戲進行調試 612

23.2.4 遠程調試 613

23.2.5 對小存儲器轉儲檔案(Minidump)進行調試 615

23.3 圖形調試和著色器調試 616

23.4 調試技術 617

23.4.1 調試是一次實驗 617

23.4.2 重現bug 619

23.4.3 降低複雜度 620

23.4.4 設定下一條語句 620

23.4.5 彙編級調試 621

23.4.6 給代碼添加調料 623

23.4.7 提取調試信息 624

23.4.8 Lint和其他代碼分析器 625

23.4.9 Nu-Mega的BoundsChecker和運行時分析器 625

23.4.10 消失的bug 625

23.4.11 調整數值 626

23.4.12 caveman調試 626

23.4.13 當一切方法都失敗時 627

23.5 創建錯誤日誌系統 628

23.6 不同類型的bug 633

23.6.1 記憶體泄漏和堆損壞 634

23.6.2 遊戲數據損壞 637

23.6.3 堆疊損壞 638

23.6.4 剪下和貼上bug 639

23.6.5 空間不足 639

23.6.6 只在發布模式(Release Mode)中出現的bug 640

23.6.7 惹是生非的多執行緒 640

23.6.8 奇怪的bug 641

23.7 性能分析 642

23.7.1 性能的測量 642

23.7.2 代碼的最佳化 642

23.7.3 折中方案 643

23.7.4 過度最佳化 644

23.8 結束小思 644

23.9 補充書目 644

第24章 駛向結束 645

24.1 問題的整理 645

24.1.1 質量 646

24.1.2 代碼 650

24.1.3 內容 653

24.2 應付大麻煩 655

24.2.1 項目進度嚴重拖延 655

24.2.2 人事相關問題 661

24.2.3 競爭對手會置你於死地 662

24.2.4 到底有沒有出路 663

24.2.5 最後一個建議: 不要驚慌 664

24.3 光明就在前方—畢竟這不是一場訓練 664

24.3.1 測試存檔 664

24.3.2 補丁build或產品演示 665

24.3.3 事後分析 665

24.3.4 如何利用你的時間 666

相關詞條

熱門詞條

聯絡我們