百万在线:大型游戏服务端开发
①全新正版,现货速发,7天无理由退换货②天津、成都、无锡、广东等多仓就近发货,订单最迟48小时内发出③无法指定快递④可开电子发票,不清楚的请咨询客服。
¥
71.8
7.3折
¥
99
全新
库存3件
作者罗培羽
出版社机械工业出版社
ISBN9787111687559
出版时间2021-08
装帧平装
开本16开
定价99元
货号31233299
上书时间2024-10-14
商品详情
- 品相描述:全新
- 商品描述
-
目录
前 言<br/>第一部分 学以致用<br/>第1章 从角色走路说起 2<br/>1.1 每走一步都有事情发生 2<br/>1.1.1 走路的五个步骤 3<br/>1.1.2 服务端视角的游戏流程 3<br/>1.2 从网络编程着手 4<br/>1.2.1 用打电话做比喻 4<br/>1.2.2 最少要掌握的三个概念 5<br/>1.2.3 搭一个简单的服务器 6<br/>1.2.4 让角色走起来 8<br/>1.3 能够承载多少玩家 9<br/>1.3.1 单线事件模型 9<br/>1.3.2 承载量估算 9<br/>1.4 用分布式扩能 10<br/>1.4.1 多个程序协同工作 11<br/>1.4.2 三个层次的交互 11<br/>1.4.3 搭个简单的分布式服务端 12<br/>1.4.4 一致性问题 14<br/>1.5 回头看操作系统 15<br/>1.5.1 多进程为什么能提升性能 15<br/>1.5.2 阻塞为什么不占CPU 16<br/>1.5.3 线程会占用多少资源 17<br/>1.6 一张地图的极限 18<br/>1.6.1 难以分割的业务 19<br/>1.6.2 在延迟和容量间权衡 19<br/>1.7 万物皆Actor 19<br/>1.7.1 灵感来自Erlang 20<br/>1.7.2 对世界的抽象 20<br/>1.7.3 为何适用 22<br/>第2章 Skynet入门精要 25<br/>2.1 下载、编译、运行 26<br/>2.1.1 下载和编译 26<br/>2.1.2 运行范例 27<br/>2.2 理解Skynet 28<br/>2.2.1 节点和服务 28<br/>2.2.2 配置文件 29<br/>2.2.3 目录结构 30<br/>2.2.4 启动流程 31<br/>2.3 第一个程序PingPong 32<br/>2.3.1 功能需求 32<br/>2.3.2 学习服务模块 32<br/>2.3.3 代码实现 33<br/>2.3.4 运行结果 35<br/>2.4 写Echo,练习网络编程 35<br/>2.4.1 功能需求 36<br/>2.4.2 学习网络模块 36<br/>2.4.3 代码实现 37<br/>2.4.4 运行结果 37<br/>2.5 做聊天室,学习多人交互 38<br/>2.5.1 功能需求 38<br/>2.5.2 代码实现 38<br/>2.6 做留言板,使用数据库 39<br/>2.6.1 功能需求 39<br/>2.6.2 学习数据库模块 40<br/>2.6.3 准备数据库 40<br/>2.6.4 代码实现 43<br/>2.6.5 运行结果 45<br/>2.7 监控服务状态 45<br/>2.7.1 启用调试控制台 45<br/>2.7.2 监控指令 46<br/>2.8 使用节点集群建立分布式系统 48<br/>2.8.1 功能需求 48<br/>2.8.2 学习集群模块 48<br/>2.8.3 节点配置 49<br/>2.8.4 代码实现 49<br/>2.8.5 运行结果 51<br/>2.8.6 使用代理 52<br/>2.9 使用Skynet的注意事项 52<br/>2.9.1 协程的作用 52<br/>2.9.2 扣除金币的Bug 52<br/>第3章 案例:《球球大作战》 54<br/>3.1 功能需求 54<br/>3.2 方案设计 55<br/>3.2.1 拓扑结构 55<br/>3.2.2 各服务功能 56<br/>3.2.3 消息流程 57<br/>3.2.4 设计要点 57<br/>3.3 搭架子:目录结构和配置 58<br/>3.3.1 目录结构 58<br/>3.3.2 配置文件 58<br/>3.3.3 第1版主服务 59<br/>3.3.4 启动脚本 60<br/>3.3.5 服务配置 60<br/>3.4 磨刀工:封装易用的API 62<br/>3.4.1 定义属性 63<br/>3.4.2 启动逻辑 63<br/>3.4.3 消息分发 64<br/>3.4.4 辅助方法 65<br/>3.4.5 编写空服务 66<br/>3.5 分布式登录流程 67<br/>3.5.1 完整的登录流程 67<br/>3.5.2 掉线登出流程 69<br/>3.5.3 协议格式 69<br/>3.6 代码实现:gateway 70<br/>3.6.1 连接类和玩家类 70<br/>3.6.2 接收客户端连接 71<br/>3.6.3 处理客户端协议 74<br/>3.6.4 编码和解码 75<br/>3.6.5 消息分发 76<br/>3.6.6 发送消息接口 78<br/>3.6.7 确认登录接口 79<br/>3.6.8 登出流程 80<br/>3.7 代码实现:login 81<br/>3.7.1 登录协议 81<br/>3.7.2 客户端消息分发 81<br/>3.7.3 登录流程处理 82<br/>3.8 代码实现:agentmgr 83<br/>3.8.1 玩家类 83<br/>3.8.2 请求登录接口 84<br/>3.8.3 请求登出接口 86<br/>3.9 代码实现:nodemgr 86<br/>3.10 代码实现:agent(单机版) 87<br/>3.10.1 消息分发 87<br/>3.10.2 数据加载 87<br/>3.10.3 保存和退出 88<br/>3.10.4 单机测试 88<br/>3.11 测试登录流程 89<br/>3.11.1 第2版主服务 89<br/>3.11.2 单节点测试 90<br/>3.11.3 跨节点测试 90<br/>3.12 战斗流程梳理 91<br/>3.12.1 战斗流程 91<br/>3.12.2 协议 91<br/>3.13 代码实现:场景服务 93<br/>3.13.1 Ball类 93<br/>3.13.2 Food类 94<br/>3.13.3 进入战斗 95<br/>3.13.4 退出战斗 97<br/>3.13.5 操作移动 97<br/>3.13.6 主循环 97<br/>3.13.7 移动逻辑 99<br/>3.13.8 生成食物 99<br/>3.13.9 吞下食物 100<br/>3.13.10 第3版主服务 101<br/>3.14 代码实现:agent(跨服务器版) 101<br/>3.14.1 多个模块 101<br/>3.14.2 进入战斗 101<br/>3.14.3 退出战斗 103<br/>3.14.4 最后的辅助方法 103<br/>3.14.5 运行结果 104<br/>3.15 改进 104<br/>第4章 Skynet进阶技法 106<br/>4.1 用“长度信息”解TCP包 107<br/>4.1.1 长度信息法 107<br/>4.1.2 使用netpack模块解析网络包 107<br/>4.1.3 测试小案例 110<br/>4.1.4 阻塞方法的时序 113<br/>4.2 用Json序列化协议 114<br/>4.2.1 安装lua-cjson模块 115<br/>4.2.2 使用lua-cjson模块 115<br/>4.2.3 设计完整协议格式 117<br/>4.2.4 编码Json协议 117<br/>4.2.5 解码Json协议 118<br/>4.2.6 测试 118<br/>4.3 用Protobuf高效传输 119<br/>4.3.1 什么是Protobuf 120<br/>4.3.2 安装Protobuf和pbc 120<br/>4.3.3 编译proto文件 121<br/>4.3.4 编码和解码 121<br/>4.4 如何设计游戏数据库 122<br/>4.4.1 传统设计方法 123<br/>4.4.2 传统的数据库难以应对版本更新 124<br/>4.4.3 Key-Value表结构 125<br/>4.4.4 用Protobuf描述玩家数据 126<br/>4.4.5 创建角色 126<br/>4.4.6 读取角色数据 127<br/>4.4.7 应对游戏版本更新 128<br/>4.4.8 拆分数据表 129<br/>4.5 如何关闭服务器 130<br/>4.5.1 管理控制台 130<br/>4.5.2 关闭服务器的流程 131<br/>4.5.3 阻止新玩家连入 132<br/>4.5.4 缓缓踢下线 133<br/>4.5.5 测试关闭服务器的功能 135<br/>4.6 怎样做定时系统 136<br/>4.6.1 每天第一次登录 136<br/>4.6.2 定时唤醒 137<br/>4.7 断线重连 138<br/>4.7.1 原理解析 139<br/>4.7.2 身份标识 139<br/>4.7.3 消息缓存 140<br/>4.7.4 处理重连请求 141<br/>4.7.5 断线处理 142<r/>4.7.6 测试 143<br/>第二部分 入木三分<br/>第5章 你好,C++并发世界 146<br/>5.1 从HelloWorld开始 147<br/>5.1.1 HelloWorld 147<br/>5.1.2 用CMake构建工程 147<br/>5.1.3 “学猫叫”小例子 149<br/>5.1.4 各文件的依赖关系 151<br/>5.1.5 模仿Skynet写底层 151<br/>5.2 多核多线程 153<br/>5.2.1 操作系统调度原理 153<br/>5.2.2 创建线程对象 154<br/>5.2.3 模仿Skynet开启线程 155<br/>5.2.4 等待线程退出 158<br/>5.2.5 Worker设计模式 159<br/>5.3 探索C++对象模型 160<br/>5.3.1 Actor模型的消息类 160<br/>5.3.2 栈、堆、智能指针 161<br/>5.3.3 对象的内存分布 162<br/>5.4 队列与锁 162<br/>5.4.1 模仿Skynet写服务类 163<br/>5.4.2 锁的初始化 164<br/>5.4.3 多线程队列插入 166<br/>5.4.4 在多线程队列取出元素 166<br/>5.4.5 三个回调方法 168<br/>5.4.6 分析临界区 168<br/>5.5 多线程下的对象管理 170<br/>5.5.1 使用哈希表 170<br/>5.5.2 浅析读写锁 171<br/>5.5.3 新建服务 172<br/>5.5.4 查找服务 172<br/>5.5.5 删除服务 173<br/>5.5.6 程序终于能运行了 174<br/>5.6 充分利用CPU 175<br/>5.6.1 全局消息队列 175<br/>5.6.2 插入和弹出 177<br/>5.6.3 标志位 178<br/>5.6.4 模仿Skynet发送消息 179<br/>5.6.5 工作线程调度 180<br/>5.7 演示程序PingPong 183<br/>5.7.1 辅助函数 183<br/>5.7.2 编写ping服务 183<br/>5.7.3 测试 184<br/>5.8 条件变量与唤醒机制 185<br/>5.8.1 改进版线程调度 185<br/>5.8.2 如何使用条件变量 186<br/>5.8.3 工作线程的等待与唤醒 188<br/>5.8.4 测试 189<br/>5.9 后台运行 189<br/>第6章 图解TCP网络模块 191<br/>6.1 启动网络线程 192<br/>6.1.1 方案设计 192<br/>6.1.2 新增两种消息 192<br/>6.1.3 套接字到底是什么 193<br/>6.1.4 模仿Skynet的网络线程 195<br/>6.1.5 自定义连接类 197<br/>6.2 半小时搞懂Epoll的用法 201<br/>6.2.1 从轮询说起 202<br/>6.2.2 创建epoll对象 203<br/>6.2.3 直观理解监听列表 204<br/>6.2.4 最重要的步骤:等待 207<br/>6.2.5 监听对象的生命周期 210<br/>6.2.6 水平触发和边缘触发 211<br/>6.3 打开监听端口 212<br/>6.3.1 三个API:socket、bind和listen 212<br/>6.3.2 如何保障线程安全 215<br/>6.3.3 关闭连接 215<br/>6.3.4 测试:感知新连接 216<br/>6.4 网络事件分发 216<br/>6.4.1 拆分事件 217<br/>6.4.2 接收新客户端 218<br/>6.4.3 传递可读写事件 220<br/>6.4.4 测试:Echo程序 220<br/>6.5 如何安全读写数据 222<br/>6.5.1 消息分支 222<br/>6.5.2 可读、可写、关闭 224<br/>6.5.3 处理莫名其妙退出的问题 226<br/>6.5.4 PIPE信号处理 228<br/>6.6 写缓冲区满 229<br/>6.6.1 实验:发送大数据 229<br/>6.6.2 解决方法1:设置SNDBUFFORCE 230<br/>6.6.3 解决方法2:自写缓冲区 230<br/>第7章 嵌入Lua脚本语言 234<br/>7.1 方案设计 234<br/>7.1.1 隔离数千个服务 235<br/>7.1.2 目录结构 235<br/>7.1.3 启动流程 235<br/>7.2 嵌入Lua虚拟机 236<br/>7.2.1 下载、编译源码 236<br/>7.2.2 理解静态库 237<br/>7.2.3 最重要的结构:lua_State 238<br/>7.2.4 从创建到销毁 239<br/>7.2.5 编译指令 240<br/>7.3 C++调用Lua方法 241<br/>7.3.1 代码示例 241<br/>7.3.2 涉及4个API 242<br/>7.3.3 直观理解Lua栈 243<br/>7.3.4 再回顾调用方法 244<br/>7.4 Lua调用C++函数 245<br/>7.4.1 Sunnet的脚本模块 245<br/>7.4.2 写接口 246<br/>7.4.3 分析4个API 246<br/>7.4.4 还需注册函数 248<br/>7.4.5 思考题 250<br/>7.5 Lua版的PingPong 251<br/>7.5.1 封装两个新接口 251<br/>7.5.2 Lua版的ping服务 253<br/>7.5.3 运行结果 254<br/>7.5.4 参数序列化 255<br/>7.6 Lua版聊天室 256<br/>7.6.1 继续封装 256<br/>7.6.2 Lua版的聊天服务 258<br/>7.6.3 运行结果 258<br/>7.6.4 拓展说明 259<br/>第三部分 各个击破<br/>第8章 同步算法 262<br/>8.1 同步难题 263<br/>8.1.1 一种移动方法 263<br/>8.1.2 瞬移、顿挫、打不中 264<br/>8.1.3 抖动和延迟 265<br/>8.2 客户端障眼法 267<br/>8.2.1 插值算法 267<br/>8.2.2 缓存队列 268<br/>8.2.3 主动方优先 269<br/>8.3 各类同步方案及适用场景 269<br/>8.3.1 三种同步方案 270<br/>8.3.2 适用场景 271<br/>8.3.3 案例:《天涯明月刀》 271<br/>8.3.4 案例:《王者荣耀》
— 没有更多了 —
以下为对购买帮助不大的评价