目 錄
第0章 [快速入門] 網絡游戲編程網絡和游戲編程的技術基礎 001
0.1 網絡游戲開發者所需了解的網絡編程基礎 003
0.1.1 網絡編程是必需的 003
0.1.2 網絡編程與互聯網編程 003
0.1.3 互聯網編程的歷史和思想 004
0.1.4 OSI參考模型——透明地處理標準和硬件的變化 004
0.1.5 網絡游戲系統及其層次結構 005
0.1.6 套接字API的基礎知識 006
0.1.7 網絡游戲和套接字API——使用第4層的套接字API 007
專欄 網絡編程的特性和游戲架構的關系 008
0.2 套接字編程入門——處理多個并發連接、追求性能 010
0.2.1 通信鏈路的確定(復習) 010
0.2.2 套接字API基礎——一個簡單的ECHO服務器、ECHO客戶端示例 011
0.2.3 TCP通信鏈路的狀態遷移和套接字API 012
0.2.4 處理多個并發連接——通向異步套接字API之路 015
0.2.5 同步調用(阻塞)和線程 016
0.2.6 單線程、非阻塞、事件驅動——使用select函數進行輪詢 017
0.2.7 網絡游戲輸入輸出的特點——單線程、事件驅動、非阻塞 018
0.2.8 網絡游戲和實現語言 018
0.2.9 充分發揮性能和提高開發效率——從實現語言到底層結構 018
0.2.10 發揮多核服務器的性能 020
專欄 輸入輸出的實現方針和未來提高性能的可能性 020
0.2.11 多核處理器與網絡吞吐量——網絡游戲與小數據包 021
0.2.12 簡化服務器實現——libevent 025
0.3 RPC指南——最簡單的通信中間件 026
0.3.1 通信庫的必要性 026
0.3.2 網絡游戲中使用的RPC的整體結構 028
0.3.3 [補充] UDP的使用 030
0.4 游戲編程基礎 031
0.4.1 游戲編程的歷史 031
0.4.2 采用“只要能畫點就能做出游戲”的方針來開發入侵者游戲 031
0.4.3 游戲編程的基本剖析 032
0.4.4 游戲編程精粹——不使用線程的“任務系統” 040
0.4.5 兩種編程方法的相似性——不使用線程 040
0.5 小結 041
專欄 確保開發效率和各平臺之間的可移植性 041
第1章 網絡游戲的歷史和演化游戲進入了網絡世界 043
1.1 網絡游戲的技術歷史 045
1.1.1 網絡游戲出現前的50年 045
1.1.2 20世紀50年代前:計算機誕生 045
1.1.3 20世紀50年代:早期的電子游戲 046
1.1.4 20世紀60年代:各種頗具影響的機器登上歷史舞臺 046
1.1.5 20世紀70年代:網絡游戲的基本要素 050
1.1.6 20世紀80年代:網絡對戰游戲登場 051
1.1.7 20世紀90年代:游戲市場擴大 052
1.1.8 本世紀前10年的前期:網絡游戲商業化 055
1.1.9 本世紀前10年的后半期:基于Web瀏覽器的MMOG在商業上獲得成功 056
1.1.10 2010年之后:究竟會出現怎么樣的游戲呢? 057
1.2 從技術變遷看游戲文化和經濟圈 057
1.2.1 解讀技術發展圖 057
1.2.2 3個圈(三大范疇) 057
1.2.3 兩個游戲經濟/文化圈 059
1.2.4 文化、經濟與技術的關系 061
1.3 小結 062
專欄 成為出色的網絡游戲開發程序員的條件 062
第2章 何為網絡游戲網絡游戲面面觀 063
2.1 網絡游戲術語的定義 065
網絡游戲的4個層面 065
2.2 網絡游戲的物理層面 066
2.2.1 物理構成要素 066
2.2.2 物理模式/物理上的網絡構成 067
2.3 網絡游戲的概念層面 069
2.3.1 網絡游戲及其基本結構 069
2.3.2 游戲進行空間——進行游戲時所需的所有信息 070
2.3.3 游戲的進展——游戲進行空間的變化 070
2.3.4 共享相同的游戲進展 071
2.4 網絡游戲的商業層面 072
2.4.1 商業層面的要求 072
2.4.2 有效地招募測試玩家——網絡游戲與測試 073
2.4.3 不斷更新——網絡游戲的運營和更新 074
2.4.4 節約服務器數量和帶寬——網絡游戲開支的特殊性 076
2.4.5 從小規模開始,確保可擴展性—— 將風險降到最低,不要錯過取勝的機會 077
2.4.6 提供多種收費方式——收費結算方式的變化 077
2.4.7 低價、快速地根除攻擊者——攻擊、非法行為及其對策 079
2.4.8 減少服務器停止的次數和時間——不要讓玩家失望 080
2.4.9 反饋游戲結果——日志分析和結果的可視化 082
2.4.10 更容易地與其他玩家相遇——玩家匹配 084
2.5 網絡游戲的人員和組織 085
2.5.1 與網絡游戲服務的運營相關的人員 085
2.5.2 網絡游戲服務運營的3項專門職責 086
2.5.3 開發團隊 087
2.5.4 運維團隊 089
2.6 網絡游戲程序員所需的知識 090
2.6.1 網絡游戲程序員所需的技術和經驗 090
2.6.2 各種網絡游戲開發知識 095
2.7 支持網絡游戲的技術的大類 095
支持網絡游戲的技術的4種形式 096
2.8 影響開發成本的技術要素 097
2.8.1 網絡游戲與如今的開發技術 097
2.8.2 支持網絡游戲主體的3大核心 098
2.9 小結 102
專欄 網絡游戲編程的最大難點 103
第3章 網絡游戲的架構挑戰游戲的可玩性和技術限制 109
3.1 游戲編程的特性——保持快速響應 111
3.1.1 響應速度的重要性——時間總是不夠的 111
3.1.2 將數據存放在內存中的理由——游戲編程真的有三大痛苦嗎 111
3.1.3 A 每16毫秒變化一次——處理的信息及其大小 111
3.1.4 B 大量對象的顯示——CPU的處理能力 114
3.1.5 C 無法預測玩家的操作——游戲狀態千變萬化 117
3.1.6 必須將游戲數據放在CPU所在的機器上 117
3.2 網絡游戲特有的要素 118
3.2.1 通信延遲——延遲對游戲內容的限制 118
3.2.2 帶寬——傳輸量的標準 120
3.2.3 服務器——成本、服務器數量的估算 121
3.2.4 安全性——網絡游戲的弱點 121
3.2.5 輔助系統(相關系統) 125
3.3 物理架構詳解——C/S架構、P2P架構 125
3.3.1 基本的網絡拓撲結構 125
3.3.2 物理架構的種類 127
3.3.3 C/S架構——純服務器型、反射型 127
3.3.4 P2P架構 129
3.3.5 C/S+P2P混合型架構 130
3.3.6 ad-hoc模式 131
專欄 游戲客戶端是什么 131
3.4 邏輯架構詳解——MO架構 132
3.4.1 MO、MMO是什么?——同時在線數的區別 132
3.4.2 MO架構、MOG 133
3.4.3 同步方式——獲得全體玩家的信息后,游戲才能繼續 133
3.4.4 同步方式/全網狀結構的實現——所有終端都擁有主數據 133
3.4.5 同步方式/星型結構——暫時將輸入信息集中到服務器上 139
3.4.6 異步方式——接受各終端上游戲狀態的不一致 142
3.4.7 三大基本要素:自己、對手、環境——異步實現的指導方針 143
3.4.8 A 自己和對手——對戰游戲和玩家之間往來數據的抽象程度 144
3.4.9 保持結果一致性的方法——兩種覆蓋方式 148
3.4.10 B 自己和環境——可使用物品的格斗游戲和互斥控制 151
3.4.11 互斥控制的實現——采用與同步方式類似的機制來實現異步方式 152
3.4.12 狀態會自動變化的環境——靜態環境和動態環境 158
3.4.13 C 對手和環境的關系 162
3.5 邏輯架構詳解——MMO架構 163
3.5.1 MMO架構、MMOG——在大量玩家之間共享長期存在的游戲過程 164
3.5.2 MMOG的結構 165
3.5.3 大型多人網絡游戲(MMO) 168
3.6 小結 168
專欄 設法改善網頁游戲的畫面顯示間隔 169
第4章 [實踐] C/S MMO游戲開發長期運行的游戲服務器 171
4.1 網絡游戲開發的基本流程 173
4.1.1 項目文檔/交付物 173
4.1.2 開發的進行和文檔準備的流程 175
4.1.3 技術人員的文檔/交付物 176
4.2 C/S MMO游戲的發展趨勢和對策 177
4.2.1 C/S MMO游戲的特點 177
4.2.2 C/S MMO架構(MMO架構)特有的游戲內容 177
4.3 策劃文檔和5種設計文檔——從虛構游戲K Online的開發中學習 179
4.3.1 考慮示例游戲的題材 179
4.3.2 詳細設計文檔 180
4.3.3 MMOG龐大的游戲設定 181
4.3.4 5種設計文檔 182
4.3.5 設計上的重要判斷 182
4.4 系統基本結構圖的制定 184
4.4.1 系統基本結構圖的基礎 184
4.4.2 服務器必須具有可擴展性——商業模式的確認 184
4.4.3 各種瓶頸——擴展方式的選擇 184
專欄 MMO客戶端特有的渲染性能瓶頸 186
4.4.4 解決游戲服務器/數據庫的瓶頸 187
4.4.5 什么都不做的情況(1臺服務器負責整個游戲世界) 188
4.4.6 空間分割法——解決游戲服務器的瓶頸 189
4.4.7 實例法——解決游戲服務器的瓶頸 190
4.4.8 平行世界方式——解決數據庫瓶頸 191
4.4.9 同時采用多種方法——應對越來越多的玩家 193
4.4.10 各種方式的引入難度 194
4.4.11 各個世界中數據庫(游戲數據庫)服務器的絕對性能的提高 194
4.4.12 K Online的設計估算——首先從同時在線數開始 195
4.4.13 根據游戲邏輯的處理成本來估算——敵人的行動算法需要消耗多少CPU 196
4.1.14 根據游戲數據庫的處理負荷進行估算——找到“角色數據的保存頻率”與“數據庫負荷”的關系 198
4.4.15 可擴展性的最低討論結果,追求進一步的用戶體驗 199
4.4.16 服務器的基本結構,制定系統基本結構圖 200
4.5 進程關系圖的制定 201
4.5.1 進程關系圖的準備 201
4.5.2 服務器連接的結構——只用空間分割法 202
4.5.3 服務器連接的結構——使用平行世界方式和空間分割法 203
4.5.4 使用平行世界方式進行擴展的關鍵點 204
4.6 帶寬/服務器資源估算文檔的制定 205
4.6.1 以進程列表為基礎估算服務器資源 205
4.6.2 以CPU為中心的服務器和以存儲為中心的服務器 208
4.6.3 服務器資源的成本估算——首先從初期費用開始 208
4.6.4 帶寬成本的估算 209
4.6.5 帶寬減半的方針——首先是調整策劃,然后在程序上下功夫 210
4.6.6 策劃內容的分析對帶寬的降低很有效 211
4.7 協議定義文檔的制定——協議的基本性質 211
4.7.1 協議定義文檔基礎 212
4.7.2 “協議的基本性質”的要點 212
4.7.3 協議的種類、以及進程之間關系的種類 213
4.7.4 8種類型的協議 213
4.7.5 C/S MMO采用TCP 214
4.7.6 與“協議的基本性質”的對應 214
4.8 協議定義文檔——協議的API規范(概要) 217
4.8.1 協議的實現原則 217
4.8.2 8種協議的功能/形式概述 221
4.9 協議定義文檔——協議的API規范(詳細) 223
4.9.1 協議API規范(詳細)的制定 224
4.9.2 API的函數定義 224
4.9.3 常量定義 229
4.9.4 API的調用時序 230
4.9.5 時序圖制定的要點 238
4.10 協議定義文檔——數據包的格式 238
4.10.1 C/S MMO主要采用TCP(復習) 238
4.10.2 C/S MMO使用包含專用字節數組的二進制協議 239
4.10.3 二進制協議的實現——首先從術語的整理開始 239
專欄 C/S MMO的壓縮和加密 242
4.11 數據庫設計圖 242
4.11.1 要在編程之前進行對重要的表進行設計 242
4.11.2 C/S MMO中的數據庫實現的歷史變遷 243
4.11.3 整理K Online所需的表 245
專欄 百花繚亂的KVS 246
4.11.4 數據庫性能預測 250
4.12 服務器/客戶端軟件+中間件——實踐中不可或缺的開發基礎 254
4.12.1 網絡游戲的中間件 254
4.12.2 開發的基礎軟件——可以立刻嘗試的C/S MMO開發體驗 256
4.13 程序開發中的基本原則 258
4.13.1 如何開始編程、如何繼續編程 258
4.13.2 數據結構優先原則——基本原則 259
4.13.3 實現數據結構之前的討論——出現在畫面上和不出現在畫面上的元素 262
4.13.4 維持可玩狀態的原則——基本原則 263
4.13.5 后端服務器的延后原則——基本原則 264
4.13.6 持續測定的原則——基本原則 264
4.14 C/S MMO游戲K Online的實現——編程開始! 266
4.14.1 開發的安排 266
4.14.2 K Online中的分工計劃 267
4.14.3 K Online中“框架階段”和“原型階段”的區別 268
4.14.4 [步驟1~2] 框架~原型階段 269
專欄 每一步的進度管理形式 272
4.14.5 “不實際運行起來是不會理解的!”——游戲開發的特殊性 274
專欄 C/C++以外的語言 275
4.14.6 框架的整體結構 276
專欄 VCE是什么 278
4.14.7 以怎樣的順序來編寫代碼 280
4.14.8 首先編寫協議定義文件k.xml——開發流程 280
4.14.9 協議定義的要點 281
4.14.10 通信連通確認:ping函數 281
4.14.11 賬戶登錄和賬戶認證:signup函數、authentication函數 283
4.14.12 角色創建:createCharacter函數 284
4.14.13 登錄:login函數 285
4.14.14 在地面上移動:move函數、moveNotify 286
4.14.15 編寫gmsv/Makefile——開發流程 293
4.14.16 從示例中復制gmsv/climain.cpp和gmsvmain.cpp——開發流程 293
專欄 dbsv服務器代碼的自動生成 297
4.14.17 自動測試客戶端autocli的實現——開發流程 300
專欄 gmsv中線程的使用 305
4.14.18 圖形客戶端cli的創建和運行確認——開發流程 307
4.14.19 框架之后的開發——開發流程、后續事項 310
4.15 總結 310
第5章 [實踐] P2P MO游戲開發
沒有專用服務器的動作類游戲的實現 311
5.1 P2P MO游戲的特點和開發策略 313
5.1.1 P2P MO和動作類游戲——游戲的狀態頻繁發生改變 313
5.1.2 RPC和共享內存 313
5.1.3 P2P MO游戲的特點——和c/s MMO游戲的比較和難點 314
5.1.4 P2P MO游戲的優點 316
5.1.5 從概要設計開始考慮[多人游戲模式] 316
5.2 J Multiplayer游戲開發案例的學習——和K Online的不同 316
5.2.1 J Multiplayer——和K Online的比較 317
5.2.2 P2P MO游戲開發的基本流程 317
5.2.3 P2P MO游戲開發的交付產品——開發各個階段需要提交的資料 317
5.2.4 和C/S MMO的數據量/規模的比較 319
5.3 P2P MO游戲的設計資料 319
5.3.1 系統基本結構圖 320
5.3.2 進程關系圖 320
5.3.3 帶寬/服務器資源計算資料 323
5.3.4 通信協議定義資料和API 規格 323
專欄 什么是“游戲邏輯” 324
5.3.5 帶寬消耗量的估算 327
5.3.6 其他資料 331
5.4 客戶端/服務器軟件+中間件、基本原則 332
5.4.1 P2P MO開發的最終交付產品 332
5.4.2 P2P MO中使用的中間件 333
5.4.3 編程時應該注意的基本原則——針對P2P MO游戲 333
5.5 P2P MO游戲J Multiplayer的實現——正式開始編程 334
5.5.1 J Multiplayer的編程計劃 334
5.5.2 開發流程——K Online的回顧 334
5.5.3 J Multiplayer開發階段——開發順序和內容 335
5.5.4 第1階段的要點 335
5.5.5 客戶端程序的開發案例 336
5.5.6 “共享內存方式”的實現——開始編碼 337
5.5.7 P2P MO游戲開發中該如何防止發生競爭狀態 339
5.5.8 共享內存開發方式該如何編碼——共享內存開發方式和RPC開發方式的比較 343
5.5.9 SyncValue類 347
專欄 數據中心的地理位置分布 352
5.6 支持C/S MO游戲的技術[補充] 353
5.6.1 C/S MO和NAT問題 353
5.6.2 什么是NAT問題 353
5.6.3 NAT遍歷——解決NAT問題建立通信路徑的技術 353
5.6.4 NAT問題的實際解決方法 355
5.6.5 中繼服務器 356
5.6.6 中繼服務器的折衷方案 356
5.7 總結 358
第6章 網絡游戲的輔助系統完善游戲服務的必要機制 359
6.1 輔助系統需要的各種功能 361
6.1.1 現有服務提供的輔助系統功能 361
6.1.2 現有服務的功能一覽 363
6.1.3 網頁游戲開發方法和客戶端游戲的開發方法 365
6.2 交流/ 通信功能 365
6.2.1 玩家匹配P2P MO 365
6.2.2 游戲大廳P2P MO 369
6.2.3 中繼服務器P2P MO 370
6.2.4 聊天P2P MO C/S MMO 371
6.2.5 郵件P2P MO C/S MMO 374
6.2.6 好友列表P2P MO C/S MMO 374
6.2.7 玩家狀態P2P MO C/S MMO 375
6.2.8 加鎖服務器P2P MO C/S MMO 376
6.2.9 黑名單P2P MO C/S MMO 377
6.2.10 語音聊天P2P MO C/S MMO 378
6.3 游戲客戶端實現相關的輔助系統 378
6.3.1 玩家成績管理P2P MO C/S MMO 378
6.3.2 存儲功能P2P MO 379
6.3.3 (游戲客戶端)更新P2P MO C/S MMO 380
6.3.4 排行榜P2P MO C/S MMO 381
6.4 運營輔助系統 383
新聞發布P2P MO C/S MMO 383
6.5 付費相關的輔助系統 384
6.5.1 付費認證P2P MO C/S MMO 384
6.5.2 虛擬貨幣管理P2P MO C/S MMO 387
專欄 C/S MMO游戲的收入 388
6.6 其他輔助功能 390
6.6.1 游戲數據瀏覽/查詢工具P2P MO C/S MMO 390
6.6.2 敏感詞過濾P2P MO C/S MMO 392
6.7 本章小結 392
第7章 支持網絡游戲運營的基礎設施架構、負荷測試和運營 393
7.1 基礎設施架構的基礎知識 395
7.1.1 C/S MMO和P2P MO的基礎設施(概要) 395
7.1.2 基礎設施架構需要進行的工作——從開發整體來看 395
7.1.3 基礎設施的成本估算 396
7.1.4 成本的概念、單位 397
7.1.5 網絡游戲服務器在一定程度上可以接收的條件 398
7.1.6 硬件、信息設備 398
7.1.7 軟件 399
7.1.8 數據中心相關的成本 401
7.1.9 服務費(數據中心以外) 403
7.1.10 網絡帶寬費 403
7.1.11 電費 404
7.2 開發者需要知道的基礎設施架構技巧 404
7.2.1 服務規模的擴大/縮小——用戶數和需要的基礎設施規模 404
7.2.2 典型的環境 404
7.2.3 負荷曲線 405
7.2.4 面向開發者的基礎設施架構要點 407
7.2.5 服務器部署 407
7.2.6 登臺環境 409
7.2.7 服務器的監控、生死監控 410
7.2.8 日志輸出/管理 411
7.3 K Online 、J Multiplayer游戲的基礎設施架構 412
7.3.1 K Online的基礎設施 413
7.3.2 J Multiplayer的基礎設施 414
7.4 負荷測試 417
7.4.1 負荷測試的準備 417
7.4.2 K Online在生產環境的負荷測試 417
7.4.3 負荷測試時使用的服務器監控命令 418
7.4.4 J Multiplayer在生產環境下的負荷測試 422
7.5 游戲上線 423
7.5.1 游戲上線前——從確認安全設定開始 423
7.5.2 游戲上線后——系統監控 424
7.5.3 服務器的組群化 425
7.5.4 故障發生時的應對 427
7.6 本章小結 428
第8章 網絡游戲的開發體制團隊管理的挑戰 429
8.1 游戲的策劃內容和開發團隊 網絡游戲特有的挑戰 431
8.1.1 游戲的策劃內容是團隊管理的關鍵 431
8.1.2 游戲數據的持久化 431
8.1.3 游戲中玩家之間的關系 432
8.1.4 游戲結果的共享范圍 433
8.1.5 聊天系統的內容 434
8.1.6 維護和升級的計劃 434
8.1.7 代碼規模——如果需要迭代的代碼過多就會遇到問題 435
8.2 網絡游戲開發團隊的實際情況——和一般軟件開發相同的地方 436
8.2.1 工作分配 436
8.2.2 持續提升網絡游戲程序員技能的方法 438
8.2.3 項目管理術——游戲開發和Scrum 440
8.2.4 開發環境的選擇 440
8.2.5 項目的移交——理所當然的事情也需要仔細歸納總結 441
8.3 本章小結 442
專欄 網絡游戲開發的成本 443