多人在線游戲架構(gòu)實(shí)戰(zhàn):基于C++的分布式游戲編程
定 價(jià):109 元
- 作者:彭放
- 出版時(shí)間:2020/11/1
- ISBN:9787111667926
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP317.63
- 頁碼:0
- 紙張:
- 版次:
- 開本:16開
本書主要講述大型多人在線游戲開發(fā)的框架與編程實(shí)戰(zhàn),以實(shí)例的形式講解從零開始制作網(wǎng)絡(luò)游戲框架的完整過程,讓讀者了解網(wǎng)絡(luò)游戲制作中的所有細(xì)節(jié)。*終得到一個(gè)完整的、基于ECS模式的、高效的分布式服務(wù)端框架,一個(gè)可以登錄的客戶端以及用于驗(yàn)證網(wǎng)絡(luò)游戲各個(gè)模塊功能的自動(dòng)化測試系統(tǒng)。
全書共12章,從網(wǎng)絡(luò)游戲的底層網(wǎng)絡(luò)編程開始,逐步引導(dǎo)讀者深入網(wǎng)絡(luò)游戲開發(fā)的各個(gè)步驟。通過近50個(gè)真實(shí)示例、90個(gè)流程圖,以直觀的方式闡述和還原游戲制作的全過程,涵蓋網(wǎng)絡(luò)游戲設(shè)計(jì)的核心概念和實(shí)現(xiàn):游戲主循環(huán)、線程、Actor模式、定時(shí)器、對(duì)象池、組件編碼、架構(gòu)層的解耦等。
前言
第1章 網(wǎng)絡(luò)編程基礎(chǔ)1
1.1 單機(jī)游戲與網(wǎng)絡(luò)游戲的區(qū)別1
1.2 理解IP地址4
1.3 理解TCP/IP5
1.4 阻塞式網(wǎng)絡(luò)編程7
1.4.1 工程源代碼7
1.4.2 服務(wù)端代碼分析9
1.4.3 客戶端代碼分析13
1.4.4 系統(tǒng)差異14
1.4.5 網(wǎng)絡(luò)底層函數(shù)說明14
1.4.6 小結(jié)17
1.5 非阻塞網(wǎng)絡(luò)編程17
1.5.1 工程源代碼18
1.5.2 服務(wù)端代碼分析19
1.5.3 客戶端代碼分析21
1.5.4 小結(jié)23
1.6 總結(jié)24
第2章 網(wǎng)絡(luò)IO多路復(fù)用25
2.1 Select網(wǎng)絡(luò)模型25
2.1.1 ::select函數(shù)說明25
2.1.2 工程源代碼27
2.1.3 網(wǎng)絡(luò)基類: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 小結(jié)55
2.2 Epoll網(wǎng)絡(luò)模型55
2.2.1 函數(shù)說明56
2.2.2 源代碼分析57
2.2.3 小結(jié)60
2.3 網(wǎng)絡(luò)協(xié)議:protobuf61
2.3.1 在Windows下編譯使用protobuf62
2.3.2 在Linux下編譯使用protobuf64
2.3.3 使用protobuf定義協(xié)議66
2.4 總結(jié)69
第3章 線程、進(jìn)程以及Actor模型70
3.1 游戲架構(gòu)概述70
3.1.1 無服務(wù)端游戲70
3.1.2 單進(jìn)程CS架構(gòu)71
3.1.3 多進(jìn)程CS架構(gòu)71
3.2 框架瓶頸72
3.2.1 滾服游戲72
3.2.2 副本游戲73
3.2.3 大圖分割空間游戲73
3.3 設(shè)計(jì)游戲框架74
3.4 游戲主循環(huán)76
3.5 理解進(jìn)程和線程77
3.5.1 進(jìn)程是什么77
3.5.2 線程是什么78
3.5.3 C++標(biāo)準(zhǔn)線程庫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對(duì)象之間的消息處理機(jī)制92
3.8.1 消息定義原則93
3.8.2 消息隊(duì)列機(jī)制94
3.9 總結(jié)99
第4章 賬號(hào)登錄與驗(yàn)證100
4.1 登錄流程圖100
4.2 制作一個(gè)簡單的驗(yàn)證接口101
4.2.1 Nginx參考配置102
4.2.2 php-fpm參考配置103
4.3 導(dǎo)入PHP登錄接口104
4.3.1 修改PHP中的數(shù)據(jù)庫配置104
4.3.2 導(dǎo)入測試賬號(hào)105
4.3.3 批量生成賬號(hào)105
4.4 編碼中用到的第三方庫106
4.4.1 庫libcurl106
4.4.2 庫libjsoncpp107
4.5 賬號(hào)驗(yàn)證代碼分析108
4.5.1 定義登錄協(xié)議號(hào)108
4.5.2 處理協(xié)議的Account類110
4.5.3 Account類如何放置到線程中110
4.5.4 處理驗(yàn)證的HttpRequestAccount類112
4.6 結(jié)果測試115
4.7 消息過濾機(jī)制116
4.8 測試機(jī)器人118
4.8.1 狀態(tài)機(jī)119
4.8.2 狀態(tài)機(jī)基類120
4.8.3 狀態(tài)機(jī)管理類120
4.8.4 Robot類中的狀態(tài)機(jī)122
4.9 批量登錄測試125
4.10 總結(jié)126
第5章 性能優(yōu)化與對(duì)象池127
5.1 Visual Studio性能工具127
5.2 內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)131
5.2.1 交換型數(shù)據(jù)結(jié)構(gòu)131
5.2.2 刷新型數(shù)據(jù)結(jié)構(gòu)135
5.3 gprof137
5.3.1 gprof調(diào)用堆棧圖138
5.3.2 讓進(jìn)程安全退出139
5.3.3 用gprof工具查看框架141
5.4 valgrind145
5.5 對(duì)象池150
5.5.1 對(duì)象池代碼分析150
5.5.2 使用cmd命令查看對(duì)象池154
5.6 總結(jié)155
第6章 搭建ECS框架156
6.1 一個(gè)簡單的ECS工程156
6.1.1 組件類Component157
6.1.2 實(shí)體類Entity158
6.1.3 系統(tǒng)類System158
6.1.4 管理類EntitySystem159
6.1.5 測試161
6.2 基于ECS框架的libserver162
6.2.1 通過字符串動(dòng)態(tài)創(chuàng)建類163
6.2.2 提供多參變量來創(chuàng)建實(shí)例168
6.2.3 EntitySystem的工作原理171
6.3 基于ECS框架的login和robots工程177
6.3.1 Account類177
6.3.2 動(dòng)態(tài)創(chuàng)建組件或?qū)嵗?78
6.3.3 ECS框架下的網(wǎng)絡(luò)通信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 總結(jié)202
第7章 MySQL數(shù)據(jù)庫203
7.1 MySQL Connector/C203
7.2 連接時(shí)使用的函數(shù)說明204
7.3 數(shù)據(jù)庫連接組件206
7.3.1 MysqlConnector組件206
7.3.2 連接數(shù)據(jù)庫206
7.3.3 關(guān)閉連接207
7.4 寫入數(shù)據(jù)時(shí)使用的函數(shù)說明208
7.5 寫入數(shù)據(jù)示例209
7.5.1 創(chuàng)建預(yù)處理209
7.5.2 用預(yù)處理創(chuàng)建角色211
7.6 查詢數(shù)據(jù)時(shí)使用的函數(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ù)結(jié)構(gòu)與protobuf結(jié)構(gòu)227
7.10 角色查詢與創(chuàng)建流程229
7.10.1 為login進(jìn)程與dbmgr進(jìn)程創(chuàng)建連接類229
7.10.2 找到指定的NetworkConnector實(shí)例230
7.10.3 創(chuàng)建角色232
7.10.4 機(jī)器人登錄創(chuàng)建角色測試232
7.11 總結(jié)233
第8章 深入學(xué)習(xí)組件式編程234
8.1 新的系統(tǒng)管理類SystemManager234
8.1.1 實(shí)體系統(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 查看線程中的所有對(duì)象247
8.2.4 測試執(zhí)行效率248
8.3 線程分類248
8.4 IAwakeSystem接口與對(duì)象池251
8.4.1 DynamicObjectPoolCollector對(duì)象池集合252
8.4.2 全局單例對(duì)象253
8.4.3 查看線程中的所有對(duì)象255
8.5 主動(dòng)銷毀對(duì)象258
8.5.1 一般組件銷毀258
8.5.2 引用計(jì)數(shù)銷毀對(duì)象259
8.6 時(shí)間堆262
8.6.1 堆實(shí)現(xiàn)代碼264
8.6.2 時(shí)間堆組件265
8.7 總結(jié)270
第9章 服務(wù)器管理進(jìn)程與HTTP271
9.1 啟動(dòng)多個(gè)login進(jìn)程271
9.2 appmgr進(jìn)程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é)議號(hào)282
9.4.4 收到HTTP請(qǐng)求是如何響應(yīng)的283
9.4.5 發(fā)送HTTP返回?cái)?shù)據(jù)流程286
9.5 為Packet定義新的網(wǎng)絡(luò)標(biāo)識(shí)287
9.5.1 使用網(wǎng)絡(luò)標(biāo)識(shí)創(chuàng)建一個(gè)連接289
9.5.2 使用網(wǎng)絡(luò)標(biāo)識(shí)發(fā)送數(shù)據(jù)291
9.5.3 向外部請(qǐng)求HTTP數(shù)據(jù)293
9.6 HTTP分塊295
9.7 機(jī)器人測試批量登錄297
9.8 總結(jié)300
第10章 分布式登錄與Redis內(nèi)存數(shù)據(jù)庫301
10.1 game與space的定位301
10.1.1 選擇合適的game進(jìn)程305
10.1.2 使用token登錄game進(jìn)程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中的應(yīng)用317
10.2.6 Redis在game中的應(yīng)用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 多進(jìn)程登錄協(xié)議回顧332
10.5 總結(jié)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é)議的時(shí)機(jī)353
11.3.2 跳轉(zhuǎn)協(xié)議的數(shù)據(jù)定義353
11.3.3 目標(biāo)代理地圖收到跳轉(zhuǎn)協(xié)議356
11.3.4 網(wǎng)絡(luò)標(biāo)識(shí)如何在網(wǎng)絡(luò)中傳遞357
11.3.5 space進(jìn)程發(fā)送的協(xié)議如何轉(zhuǎn)發(fā)到客戶端360
11.4 通過客戶端進(jìn)入游戲363
11.5 玩家在WorldProxy之間的跳轉(zhuǎn)367
11.6 總結(jié)374
第12章 斷線與動(dòng)態(tài)加載系統(tǒng)375
12.1 玩家斷線375
12.1.1 玩家在login進(jìn)程中斷線376
12.1.2 玩家在game進(jìn)程中斷線376
12.1.3 玩家斷線時(shí)World類的處理377
12.1.4 玩家數(shù)據(jù)的讀取與保存377
12.1.5 如何進(jìn)入斷線之前的地圖381
12.2 進(jìn)程之間的斷線382
12.2.1 login進(jìn)程斷線與重連382
12.2.2 game進(jìn)程斷線與重連383
12.2.3 space進(jìn)程斷線與重連385
12.2.4 appmgr進(jìn)程斷線與重連387
12.3 動(dòng)態(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 測試移動(dòng)394
12.4 總結(jié)395
寫在最后——如何構(gòu)建自己的框架396