描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111687559丛书名: 游戏开发与设计技术丛书
内容简介
第 一部分“学以致用”揭示了 Skynet 引擎的使用方法及注意事项,以“球球大作战”的案例贯穿本篇内容,全面又详尽地剖析服务端结构设计、通信协议格式、数据表结构设计、断线重连方案等众多核心技术。第二部分“入木三分”揭示了在多核时代采用现代 C++ 编写多线程 TCP 网络服务器的高效做法,以 C++ 重写 Skynet 的案例贯穿本篇内容,使用大量图表,生动翔实地描述 Linux 环境下的编程技术。第三部分“各个击破”列举了同步算法、热更新、防外挂等实际工程难题,并对其逐一击破,非常具有实用价值。
目 录
前 言
部分 学以致用
第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
部分 学以致用
第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
前 言
这本书讲什么
本书是基于C++与Lua语言开发游戏服务端的入门图书,内容涵盖Skynet引擎、C++底层开发、服务端架构设计等多个方面,全面展现网络游戏核心技术。
部分“学以致用”揭示了Skynet引擎的使用方法及注意事项,以《球球大作战》的案例贯穿这部分内容,全面又详尽地剖析服务端结构设计、通信协议格式、数据表结构设计、断线重连方案等众多核心技术。第二部分“入木三分”揭示了在多核时代采用现代C++编写多线程TCP网络服务器的高效做法,以C++重写Skynet的案例贯穿这部分内容,使用大量图表,生动翔实地描述Linux环境下的编程技术。第三部分“各个击破”列举了同步算法、热更新、防外挂等实际工程难题,并对其逐一击破,非常具有实用价值。
尽管本书以Skynet为例,但目的是探求服务端开发的一般性方法,因此它同样适用于使用C++自研引擎的项目组,甚至是选用Erlang、Golang、Java等语言的开发者。本书既可以作为大学计算机相关专业的指导教程,也可以作为游戏公司的培训材料,亦是独立游戏开发者的参考指南。
为什么写这本书
进入手游时代,服务端技术也在向前演进。现代游戏服务端既要承载数以万计的在线玩家,又要适应快速变化的市场需求,因此,如何设计合适的架构就成了重中之重。服务端技术并不简单,作为服务端新人,全面掌握服务端技术可能需要数年时间;作为游戏公司,培养员工的成本也不低。
新人或许有这样的经历,在请教资深技术人应该看什么资料学习C++服务端知识时,可能得到的答案是先把《TCP/IP详解》《UNIX环境高级编程》《数据库系统》这些大部头啃一遍,或者是把Redis、Skynet的源码过一遍,再看点Linux源码就都会了。虽说啃大部头、看源码是服务端从业者的必经之路,但人的时间是有限的,因此,在入门阶段,在有限的时间里学到实用的知识很关键。
找到契合实际项目开发需要的学习资料并不容易。市面上的服务端资料,有些着重讲网络编程、多线程处理等操作系统知识,这些知识虽然很重要,但不太适合“快速入门并马上有产出”的开发节奏;有些又太过简单浅显,不能适应商业游戏的品质要求。游戏服务端的知识体系既包含系统底层知识,也包含具体游戏业务的设计,内容很多,学习不易。
基于以上所述,我决定将自己多年的开发经验全盘托出,编写一本既实用又深入浅出的游戏服务端教程,为未来游戏行业的繁荣发展添砖加瓦。
服务端成长路线
游戏公司培养新人,强调“边学边用”“有产出再深入”的技术成长路线,一般是让新人从开发简单的业务功能开始,再逐步深入底层,后独当一面。
年:能做好功能
这个阶段要求能按时、按质、按量做好业务功能。刚进游戏公司参与项目开发,你需要从较简单的活动功能写起,逐渐过渡到能编写较为复杂的跨服功能和战斗功能等。
第二年:能用好框架
公司开启一个新项目,一般不会从零做起,而是会拿一套已有代码参考,根据需求做修改。这个阶段就要求你能够分析别人为什么要这样设计,并能修改底层功能,改善性能问题。
第三年:能重建系统
当旧框架已经落后于时代,或者历史遗留问题太多,又或者想开展新业务、开发不同类型的游戏时,你就要从零开始设计了。这个阶段要求你有重新搭建整套服务端系统的能力。
本书的内容选择和章节设计,正是基于这样的成长路线规划的。先用现成的Skynet引擎把游戏做出来,再逐步深入,重构整套系统。经过这几个阶段的打磨,相信不久的将来,你就能够独当一面。
读者对象
这里根据用户需求划分出一些可能使用本书的用户。
职场新人:本书很适合刚入行的服务端工程师,书中所介绍的知识和问题,是每个游戏从业人员都会遇到或必须解决的。本书可作为提升技术水平的学习资料,也适合用作游戏公司服务端新人的培训材料,书中既涵盖了该岗位的知识,也包含了《球球大作战》、Sunnet(C++仿写Skynet底层)等实践项目。我们希望职场新人读完本书之后,不仅能够更快更好地完成手头工作,还能够为下一阶段的职业发展做好积累。
开发类岗位的求职者:本书也适合游戏公司开发岗位的求职者。书中对服务端岗位所需知识、商业游戏常遇到的问题等进行了讲解,覆盖了常见的面试内容。我们希望本书能够帮助读者获得C++服务端开发工程师的岗位。
高校学生:本书可作为高校教科书。书中内容是按照游戏公司的需求设计的,内容循序渐进,且包含诸多示例。我们希望本书可以帮助学生掌握实用的知识,帮助他们构建完整的知识体系,也为未来的进一步进修或职业发展提供助力。
游戏开发爱好者:在本书中,“学以致用”的理念贯穿全书,对于想要自己制作一款网络游戏的业余开发者来说,本书很适合作为自学的参考书。我们希望本书可以帮助读者“先把游戏做出来”,让读者能够先快速使用现成的Skynet框架,再逐步深入底层,为梦想助力。
如何阅读本书
如果你是一位服务端新人,强烈建议你按顺序阅读本书,并复现一遍书中的示例。在本书的选材和结构编排上,我花了两年时间思考,也做过很多调研工作,相信它是相对合理的。图1展
本书是基于C++与Lua语言开发游戏服务端的入门图书,内容涵盖Skynet引擎、C++底层开发、服务端架构设计等多个方面,全面展现网络游戏核心技术。
部分“学以致用”揭示了Skynet引擎的使用方法及注意事项,以《球球大作战》的案例贯穿这部分内容,全面又详尽地剖析服务端结构设计、通信协议格式、数据表结构设计、断线重连方案等众多核心技术。第二部分“入木三分”揭示了在多核时代采用现代C++编写多线程TCP网络服务器的高效做法,以C++重写Skynet的案例贯穿这部分内容,使用大量图表,生动翔实地描述Linux环境下的编程技术。第三部分“各个击破”列举了同步算法、热更新、防外挂等实际工程难题,并对其逐一击破,非常具有实用价值。
尽管本书以Skynet为例,但目的是探求服务端开发的一般性方法,因此它同样适用于使用C++自研引擎的项目组,甚至是选用Erlang、Golang、Java等语言的开发者。本书既可以作为大学计算机相关专业的指导教程,也可以作为游戏公司的培训材料,亦是独立游戏开发者的参考指南。
为什么写这本书
进入手游时代,服务端技术也在向前演进。现代游戏服务端既要承载数以万计的在线玩家,又要适应快速变化的市场需求,因此,如何设计合适的架构就成了重中之重。服务端技术并不简单,作为服务端新人,全面掌握服务端技术可能需要数年时间;作为游戏公司,培养员工的成本也不低。
新人或许有这样的经历,在请教资深技术人应该看什么资料学习C++服务端知识时,可能得到的答案是先把《TCP/IP详解》《UNIX环境高级编程》《数据库系统》这些大部头啃一遍,或者是把Redis、Skynet的源码过一遍,再看点Linux源码就都会了。虽说啃大部头、看源码是服务端从业者的必经之路,但人的时间是有限的,因此,在入门阶段,在有限的时间里学到实用的知识很关键。
找到契合实际项目开发需要的学习资料并不容易。市面上的服务端资料,有些着重讲网络编程、多线程处理等操作系统知识,这些知识虽然很重要,但不太适合“快速入门并马上有产出”的开发节奏;有些又太过简单浅显,不能适应商业游戏的品质要求。游戏服务端的知识体系既包含系统底层知识,也包含具体游戏业务的设计,内容很多,学习不易。
基于以上所述,我决定将自己多年的开发经验全盘托出,编写一本既实用又深入浅出的游戏服务端教程,为未来游戏行业的繁荣发展添砖加瓦。
服务端成长路线
游戏公司培养新人,强调“边学边用”“有产出再深入”的技术成长路线,一般是让新人从开发简单的业务功能开始,再逐步深入底层,后独当一面。
年:能做好功能
这个阶段要求能按时、按质、按量做好业务功能。刚进游戏公司参与项目开发,你需要从较简单的活动功能写起,逐渐过渡到能编写较为复杂的跨服功能和战斗功能等。
第二年:能用好框架
公司开启一个新项目,一般不会从零做起,而是会拿一套已有代码参考,根据需求做修改。这个阶段就要求你能够分析别人为什么要这样设计,并能修改底层功能,改善性能问题。
第三年:能重建系统
当旧框架已经落后于时代,或者历史遗留问题太多,又或者想开展新业务、开发不同类型的游戏时,你就要从零开始设计了。这个阶段要求你有重新搭建整套服务端系统的能力。
本书的内容选择和章节设计,正是基于这样的成长路线规划的。先用现成的Skynet引擎把游戏做出来,再逐步深入,重构整套系统。经过这几个阶段的打磨,相信不久的将来,你就能够独当一面。
读者对象
这里根据用户需求划分出一些可能使用本书的用户。
职场新人:本书很适合刚入行的服务端工程师,书中所介绍的知识和问题,是每个游戏从业人员都会遇到或必须解决的。本书可作为提升技术水平的学习资料,也适合用作游戏公司服务端新人的培训材料,书中既涵盖了该岗位的知识,也包含了《球球大作战》、Sunnet(C++仿写Skynet底层)等实践项目。我们希望职场新人读完本书之后,不仅能够更快更好地完成手头工作,还能够为下一阶段的职业发展做好积累。
开发类岗位的求职者:本书也适合游戏公司开发岗位的求职者。书中对服务端岗位所需知识、商业游戏常遇到的问题等进行了讲解,覆盖了常见的面试内容。我们希望本书能够帮助读者获得C++服务端开发工程师的岗位。
高校学生:本书可作为高校教科书。书中内容是按照游戏公司的需求设计的,内容循序渐进,且包含诸多示例。我们希望本书可以帮助学生掌握实用的知识,帮助他们构建完整的知识体系,也为未来的进一步进修或职业发展提供助力。
游戏开发爱好者:在本书中,“学以致用”的理念贯穿全书,对于想要自己制作一款网络游戏的业余开发者来说,本书很适合作为自学的参考书。我们希望本书可以帮助读者“先把游戏做出来”,让读者能够先快速使用现成的Skynet框架,再逐步深入底层,为梦想助力。
如何阅读本书
如果你是一位服务端新人,强烈建议你按顺序阅读本书,并复现一遍书中的示例。在本书的选材和结构编排上,我花了两年时间思考,也做过很多调研工作,相信它是相对合理的。图1展
评论
还没有评论。