Games104——网络游戏的进阶架构

这里写目录标题

前言

位移移动

插值

内插适用于玩家会突然瞬移加速的情况,相对比较稳定(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作弊

根据用户大数据模型进行比较检测是否作弊

构建可扩展的游戏世界

相关推荐
ccloud113 小时前
OpenGL实现场景编辑器
qt·游戏引擎
Octopus20774 小时前
【Godot】实现对话系统
游戏引擎·godot·游戏程序
君莫愁。17 小时前
【Unity】搭建基于字典(Dictionary)和泛型列表(List)的音频系统
数据结构·unity·c#·游戏引擎·音频
虾球xz1 天前
游戏引擎学习第143天
学习·游戏引擎
红黑色的圣西罗1 天前
Unity UGUI下优化需要射线检测类的UI元素的一种方式
unity·游戏引擎
虾球xz1 天前
游戏引擎学习第145天
学习·游戏引擎
虾球xz1 天前
游戏引擎学习第144天
学习·游戏引擎
虾球xz2 天前
游戏引擎学习第139天
linux·学习·游戏引擎
虾球xz2 天前
游戏引擎学习第141天
学习·游戏引擎