多人在線游戲架構實戰(zhàn):基于C++的分布式游戲編程
定 價:109 元
- 作者:彭放
- 出版時間:2020/11/1
- ISBN:9787111667926
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP317.63
- 頁碼:0
- 紙張:
- 版次:
- 開本:16開
本書主要講述大型多人在線游戲開發(fā)的框架與編程實戰(zhàn),以實例的形式講解從零開始制作網(wǎng)絡游戲框架的完整過程,讓讀者了解網(wǎng)絡游戲制作中的所有細節(jié)。*終得到一個完整的、基于ECS模式的、高效的分布式服務端框架,一個可以登錄的客戶端以及用于驗證網(wǎng)絡游戲各個模塊功能的自動化測試系統(tǒng)。
全書共12章,從網(wǎng)絡游戲的底層網(wǎng)絡編程開始,逐步引導讀者深入網(wǎng)絡游戲開發(fā)的各個步驟。通過近50個真實示例、90個流程圖,以直觀的方式闡述和還原游戲制作的全過程,涵蓋網(wǎng)絡游戲設計的核心概念和實現(xiàn):游戲主循環(huán)、線程、Actor模式、定時器、對象池、組件編碼、架構層的解耦等。
前言
第1章 網(wǎng)絡編程基礎1
1.1 單機游戲與網(wǎng)絡游戲的區(qū)別1
1.2 理解IP地址4
1.3 理解TCP/IP5
1.4 阻塞式網(wǎng)絡編程7
1.4.1 工程源代碼7
1.4.2 服務端代碼分析9
1.4.3 客戶端代碼分析13
1.4.4 系統(tǒng)差異14
1.4.5 網(wǎng)絡底層函數(shù)說明14
1.4.6 小結17
1.5 非阻塞網(wǎng)絡編程17
1.5.1 工程源代碼18
1.5.2 服務端代碼分析19
1.5.3 客戶端代碼分析21
1.5.4 小結23
1.6 總結24
第2章 網(wǎng)絡IO多路復用25
2.1 Select網(wǎng)絡模型25
2.1.1 ::select函數(shù)說明25
2.1.2 工程源代碼27
2.1.3 網(wǎng)絡基類:Network29
2.1.4 NetworkListen分析31
2.1.5 Server流程詳解35
2.1.6 NetworkConnector分析37
2.1.7 測試流程詳解39
2.1.8 ConnectObj分析41
2.1.9 Buffer分析42
2.1.10 RecvNetworkBuffer分析44
2.1.11 SendNetworkBuffer分析48
2.1.12 Packet分析50
2.1.13 小結55
2.2 Epoll網(wǎng)絡模型55
2.2.1 函數(shù)說明56
2.2.2 源代碼分析57
2.2.3 小結60
2.3 網(wǎng)絡協(xié)議:protobuf61
2.3.1 在Windows下編譯使用protobuf62
2.3.2 在Linux下編譯使用protobuf64
2.3.3 使用protobuf定義協(xié)議66
2.4 總結69
第3章 線程、進程以及Actor模型70
3.1 游戲架構概述70
3.1.1 無服務端游戲70
3.1.2 單進程CS架構71
3.1.3 多進程CS架構71
3.2 框架瓶頸72
3.2.1 滾服游戲72
3.2.2 副本游戲73
3.2.3 大圖分割空間游戲73
3.3 設計游戲框架74
3.4 游戲主循環(huán)76
3.5 理解進程和線程77
3.5.1 進程是什么77
3.5.2 線程是什么78
3.5.3 C++標準線程庫79
3.6 Actor模型82
3.7 游戲框架中的線程84
3.7.1 包裹類ThreadObject85
3.7.2 線程類Thread85
3.7.3 線程管理類ThreadMgr86
3.7.4 libserver庫與游戲邏輯88
3.8 Actor對象之間的消息處理機制92
3.8.1 消息定義原則93
3.8.2 消息隊列機制94
3.9 總結99
第4章 賬號登錄與驗證100
4.1 登錄流程圖100
4.2 制作一個簡單的驗證接口101
4.2.1 Nginx參考配置102
4.2.2 php-fpm參考配置103
4.3 導入PHP登錄接口104
4.3.1 修改PHP中的數(shù)據(jù)庫配置104
4.3.2 導入測試賬號105
4.3.3 批量生成賬號105
4.4 編碼中用到的第三方庫106
4.4.1 庫libcurl106
4.4.2 庫libjsoncpp107
4.5 賬號驗證代碼分析108
4.5.1 定義登錄協(xié)議號108
4.5.2 處理協(xié)議的Account類110
4.5.3 Account類如何放置到線程中110
4.5.4 處理驗證的HttpRequestAccount類112
4.6 結果測試115
4.7 消息過濾機制116
4.8 測試機器人118
4.8.1 狀態(tài)機119
4.8.2 狀態(tài)機基類120
4.8.3 狀態(tài)機管理類120
4.8.4 Robot類中的狀態(tài)機122
4.9 批量登錄測試125
4.10 總結126
第5章 性能優(yōu)化與對象池127
5.1 Visual Studio性能工具127
5.2 內(nèi)存中的數(shù)據(jù)結構131
5.2.1 交換型數(shù)據(jù)結構131
5.2.2 刷新型數(shù)據(jù)結構135
5.3 gprof137
5.3.1 gprof調(diào)用堆棧圖138
5.3.2 讓進程安全退出139
5.3.3 用gprof工具查看框架141
5.4 valgrind145
5.5 對象池150
5.5.1 對象池代碼分析150
5.5.2 使用cmd命令查看對象池154
5.6 總結155
第6章 搭建ECS框架156
6.1 一個簡單的ECS工程156
6.1.1 組件類Component157
6.1.2 實體類Entity158
6.1.3 系統(tǒng)類System158
6.1.4 管理類EntitySystem159
6.1.5 測試161
6.2 基于ECS框架的libserver162
6.2.1 通過字符串動態(tài)創(chuàng)建類163
6.2.2 提供多參變量來創(chuàng)建實例168
6.2.3 EntitySystem的工作原理171
6.3 基于ECS框架的login和robots工程177
6.3.1 Account類177
6.3.2 動態(tài)創(chuàng)建組件或?qū)嵗?78
6.3.3 ECS框架下的網(wǎng)絡通信185
6.3.4 執(zhí)行效率188
6.4 YAML文件189
6.4.1 YAML編譯安裝189
6.4.2 讀取YAML配置文件191
6.4.3 合并線程195
6.5 log4cplus日志197
6.5.1 log4cplus的編譯安裝197
6.5.2 配置文件198
6.5.3 使用log4cplus200
6.6 總結202
第7章 MySQL數(shù)據(jù)庫203
7.1 MySQL Connector/C203
7.2 連接時使用的函數(shù)說明204
7.3 數(shù)據(jù)庫連接組件206
7.3.1 MysqlConnector組件206
7.3.2 連接數(shù)據(jù)庫206
7.3.3 關閉連接207
7.4 寫入數(shù)據(jù)時使用的函數(shù)說明208
7.5 寫入數(shù)據(jù)示例209
7.5.1 創(chuàng)建預處理209
7.5.2 用預處理創(chuàng)建角色211
7.6 查詢數(shù)據(jù)時使用的函數(shù)說明215
7.7 查詢數(shù)據(jù)示例216
7.7.1 Query查詢函數(shù)216
7.7.2 查詢玩家數(shù)據(jù)217
7.8 數(shù)據(jù)表的創(chuàng)建與更新219
7.8.1 創(chuàng)建表221
7.8.2 更新表224
7.8.3 測試更新與創(chuàng)建組件225
7.9 數(shù)據(jù)表中的數(shù)據(jù)結構與protobuf結構227
7.10 角色查詢與創(chuàng)建流程229
7.10.1 為login進程與dbmgr進程創(chuàng)建連接類229
7.10.2 找到指定的NetworkConnector實例230
7.10.3 創(chuàng)建角色232
7.10.4 機器人登錄創(chuàng)建角色測試232
7.11 總結233
第8章 深入學習組件式編程234
8.1 新的系統(tǒng)管理類SystemManager234
8.1.1 實體系統(tǒng)EntitySystem236
8.1.2 更新系統(tǒng)UpdateSystem238
8.1.3 消息系統(tǒng)MessageSystem240
8.1.4 測試執(zhí)行效率242
8.2 allinone工程242
8.2.1 新工程allinone243
8.2.2 協(xié)議是如何被轉(zhuǎn)發(fā)的244
8.2.3 查看線程中的所有對象247
8.2.4 測試執(zhí)行效率248
8.3 線程分類248
8.4 IAwakeSystem接口與對象池251
8.4.1 DynamicObjectPoolCollector對象池集合252
8.4.2 全局單例對象253
8.4.3 查看線程中的所有對象255
8.5 主動銷毀對象258
8.5.1 一般組件銷毀258
8.5.2 引用計數(shù)銷毀對象259
8.6 時間堆262
8.6.1 堆實現(xiàn)代碼264
8.6.2 時間堆組件265
8.7 總結270
第9章 服務器管理進程與HTTP271
9.1 啟動多個login進程271
9.2 appmgr進程272
9.3 HTTP275
9.4 使用Mongoose分析HTTP格式277
9.4.1 HTTP類型278
9.4.2 接收HTTP數(shù)據(jù)279
9.4.3 處理HTTP數(shù)據(jù)的協(xié)議號282
9.4.4 收到HTTP請求是如何響應的283
9.4.5 發(fā)送HTTP返回數(shù)據(jù)流程286
9.5 為Packet定義新的網(wǎng)絡標識287
9.5.1 使用網(wǎng)絡標識創(chuàng)建一個連接289
9.5.2 使用網(wǎng)絡標識發(fā)送數(shù)據(jù)291
9.5.3 向外部請求HTTP數(shù)據(jù)293
9.6 HTTP分塊295
9.7 機器人測試批量登錄297
9.8 總結300
第10章 分布式登錄與Redis內(nèi)存數(shù)據(jù)庫301
10.1 game與space的定位301
10.1.1 選擇合適的game進程305
10.1.2 使用token登錄game進程307
10.1.3 Player組件308
10.2 Redis及其第三方庫309
10.2.1 Redis的安裝310
10.2.2 Redis 命令行命令311
10.2.3 hireids庫312
10.2.4 組件RedisConnector314
10.2.5 Redis在login中的應用317
10.2.6 Redis在game中的應用323
10.2.7 從Redis刪除數(shù)據(jù)325
10.3 性能瓶頸分析327
10.3.1 使用日志查看瓶頸327
10.3.2 優(yōu)化MessageComponent組件329
10.3.3 ConnectObj內(nèi)存組織331
10.4 多進程登錄協(xié)議回顧332
10.5 總結334
第11章 分布式跳轉(zhuǎn)方案335
11.1 資源數(shù)據(jù)配置與讀取335
11.1.1 資源管理類ResourceManager336
11.1.2 地圖資源管理類ResourceWorldMgr337
11.1.3 地圖資源類ResourceWorld340
11.2 地圖類World與代理類WorldProxy343
11.2.1 地圖類World344
11.2.2 為什么需要WorldProxy350
11.3 分布式地圖跳轉(zhuǎn)流程351
11.3.1 發(fā)起跳轉(zhuǎn)協(xié)議的時機353
11.3.2 跳轉(zhuǎn)協(xié)議的數(shù)據(jù)定義353
11.3.3 目標代理地圖收到跳轉(zhuǎn)協(xié)議356
11.3.4 網(wǎng)絡標識如何在網(wǎng)絡中傳遞357
11.3.5 space進程發(fā)送的協(xié)議如何轉(zhuǎn)發(fā)到客戶端360
11.4 通過客戶端進入游戲363
11.5 玩家在WorldProxy之間的跳轉(zhuǎn)367
11.6 總結374
第12章 斷線與動態(tài)加載系統(tǒng)375
12.1 玩家斷線375
12.1.1 玩家在login進程中斷線376
12.1.2 玩家在game進程中斷線376
12.1.3 玩家斷線時World類的處理377
12.1.4 玩家數(shù)據(jù)的讀取與保存377
12.1.5 如何進入斷線之前的地圖381
12.2 進程之間的斷線382
12.2.1 login進程斷線與重連382
12.2.2 game進程斷線與重連383
12.2.3 space進程斷線與重連385
12.2.4 appmgr進程斷線與重連387
12.3 動態(tài)新增系統(tǒng)389
12.3.1 MoveComponent組件389
12.3.2 新系統(tǒng)MoveSystem391
12.3.3 加載新系統(tǒng)392
12.3.4 測試移動394
12.4 總結395
寫在最后——如何構建自己的框架396