定 價:99 元
叢書名:游戲開發(fā)與設(shè)計技術(shù)叢書
- 作者:羅培羽
- 出版時間:2021/8/1
- ISBN:9787111687559
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP317.6
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
第 一部分“學(xué)以致用”揭示了 Skynet 引擎的使用方法及注意事項,以“球球大作戰(zhàn)”的案例貫穿本篇內(nèi)容,全面又詳盡地剖析服務(wù)端結(jié)構(gòu)設(shè)計、通信協(xié)議格式、數(shù)據(jù)表結(jié)構(gòu)設(shè)計、斷線重連方案等眾多核心技術(shù)。第二部分“入木三分”揭示了在多核時代采用現(xiàn)代 C++ 編寫多線程 TCP 網(wǎng)絡(luò)服務(wù)器的高效做法,以 C++ 重寫 Skynet 的案例貫穿本篇內(nèi)容,使用大量圖表,生動翔實地描述 Linux 環(huán)境下的編程技術(shù)。第三部分“各個擊破”列舉了同步算法、熱更新、防外掛等實際工程難題,并對其逐一擊破,非常具有實用價值。
這本書講什么
本書是基于C++與Lua語言開發(fā)游戲服務(wù)端的入門圖書,內(nèi)容涵蓋Skynet引擎、C++底層開發(fā)、服務(wù)端架構(gòu)設(shè)計等多個方面,全面展現(xiàn)網(wǎng)絡(luò)游戲核心技術(shù)。
部分“學(xué)以致用”揭示了Skynet引擎的使用方法及注意事項,以《球球大作戰(zhàn)》的案例貫穿這部分內(nèi)容,全面又詳盡地剖析服務(wù)端結(jié)構(gòu)設(shè)計、通信協(xié)議格式、數(shù)據(jù)表結(jié)構(gòu)設(shè)計、斷線重連方案等眾多核心技術(shù)。第二部分“入木三分”揭示了在多核時代采用現(xiàn)代C++編寫多線程TCP網(wǎng)絡(luò)服務(wù)器的高效做法,以C++重寫Skynet的案例貫穿這部分內(nèi)容,使用大量圖表,生動翔實地描述Linux環(huán)境下的編程技術(shù)。第三部分“各個擊破”列舉了同步算法、熱更新、防外掛等實際工程難題,并對其逐一擊破,非常具有實用價值。
盡管本書以Skynet為例,但目的是探求服務(wù)端開發(fā)的一般性方法,因此它同樣適用于使用C++自研引擎的項目組,甚至是選用Erlang、Golang、Java等語言的開發(fā)者。本書既可以作為大學(xué)計算機(jī)相關(guān)專業(yè)的指導(dǎo)教程,也可以作為游戲公司的培訓(xùn)材料,亦是獨立游戲開發(fā)者的參考指南。
為什么寫這本書
進(jìn)入手游時代,服務(wù)端技術(shù)也在向前演進(jìn),F(xiàn)代游戲服務(wù)端既要承載數(shù)以萬計的在線玩家,又要適應(yīng)快速變化的市場需求,因此,如何設(shè)計合適的架構(gòu)就成了重中之重。服務(wù)端技術(shù)并不簡單,作為服務(wù)端新人,全面掌握服務(wù)端技術(shù)可能需要數(shù)年時間;作為游戲公司,培養(yǎng)員工的成本也不低。
新人或許有這樣的經(jīng)歷,在請教資深技術(shù)人應(yīng)該看什么資料學(xué)習(xí)C++服務(wù)端知識時,可能得到的答案是先把《TCP/IP詳解》《UNIX環(huán)境高級編程》《數(shù)據(jù)庫系統(tǒng)》這些大部頭啃一遍,或者是把Redis、Skynet的源碼過一遍,再看點Linux源碼就都會了。雖說啃大部頭、看源碼是服務(wù)端從業(yè)者的必經(jīng)之路,但人的時間是有限的,因此,在入門階段,在有限的時間里學(xué)到實用的知識很關(guān)鍵。
找到契合實際項目開發(fā)需要的學(xué)習(xí)資料并不容易。市面上的服務(wù)端資料,有些著重講網(wǎng)絡(luò)編程、多線程處理等操作系統(tǒng)知識,這些知識雖然很重要,但不太適合“快速入門并馬上有產(chǎn)出”的開發(fā)節(jié)奏;有些又太過簡單淺顯,不能適應(yīng)商業(yè)游戲的品質(zhì)要求。游戲服務(wù)端的知識體系既包含系統(tǒng)底層知識,也包含具體游戲業(yè)務(wù)的設(shè)計,內(nèi)容很多,學(xué)習(xí)不易。
基于以上所述,我決定將自己多年的開發(fā)經(jīng)驗全盤托出,編寫一本既實用又深入淺出的游戲服務(wù)端教程,為未來游戲行業(yè)的繁榮發(fā)展添磚加瓦。
服務(wù)端成長路線
游戲公司培養(yǎng)新人,強(qiáng)調(diào)“邊學(xué)邊用”“有產(chǎn)出再深入”的技術(shù)成長路線,一般是讓新人從開發(fā)簡單的業(yè)務(wù)功能開始,再逐步深入底層,后獨當(dāng)一面。
年:能做好功能
這個階段要求能按時、按質(zhì)、按量做好業(yè)務(wù)功能。剛進(jìn)游戲公司參與項目開發(fā),你需要從較簡單的活動功能寫起,逐漸過渡到能編寫較為復(fù)雜的跨服功能和戰(zhàn)斗功能等。
第二年:能用好框架
公司開啟一個新項目,一般不會從零做起,而是會拿一套已有代碼參考,根據(jù)需求做修改。這個階段就要求你能夠分析別人為什么要這樣設(shè)計,并能修改底層功能,改善性能問題。
第三年:能重建系統(tǒng)
當(dāng)舊框架已經(jīng)落后于時代,或者歷史遺留問題太多,又或者想開展新業(yè)務(wù)、開發(fā)不同類型的游戲時,你就要從零開始設(shè)計了。這個階段要求你有重新搭建整套服務(wù)端系統(tǒng)的能力。
本書的內(nèi)容選擇和章節(jié)設(shè)計,正是基于這樣的成長路線規(guī)劃的。先用現(xiàn)成的Skynet引擎把游戲做出來,再逐步深入,重構(gòu)整套系統(tǒng)。經(jīng)過這幾個階段的打磨,相信不久的將來,你就能夠獨當(dāng)一面。
讀者對象
這里根據(jù)用戶需求劃分出一些可能使用本書的用戶。
職場新人:本書很適合剛?cè)胄械姆⻊?wù)端工程師,書中所介紹的知識和問題,是每個游戲從業(yè)人員都會遇到或必須解決的。本書可作為提升技術(shù)水平的學(xué)習(xí)資料,也適合用作游戲公司服務(wù)端新人的培訓(xùn)材料,書中既涵蓋了該崗位的知識,也包含了《球球大作戰(zhàn)》、Sunnet(C++仿寫Skynet底層)等實踐項目。我們希望職場新人讀完本書之后,不僅能夠更快更好地完成手頭工作,還能夠為下一階段的職業(yè)發(fā)展做好積累。
開發(fā)類崗位的求職者:本書也適合游戲公司開發(fā)崗位的求職者。書中對服務(wù)端崗位所需知識、商業(yè)游戲常遇到的問題等進(jìn)行了講解,覆蓋了常見的面試內(nèi)容。我們希望本書能夠幫助讀者獲得C++服務(wù)端開發(fā)工程師的崗位。
高校學(xué)生:本書可作為高校教科書。書中內(nèi)容是按照游戲公司的需求設(shè)計的,內(nèi)容循序漸進(jìn),且包含諸多示例。我們希望本書可以幫助學(xué)生掌握實用的知識,幫助他們構(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)編排上,我花了兩年時間思考,也做過很多調(diào)研工作,相信它是相對合理的。圖1展
前 言
部分 學(xué)以致用
第1章 從角色走路說起 2
1.1 每走一步都有事情發(fā)生 2
1.1.1 走路的五個步驟 3
1.1.2 服務(wù)端視角的游戲流程 3
1.2 從網(wǎng)絡(luò)編程著手 4
1.2.1 用打電話做比喻 4
1.2.2 少要掌握的三個概念 5
1.2.3 搭一個簡單的服務(wù)器 6
1.2.4 讓角色走起來 8
1.3 能夠承載多少玩家 9
1.3.1 單線事件模型 9
1.3.2 承載量估算 9
1.4 用分布式擴(kuò)能 10
1.4.1 多個程序協(xié)同工作 11
1.4.2 三個層次的交互 11
1.4.3 搭個簡單的分布式服務(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 線程會占用多少資源 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é)點和服務(wù) 28
2.2.2 配置文件 29
2.2.3 目錄結(jié)構(gòu) 30
2.2.4 啟動流程 31
2.3 個程序PingPong 32
2.3.1 功能需求 32
2.3.2 學(xué)習(xí)服務(wù)模塊 32
2.3.3 代碼實現(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 代碼實現(xiàn) 37
2.4.4 運(yùn)行結(jié)果 37
2.5 做聊天室,學(xué)習(xí)多人交互 38
2.5.1 功能需求 38
2.5.2 代碼實現(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 代碼實現(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é)點集群建立分布式系統(tǒng) 48
2.8.1 功能需求 48
2.8.2 學(xué)習(xí)集群模塊 48
2.8.3 節(jié)點配置 49
2.8.4 代碼實現(xiàn) 49
2.8.5 運(yùn)行結(jié)果 51
2.8.6 使用代理 52
2.9 使用Skynet的注意事項 52
2.9.1 協(xié)程的作用 52
2.9.2 扣除金幣的Bug 52
第3章 案例:《球球大作戰(zhàn)》 54
3.1 功能需求 54
3.2 方案設(shè)計 55
3.2.1 拓?fù)浣Y(jié)構(gòu) 55
3.2.2 各服務(wù)功能 56
3.2.3 消息流程 57
3.2.4 設(shè)計要點 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 啟動腳本 60
3.3.5 服務(wù)配置 60
3.4 磨刀工:封裝易用的API 62
3.4.1 定義屬性 63
3.4.2 啟動邏輯 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 代碼實現(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 代碼實現(xiàn):login 81
3.7.1 登錄協(xié)議 81
3.7.2 客戶端消息分發(fā) 81
3.7.3 登錄流程處理 82
3.8 代碼實現(xiàn):agentmgr 83
3.8.1 玩家類 83
3.8.2 請求登錄接口 84
3.8.3 請求登出接口 86
3.9 代碼實現(xiàn):nodemgr 86
3.10 代碼實現(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é)點測試 90
3.11.3 跨節(jié)點測試 90
3.12 戰(zhàn)斗流程梳理 91
3.12.1 戰(zhàn)斗流程 91
3.12.2 協(xié)議 91
3.13 代碼實現(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 操作移動 97
3.13.6 主循環(huán) 97
3.13.7 移動邏輯 99
3.13.8 生成食物 99
3.13.9 吞下食物 100
3.13.10 第3版主服務(wù) 101
3.14 代碼實現(xiàn):agent(跨服務(wù)器版) 101
3.14.1 多個模塊 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 阻塞方法的時序 113
4.2 用J