【游戏开发】游戏服务器开发技术总结
游戏服务器开发方面的总结,此文章只是宽泛的总结开发中遇到的,使用的,见过的技术点,没有对每个技术点进行深入描述。游戏类型
[*]MMORPG
[*]FPS
[*]文字/解密
[*]2D格斗
[*]赛车、球类竞技运动模拟
[*]休闲小游戏
[*]其他
本文以MMORPG类型为例,总结服务器开发的技术栈。
架构
[*]多服架构,目前主流MMORPG服务器为了提升承载人数,采用多达几十个服务器进程来形成一组游戏服务器服务玩家。通常会按功能分类,比如全局服,代理服,聊天服,战场服,排行榜服,组队服等等。也会按功能或者场景分,比如主城场景和副本场景分开配置在不同的服务器上。网络拓扑结构,服务自动发现和注册,总线结构或者网状结构,单个进程挂掉影响不大,灵活水平扩展。
[*]数据库通常采用关系型数据库如MYSQL,配置多个数据库缓存进程多线程来访问数据库。序列化存入与反序列化读取。数据备份,从库策略。
[*]IO多路复用网络,游戏服务器对并发相比互联网程序要求不高,但对延迟要求苛刻。所以必然是独立的网络线程,甚至用协程来处理网络连接。采用TCP或者UDP,涉及网络库,自定义协议以及加密。
[*]逻辑主循环处理逻辑,帧率随游戏不同而要求不同,tick管理,游戏卡顿后的追帧。同时包含海量游戏玩法,各种功能模块。
[*]日志,一般是独立的日志进程。主要分为文本日志记录报错信息和玩法数据日志提供给运营分析。文本日志一般会记载服务器磁盘上,会有一定的磁盘io风险。运营是需求玩法内埋点统计,会发到数据中心,然后做出各种图表分析展示。
基础功能
[*]场景管理,地图管理,按格子划分地图。阻挡以及动态阻挡。
[*]AOI(Area of Interest)对象进入和离开的维护列表,移动同步视野内的对象,战斗进站脱战的同步。常见有九宫格,六边形网格,十字链表等方法。
[*]寻路,A*以及改进避免墙根,跨图寻路,主干道或者基于格子的寻路
[*]状态同步或帧同步,录像回放,移动同步
[*]热更新机制
[*]AI状态机,有限状态机,行为树。
[*]流程图或蓝图。
[*]功能开关
存储
[*]mysql
[*]备份
[*]从库
[*]存储引擎 InnoDB MyISAM
[*]索引,最左匹配原则,失效及优化
[*]数据库事务,存储过程,触发器
[*]sql语句优化,explain分析,选择合适的数据类型,表的拆分,系统配置
[*]nosql 以redis为例
[*]防止脏读
[*]分布式锁
[*]异步队列
[*]增量持久化
[*]同步机制
[*]集群
通信
多线程或线程池由于竞争和死锁可能不被采用,目前较多的是I/O多路复用模型。
[*]系统内核提供
[*]select
[*]poll
[*]kqueue
[*]epoll
[*]IOCP
[*]应用层编程模型
[*]Reactor
[*]Proactor
[*]Actor
[*]常见网路开源库
[*]libevent/libev Reactor模型
[*]Mogo Reactor模型
[*]Boost:Asio Proactor模型
[*]Skynet Actor模型
利用多核cpu优势设置最优线程数,还有通信方式如下
[*]共享内存
[*]管道
[*]Socket
[*]http短链接,与第三方接口交互
[*]TCP/UDP自己优化协议与序列化
[*]非阻塞调用,多路复用epoll
[*]libevent,libev,Boost.Asio,skynet等多线程网络库
[*]支持SSL
[*]通信协议
[*]rpc协议 protobuf
[*]频率限制与熔断
[*]心跳检测,版本号
[*]TCP之Nagle算法和延迟确认及关闭参数,丢包与拥塞控制算法BBR
[*]UDP自定义解析与约定
[*]组播
[*]消息队列,持久化
[*]加密协议,防注入,http正反向代理
逻辑
[*]正确 首先要保证实现逻辑正确,服务器和客户端数据同步,多进程间数据同步,以及一些玩法操作,如背包到仓库转移道具,玩家下线保存数据。
[*]安全 注重编程安全,不相信来源客户端的数据,接口进行效验。比如购物流程,先消耗货币时然后记日志再发货。
[*]高效 利用适当的数据结构如map或者数组存储数据,用适当的算法进行排序或查找。
[*]易于维护 代码结构清楚,接口定义名字显而易懂,适当出事。别人可以轻松调用你提供的接口和理解你的代码,易于维护和扩展。
运营
[*]Prometheus拉取日志
[*]Granfana监测数据或者展示数据
[*]基于Docker容器和Kubernetes编排快速部署
[*]云服务器
开发与调试
[*]开发语言 C/C++,lua, python,go
[*]gdb
[*]bt查看堆栈
[*]n/ni,s/si单步
[*]disassemble反汇编
[*]IDA
[*]lua或者python下相关的调试工具
[*]堆栈溢出,数组越界,野指针,未初始化内存
性能分析
[*]基础
[*]cpu
[*]寄存器
[*]L1,L2,L3级缓存
[*]多核
[*]流水线,分支预测,不做防御性编程
[*]内存
[*]物理地址,虚拟地址,逻辑地址,线性地址
[*]减少读写内存的次数
[*]分析工具
[*]CPU:ps,top,sar
[*]内存:free,vmstat
[*]io:iostat,iotop
[*]网络:ifconfig,netstat
[*]函数调用:perf
安全
[*]DDOS攻击
[*]IP黑白名单
[*]硬件网关拦截
[*]服务器对通信进行逻辑判断及使用的资源进行预估
[*]外挂
[*]伪造服务器通信协议
[*]注入,接口改参数调用
[*]修改客户端所在内存
出自:http://purecpp.cn
相关视频推荐
三个问题带你看懂skynet源码丨actor 是什么? 丨 actor 怎么调度? 丨 actor 跟网络怎么绑定?
用skynet手撕万人同时在线游戏丨 多核并发编程
游戏开发核心技术点 skynet训练营丨四小时带你玩转游戏服务器skynet框架技术点
LinuxC++后台服务器开发架构师免费学习地址
【文章福利】:小编整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!~点击832218493加入(需要自取)
页:
[1]