定 價(jià):99 元
叢書名:游戲開發(fā)與設(shè)計(jì)技術(shù)叢書
- 作者:羅培羽
- 出版時(shí)間:2021/8/1
- ISBN:9787111687559
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP317.6
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
第 一部分“學(xué)以致用”揭示了 Skynet 引擎的使用方法及注意事項(xiàng),以“球球大作戰(zhàn)”的案例貫穿本篇內(nèi)容,全面又詳盡地剖析服務(wù)端結(jié)構(gòu)設(shè)計(jì)、通信協(xié)議格式、數(shù)據(jù)表結(jié)構(gòu)設(shè)計(jì)、斷線重連方案等眾多核心技術(shù)。第二部分“入木三分”揭示了在多核時(shí)代采用現(xiàn)代 C++ 編寫多線程 TCP 網(wǎng)絡(luò)服務(wù)器的高效做法,以 C++ 重寫 Skynet 的案例貫穿本篇內(nèi)容,使用大量圖表,生動(dòng)翔實(shí)地描述 Linux 環(huán)境下的編程技術(shù)。第三部分“各個(gè)擊破”列舉了同步算法、熱更新、防外掛等實(shí)際工程難題,并對其逐一擊破,非常具有實(shí)用價(jià)值。
這本書講什么
本書是基于C++與Lua語言開發(fā)游戲服務(wù)端的入門圖書,內(nèi)容涵蓋Skynet引擎、C++底層開發(fā)、服務(wù)端架構(gòu)設(shè)計(jì)等多個(gè)方面,全面展現(xiàn)網(wǎng)絡(luò)游戲核心技術(shù)。
部分“學(xué)以致用”揭示了Skynet引擎的使用方法及注意事項(xiàng),以《球球大作戰(zhàn)》的案例貫穿這部分內(nèi)容,全面又詳盡地剖析服務(wù)端結(jié)構(gòu)設(shè)計(jì)、通信協(xié)議格式、數(shù)據(jù)表結(jié)構(gòu)設(shè)計(jì)、斷線重連方案等眾多核心技術(shù)。第二部分“入木三分”揭示了在多核時(shí)代采用現(xiàn)代C++編寫多線程TCP網(wǎng)絡(luò)服務(wù)器的高效做法,以C++重寫Skynet的案例貫穿這部分內(nèi)容,使用大量圖表,生動(dòng)翔實(shí)地描述Linux環(huán)境下的編程技術(shù)。第三部分“各個(gè)擊破”列舉了同步算法、熱更新、防外掛等實(shí)際工程難題,并對其逐一擊破,非常具有實(shí)用價(jià)值。
盡管本書以Skynet為例,但目的是探求服務(wù)端開發(fā)的一般性方法,因此它同樣適用于使用C++自研引擎的項(xiàng)目組,甚至是選用Erlang、Golang、Java等語言的開發(fā)者。本書既可以作為大學(xué)計(jì)算機(jī)相關(guān)專業(yè)的指導(dǎo)教程,也可以作為游戲公司的培訓(xùn)材料,亦是獨(dú)立游戲開發(fā)者的參考指南。
為什么寫這本書
進(jìn)入手游時(shí)代,服務(wù)端技術(shù)也在向前演進(jìn),F(xiàn)代游戲服務(wù)端既要承載數(shù)以萬計(jì)的在線玩家,又要適應(yīng)快速變化的市場需求,因此,如何設(shè)計(jì)合適的架構(gòu)就成了重中之重。服務(wù)端技術(shù)并不簡單,作為服務(wù)端新人,全面掌握服務(wù)端技術(shù)可能需要數(shù)年時(shí)間;作為游戲公司,培養(yǎng)員工的成本也不低。
新人或許有這樣的經(jīng)歷,在請教資深技術(shù)人應(yīng)該看什么資料學(xué)習(xí)C++服務(wù)端知識時(shí),可能得到的答案是先把《TCP/IP詳解》《UNIX環(huán)境高級編程》《數(shù)據(jù)庫系統(tǒng)》這些大部頭啃一遍,或者是把Redis、Skynet的源碼過一遍,再看點(diǎn)Linux源碼就都會(huì)了。雖說啃大部頭、看源碼是服務(wù)端從業(yè)者的必經(jīng)之路,但人的時(shí)間是有限的,因此,在入門階段,在有限的時(shí)間里學(xué)到實(shí)用的知識很關(guān)鍵。
找到契合實(shí)際項(xiàng)目開發(fā)需要的學(xué)習(xí)資料并不容易。市面上的服務(wù)端資料,有些著重講網(wǎng)絡(luò)編程、多線程處理等操作系統(tǒng)知識,這些知識雖然很重要,但不太適合“快速入門并馬上有產(chǎn)出”的開發(fā)節(jié)奏;有些又太過簡單淺顯,不能適應(yīng)商業(yè)游戲的品質(zhì)要求。游戲服務(wù)端的知識體系既包含系統(tǒng)底層知識,也包含具體游戲業(yè)務(wù)的設(shè)計(jì),內(nèi)容很多,學(xué)習(xí)不易。
基于以上所述,我決定將自己多年的開發(fā)經(jīng)驗(yàn)全盤托出,編寫一本既實(shí)用又深入淺出的游戲服務(wù)端教程,為未來游戲行業(yè)的繁榮發(fā)展添磚加瓦。
服務(wù)端成長路線
游戲公司培養(yǎng)新人,強(qiáng)調(diào)“邊學(xué)邊用”“有產(chǎn)出再深入”的技術(shù)成長路線,一般是讓新人從開發(fā)簡單的業(yè)務(wù)功能開始,再逐步深入底層,后獨(dú)當(dāng)一面。
年:能做好功能
這個(gè)階段要求能按時(shí)、按質(zhì)、按量做好業(yè)務(wù)功能。剛進(jìn)游戲公司參與項(xiàng)目開發(fā),你需要從較簡單的活動(dòng)功能寫起,逐漸過渡到能編寫較為復(fù)雜的跨服功能和戰(zhàn)斗功能等。
第二年:能用好框架
公司開啟一個(gè)新項(xiàng)目,一般不會(huì)從零做起,而是會(huì)拿一套已有代碼參考,根據(jù)需求做修改。這個(gè)階段就要求你能夠分析別人為什么要這樣設(shè)計(jì),并能修改底層功能,改善性能問題。
第三年:能重建系統(tǒng)
當(dāng)舊框架已經(jīng)落后于時(shí)代,或者歷史遺留問題太多,又或者想開展新業(yè)務(wù)、開發(fā)不同類型的游戲時(shí),你就要從零開始設(shè)計(jì)了。這個(gè)階段要求你有重新搭建整套服務(wù)端系統(tǒng)的能力。
本書的內(nèi)容選擇和章節(jié)設(shè)計(jì),正是基于這樣的成長路線規(guī)劃的。先用現(xiàn)成的Skynet引擎把游戲做出來,再逐步深入,重構(gòu)整套系統(tǒng)。經(jīng)過這幾個(gè)階段的打磨,相信不久的將來,你就能夠獨(dú)當(dāng)一面。
讀者對象
這里根據(jù)用戶需求劃分出一些可能使用本書的用戶。
職場新人:本書很適合剛?cè)胄械姆⻊?wù)端工程師,書中所介紹的知識和問題,是每個(gè)游戲從業(yè)人員都會(huì)遇到或必須解決的。本書可作為提升技術(shù)水平的學(xué)習(xí)資料,也適合用作游戲公司服務(wù)端新人的培訓(xùn)材料,書中既涵蓋了該崗位的知識,也包含了《球球大作戰(zhàn)》、Sunnet(C++仿寫Skynet底層)等實(shí)踐項(xiàng)目。我們希望職場新人讀完本書之后,不僅能夠更快更好地完成手頭工作,還能夠?yàn)橄乱浑A段的職業(yè)發(fā)展做好積累。
開發(fā)類崗位的求職者:本書也適合游戲公司開發(fā)崗位的求職者。書中對服務(wù)端崗位所需知識、商業(yè)游戲常遇到的問題等進(jìn)行了講解,覆蓋了常見的面試內(nèi)容。我們希望本書能夠幫助讀者獲得C++服務(wù)端開發(fā)工程師的崗位。
高校學(xué)生:本書可作為高校教科書。書中內(nèi)容是按照游戲公司的需求設(shè)計(jì)的,內(nèi)容循序漸進(jìn),且包含諸多示例。我們希望本書可以幫助學(xué)生掌握實(shí)用的知識,幫助他們構(gòu)建完整的知識體系,也為未來的進(jìn)一步進(jìn)修或職業(yè)發(fā)展提供助力。
游戲開發(fā)愛好者:在本書中,“學(xué)以致用”的理念貫穿全書,對于想要自己制作一款網(wǎng)絡(luò)游戲的業(yè)余開發(fā)者來說,本書很適合作為自學(xué)的參考書。我們希望本書可以幫助讀者“先把游戲做出來”,讓讀者能夠先快速使用現(xiàn)成的Skynet框架,再逐步深入底層,為夢想助力。
如何閱讀本書
如果你是一位服務(wù)端新人,強(qiáng)烈建議你按順序閱讀本書,并復(fù)現(xiàn)一遍書中的示例。在本書的選材和結(jié)構(gòu)編排上,我花了兩年時(shí)間思考,也做過很多調(diào)研工作,相信它是相對合理的。圖1展
前 言
部分 學(xué)以致用
第1章 從角色走路說起 2
1.1 每走一步都有事情發(fā)生 2
1.1.1 走路的五個(gè)步驟 3
1.1.2 服務(wù)端視角的游戲流程 3
1.2 從網(wǎng)絡(luò)編程著手 4
1.2.1 用打電話做比喻 4
1.2.2 少要掌握的三個(gè)概念 5
1.2.3 搭一個(gè)簡單的服務(wù)器 6
1.2.4 讓角色走起來 8
1.3 能夠承載多少玩家 9
1.3.1 單線事件模型 9
1.3.2 承載量估算 9
1.4 用分布式擴(kuò)能 10
1.4.1 多個(gè)程序協(xié)同工作 11
1.4.2 三個(gè)層次的交互 11
1.4.3 搭個(gè)簡單的分布式服務(wù)端 12
1.4.4 一致性問題 14
1.5 回頭看操作系統(tǒng) 15
1.5.1 多進(jìn)程為什么能提升性能 15
1.5.2 阻塞為什么不占CPU 16
1.5.3 線程會(huì)占用多少資源 17
1.6 一張地圖的極限 18
1.6.1 難以分割的業(yè)務(wù) 19
1.6.2 在延遲和容量間權(quán)衡 19
1.7 萬物皆Actor 19
1.7.1 靈感來自Erlang 20
1.7.2 對世界的抽象 20
1.7.3 為何適用 22
第2章 Skynet入門精要 25
2.1 下載、編譯、運(yùn)行 26
2.1.1 下載和編譯 26
2.1.2 運(yùn)行范例 27
2.2 理解Skynet 28
2.2.1 節(jié)點(diǎn)和服務(wù) 28
2.2.2 配置文件 29
2.2.3 目錄結(jié)構(gòu) 30
2.2.4 啟動(dòng)流程 31
2.3 個(gè)程序PingPong 32
2.3.1 功能需求 32
2.3.2 學(xué)習(xí)服務(wù)模塊 32
2.3.3 代碼實(shí)現(xiàn) 33
2.3.4 運(yùn)行結(jié)果 35
2.4 寫Echo,練習(xí)網(wǎng)絡(luò)編程 35
2.4.1 功能需求 36
2.4.2 學(xué)習(xí)網(wǎng)絡(luò)模塊 36
2.4.3 代碼實(shí)現(xiàn) 37
2.4.4 運(yùn)行結(jié)果 37
2.5 做聊天室,學(xué)習(xí)多人交互 38
2.5.1 功能需求 38
2.5.2 代碼實(shí)現(xiàn) 38
2.6 做留言板,使用數(shù)據(jù)庫 39
2.6.1 功能需求 39
2.6.2 學(xué)習(xí)數(shù)據(jù)庫模塊 40
2.6.3 準(zhǔn)備數(shù)據(jù)庫 40
2.6.4 代碼實(shí)現(xiàn) 43
2.6.5 運(yùn)行結(jié)果 45
2.7 監(jiān)控服務(wù)狀態(tài) 45
2.7.1 啟用調(diào)試控制臺 45
2.7.2 監(jiān)控指令 46
2.8 使用節(jié)點(diǎn)集群建立分布式系統(tǒng) 48
2.8.1 功能需求 48
2.8.2 學(xué)習(xí)集群模塊 48
2.8.3 節(jié)點(diǎn)配置 49
2.8.4 代碼實(shí)現(xiàn) 49
2.8.5 運(yùn)行結(jié)果 51
2.8.6 使用代理 52
2.9 使用Skynet的注意事項(xiàng) 52
2.9.1 協(xié)程的作用 52
2.9.2 扣除金幣的Bug 52
第3章 案例:《球球大作戰(zhàn)》 54
3.1 功能需求 54
3.2 方案設(shè)計(jì) 55
3.2.1 拓?fù)浣Y(jié)構(gòu) 55
3.2.2 各服務(wù)功能 56
3.2.3 消息流程 57
3.2.4 設(shè)計(jì)要點(diǎn) 57
3.3 搭架子:目錄結(jié)構(gòu)和配置 58
3.3.1 目錄結(jié)構(gòu) 58
3.3.2 配置文件 58
3.3.3 第1版主服務(wù) 59
3.3.4 啟動(dòng)腳本 60
3.3.5 服務(wù)配置 60
3.4 磨刀工:封裝易用的API 62
3.4.1 定義屬性 63
3.4.2 啟動(dòng)邏輯 63
3.4.3 消息分發(fā) 64
3.4.4 輔助方法 65
3.4.5 編寫空服務(wù) 66
3.5 分布式登錄流程 67
3.5.1 完整的登錄流程 67
3.5.2 掉線登出流程 69
3.5.3 協(xié)議格式 69
3.6 代碼實(shí)現(xiàn):gateway 70
3.6.1 連接類和玩家類 70
3.6.2 接收客戶端連接 71
3.6.3 處理客戶端協(xié)議 74
3.6.4 編碼和解碼 75
3.6.5 消息分發(fā) 76
3.6.6 發(fā)送消息接口 78
3.6.7 確認(rèn)登錄接口 79
3.6.8 登出流程 80
3.7 代碼實(shí)現(xiàn):login 81
3.7.1 登錄協(xié)議 81
3.7.2 客戶端消息分發(fā) 81
3.7.3 登錄流程處理 82
3.8 代碼實(shí)現(xiàn):agentmgr 83
3.8.1 玩家類 83
3.8.2 請求登錄接口 84
3.8.3 請求登出接口 86
3.9 代碼實(shí)現(xiàn):nodemgr 86
3.10 代碼實(shí)現(xiàn):agent(單機(jī)版) 87
3.10.1 消息分發(fā) 87
3.10.2 數(shù)據(jù)加載 87
3.10.3 保存和退出 88
3.10.4 單機(jī)測試 88
3.11 測試登錄流程 89
3.11.1 第2版主服務(wù) 89
3.11.2 單節(jié)點(diǎn)測試 90
3.11.3 跨節(jié)點(diǎn)測試 90
3.12 戰(zhàn)斗流程梳理 91
3.12.1 戰(zhàn)斗流程 91
3.12.2 協(xié)議 91
3.13 代碼實(shí)現(xiàn):場景服務(wù) 93
3.13.1 Ball類 93
3.13.2 Food類 94
3.13.3 進(jìn)入戰(zhàn)斗 95
3.13.4 退出戰(zhàn)斗 97
3.13.5 操作移動(dòng) 97
3.13.6 主循環(huán) 97
3.13.7 移動(dòng)邏輯 99
3.13.8 生成食物 99
3.13.9 吞下食物 100
3.13.10 第3版主服務(wù) 101
3.14 代碼實(shí)現(xiàn):agent(跨服務(wù)器版) 101
3.14.1 多個(gè)模塊 101
3.14.2 進(jìn)入戰(zhàn)斗 101
3.14.3 退出戰(zhàn)斗 103
3.14.4 后的輔助方法 103
3.14.5 運(yùn)行結(jié)果 104
3.15 改進(jìn) 104
第4章 Skynet進(jìn)階技法 106
4.1 用“長度信息”解TCP包 107
4.1.1 長度信息法 107
4.1.2 使用netpack模塊解析網(wǎng)絡(luò)包 107
4.1.3 測試小案例 110
4.1.4 阻塞方法的時(shí)序 113
4.2 用J