这里写目录标题
- 前言
- 位移移动
- 插值
- 内插(Interpolation)
- 外插(Extrapolation)
- 命中判定
- Hit Registration
- 在客户端去判定
- 在服务器端去判定
- 延迟补偿
- 掩体问题
- 躲进掩体
- 走出掩体
- 技能前摇
- 本地暴击效果
- 基础MMO框架
- 分布式架构
- 一致性哈希
- 服务管理
- 带宽优化
- AOI
- 画格子
- 十字链表
- PVS
- 反作弊
- 查内存Obfuscation Memory
- 确认本地文件哈希值
- 网络包进行加密
- 防范软件注入作弊
- 防范AI作弊
- 构建可扩展的游戏世界
前言
位移移动
插值
内插适用于玩家会突然瞬移加速的情况,相对比较稳定(FPS,MOBA)
外插适用于整个运动符合物理学规律的情况,预测他的速度是比较准确的
游戏内通常会都使用,人物使用内插,载具使用外插
内插(Interpolation)
会加剧延迟,对高速移动的游戏应用是会产生偏差,尤其涉及到玩家碰撞的情况下
外插(Extrapolation)
考虑信息在传播时的延迟,预判对方的行动
PVB
不会看到物体的位置瞬间改变,而是逐步的变化
外插值的问题,会导致碰撞的两个物体相互穿到一起,物理引擎会将他们弹飞
解决:
当检测到两个物体重叠了就会将位置控制器转换到物理来控制,然后再转回去
命中判定
如何判定敌人的距离,怎么判断是否命中他?
Hit Registration
在不确定的网络环境下有无命中目标没有一个确定的解
在客户端去判定
符合人的直觉,高效,精确,手感好,但不安全,一旦客户端被破解就可以作弊
开枪瞬间发出一条射线,只要敌人在射线上则判定为被击中
服务器会对这个结果进行检验
客户端发送包含完整射线信息的碰撞事件到服务器
(StartPoint、HitPoint和HitObject)
验证StartPoint是否真的足够接近射击者
验证HitPoint是否真的属于HitOject
从StartPoint和HitPoint投射光线,确保路径上没有障碍物。
在服务器端去判定
会因为网络延迟造成误差,很难打中正在运动的物体
延迟补偿
猜测在每一个开枪者开枪的瞬间是什么情况
前提是要对目前的情况做一个快照,从而找到过去的情况
如果客户端进行攻击(如断网)就可以无视,防止作弊
掩体问题
躲进掩体
如果躲到掩体后还是被打死了
因为延迟的问题,被击中人已经躲进掩体,但开枪人视角里被击中人没有躲进掩体,服务器端以开枪人的世界为准,所以会出现这种情况
走出掩体
走出掩体瞄准敌人时,尽管狙击手已经走出掩体,会因为网络延迟的原因,敌人还没看到射击手走出掩体时就被击毙
技能前摇
能够给网络同步争取时间
本地暴击效果
在本地检测到命中时播放特效,但结算还是以服务器的计算为准,观感上会变好
基础MMO框架
- Link层:负责玩家登录和拦截恶意攻击
- Lobby:大厅,一个特殊的游戏模式,作为一个缓冲池
- Character Server:管理计算玩家的信息
- 交易系统:要保证数据的安全性足够高,全部都可以RollBack
- 社交系统:玩家之间的交流,邮件
- Matching:匹配同类型的玩家(玩家的段位,网络延迟相似)
- 数据的存储:关系数据库,非关系数据库(速度更快,游戏里很多GameState,Loging数据都使用了这个数据库),内存数据库
当玩家过多时服务器承载不了怎么办
分布式架构
解决附载均衡
一致性哈希
使用哈希算法把用户分配到服务器上
服务管理
注册唯一标识后可以随时检查服务状态并给所有观察者发送信息
带宽优化
计算带宽
数据压缩
将浮点数转换为定点数记录,有时为了配合这个算法还会对地图进行分割,很高效,有时能将数据压缩到一半以上
AOI
以自己为中心只关注距离自己一段距离内的情况
画格子
空间换时间,将空间划分为格子,当物体在玩家的范围内时将其加入观察列表
十字链表
将所有物体的x,y轴分别排序,如果该物体在xy轴的位置都与玩家观测的范围相交,则说明在观察范围内
PVS
根据目前玩家的位置设置潜在的可视范围,其他的位置不关注
根据引用主体的远近去调整信息同步的频率
反作弊
查内存Obfuscation Memory
对单机游戏比较有用
- 把客户端加密
- 内存混淆,把高度敏感的数据在内存中进行加密,只有读写的时候解除
确认本地文件哈希值
客户端检测本地文件的哈希值和服务器端的是否相同,如果篡改了直接将玩家下线
网络包进行加密
非对称加密
客户端只有一个公钥,服务器端有一个私钥,客户端的公钥被破解了也无法获取到信息,因为没有私钥
防范软件注入作弊
扫描内存中的文件签名,检查是否被修改过,检查到就进行报警
防范AI作弊
根据用户大数据模型进行比较检测是否作弊