商品簡介
第 一部分“學以致用”揭示了 Skynet 引擎的使用方法及注意事項,以“球球大作戰”的案例貫穿本篇內容,全面又詳盡地剖析服務端結構設計、通信協議格式、數據表結構設計、斷線重連方案等眾多核心技術。第二部分“入木三分”揭示了在多核時代採用現代 C++ 編寫多線程 TCP 網絡服務器的高效做法,以 C++ 重寫 Skynet 的案例貫穿本篇內容,使用大量圖表,生動翔實地描述 Linux 環境下的編程技術。第三部分“各個擊破”列舉了同步算法、熱更新、防外掛等實際工程難題,並對其逐一擊破,非常具有實用價值。
名人推薦
使用Skynet引擎,編寫對戰遊戲,直面工程難題
目次
前 言
第一部分 學以致用
第1章 從角色走路說起 2
1.1 每走一步都有事情發生 2
1.1.1 走路的五個步驟 3
1.1.2 服務端視角的遊戲流程 3
1.2 從網絡編程著手 4
1.2.1 用打電話做比喻 4
1.2.2 最少要掌握的三個概念 5
1.2.3 搭一個簡單的服務器 6
1.2.4 讓角色走起來 8
1.3 能夠承載多少玩家 9
1.3.1 單線事件模型 9
1.3.2 承載量估算 9
1.4 用分布式擴能 10
1.4.1 多個程序協同工作 11
1.4.2 三個層次的交互 11
1.4.3 搭個簡單的分布式服務端 12
1.4.4 一致性問題 14
1.5 回頭看操作系統 15
1.5.1 多進程為什麼能提升性能 15
1.5.2 阻塞為什麼不占CPU 16
1.5.3 線程會佔用多少資源 17
1.6 一張地圖的極限 18
1.6.1 難以分割的業務 19
1.6.2 在延遲和容量間權衡 19
1.7 萬物皆Actor 19
1.7.1 靈感來自Erlang 20
1.7.2 對世界的抽象 20
1.7.3 為何適用 22
第2章 Skynet入門精要 25
2.1 下載、編譯、運行 26
2.1.1 下載和編譯 26
2.1.2 運行範例 27
2.2 理解Skynet 28
2.2.1 節點和服務 28
2.2.2 配置文件 29
2.2.3 目錄結構 30
2.2.4 啟動流程 31
2.3 第一個程序PingPong 32
2.3.1 功能需求 32
2.3.2 學習服務模塊 32
2.3.3 代碼實現 33
2.3.4 運行結果 35
2.4 寫Echo,練習網絡編程 35
2.4.1 功能需求 36
2.4.2 學習網絡模塊 36
2.4.3 代碼實現 37
2.4.4 運行結果 37
2.5 做聊天室,學習多人交互 38
2.5.1 功能需求 38
2.5.2 代碼實現 38
2.6 做留言板,使用數據庫 39
2.6.1 功能需求 39
2.6.2 學習數據庫模塊 40
2.6.3 準備數據庫 40
2.6.4 代碼實現 43
2.6.5 運行結果 45
2.7 監控服務狀態 45
2.7.1 啟用調試控制台 45
2.7.2 監控指令 46
2.8 使用節點集群建立分布式系統 48
2.8.1 功能需求 48
2.8.2 學習集群模塊 48
2.8.3 節點配置 49
2.8.4 代碼實現 49
2.8.5 運行結果 51
2.8.6 使用代理 52
2.9 使用Skynet的注意事項 52
2.9.1 協程的作用 52
2.9.2 扣除金幣的Bug 52
第3章 案例:《球球大作戰》 54
3.1 功能需求 54
3.2 方案設計 55
3.2.1 拓撲結構 55
3.2.2 各服務功能 56
3.2.3 消息流程 57
3.2.4 設計要點 57
3.3 搭架子:目錄結構和配置 58
3.3.1 目錄結構 58
3.3.2 配置文件 58
3.3.3 第1版主服務 59
3.3.4 啟動腳本 60
3.3.5 服務配置 60
3.4 磨刀工:封裝易用的API 62
3.4.1 定義屬性 63
3.4.2 啟動邏輯 63
3.4.3 消息分發 64
3.4.4 輔助方法 65
3.4.5 編寫空服務 66
3.5 分布式登錄流程 67
3.5.1 完整的登錄流程 67
3.5.2 掉線登出流程 69
3.5.3 協議格式 69
3.6 代碼實現:gateway 70
3.6.1 連接類和玩家類 70
3.6.2 接收客戶端連接 71
3.6.3 處理客戶端協議 74
3.6.4 編碼和解碼 75
3.6.5 消息分發 76
3.6.6 發送消息接口 78
3.6.7 確認登錄接口 79
3.6.8 登出流程 80
3.7 代碼實現:login 81
3.7.1 登錄協議 81
3.7.2 客戶端消息分發 81
3.7.3 登錄流程處理 82
3.8 代碼實現:agentmgr 83
3.8.1 玩家類 83
3.8.2 請求登錄接口 84
3.8.3 請求登出接口 86
3.9 代碼實現:nodemgr 86
3.10 代碼實現:agent(單機版) 87
3.10.1 消息分發 87
3.10.2 數據加載 87
3.10.3 保存和退出 88
3.10.4 單機測試 88
3.11 測試登錄流程 89
3.11.1 第2版主服務 89
3.11.2 單節點測試 90
3.11.3 跨節點測試 90
3.12 戰鬥流程梳理 91
3.12.1 戰鬥流程 91
3.12.2 協議 91
3.13 代碼實現:場景服務 93
3.13.1 Ball類 93
3.13.2 Food類 94
3.13.3 進入戰鬥 95
3.13.4 退出戰鬥 97
3.13.5 操作移動 97
3.13.6 主循環 97
3.13.7 移動邏輯 99
3.13.8 生成食物 99
3.13.9 吞下食物 100
3.13.10 第3版主服務 101
3.14 代碼實現:agent(跨服務器版) 101
3.14.1 多個模塊 101
3.14.2 進入戰鬥 101
3.14.3 退出戰鬥 103
3.14.4 最後的輔助方法 103
3.14.5 運行結果 104
3.15 改進 104
第4章 Skynet進階技法 106
4.1 用“長度信息”解TCP包 107
4.1.1 長度信息法 107
4.1.2 使用netpack模塊解析網絡包 107
4.1.3 測試小案例 110
4.1.4 阻塞方法的時序 113
4.2 用J