游戏服务器开发技术总结

2024-05-25 01:08

本文主要是介绍游戏服务器开发技术总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

去研究新的方向了,总结下过去

游戏类型

  • 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://www.chinasem.cn/article/1000055

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel