当前位置:网站首页>浅谈《帧同步网络游戏》之“框架”实现思路
浅谈《帧同步网络游戏》之“框架”实现思路
2022-08-10 05:37:00 【优梦创客】
版权申明:
- 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
- 更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
为什么要采用帧同步
- 帧同步是与状态同步并驾齐驱的两种网络游戏开发模式
- 简言之,帧同步就是客户端发送操作,服务器转发给每个客户端;而状态模式是客户端发操作,收服务器计算结果
- 帧同步最早流行是出现在局域网游戏中,如最早的红色警戒、帝国时代系列等,那时没有专用游戏服务器,游戏数据都是通过一台局域网主机转发给其他客户机
- 进入2000年,网游开始兴起,有了专门的支持大型多人在线的网络游戏服务器,为了避免作弊,这时的大部分网游都采用了状态模式进行开发,客户端只能发送操作,并得到服务器计算的结果,从而极大降低了客户端变态外挂出现的可能性(大部分都是辅助型外挂)
- 进入2015年,手机游戏兴起,由于手机游戏使用场景的多样性,网络传输性能波动大,状态同步流量消耗大延迟相对高的问题就暴露出来,使用状态同步的游戏无法提供游戏的快速响应,打击感不够,于是帧同步技术再次流行,当然是经过改良的帧同步(解决了很多局域网游戏时代的问题,参见本专栏后续文章),国民手游《王者荣耀》即是采用帧同步技术实现了低延迟和快速响应。
帧同步原理
先上原理图:
基本上来说,上面这幅图的意思就是:
客户端发送操作到服务器,服务器收集到两个客户端的操作后再广播给每个客户端
只要我们能保证从游戏开始(第0帧开始)两个客户端的每个实体在同一位置,每一帧做相同的操作,那么计算结果就应相同,也即:
STATE(N+1)=OP(STATE(N))
- STATE(N):代表客户端每个实体在第N帧的状态
- OP:代表客户端在第N帧的操作(移动、释放技能等)
但这里有几个帧同步的核心问题有待解决:
如果客户端发送数据延迟了,服务器就会处于等待数据状态,造成所有玩家都处于等待状态(参见上图第10帧的等待状态)
这是我们的帧同步框架要解决的第1个问题(避免等待和追帧)
网络同步数据帧的频率通常不可能跟客户端流畅运行所需要达到的频率相同——客户端要60FPS才能流畅允许,而网络同步的频率通常只有60FPS的一半:30FPS!
这是我们的帧同步框架要解决的第2个问题(逻辑/表现分离)
为了实现STATE(1)=OP(STATE(0)),要求我们的操作不能使用浮点数进行运算,必须采用“定点数”,这就要求我们实现一套基于定点数的浮点数、向量、四元数、导航和碰撞计算框架——工作量是巨大的!
这是我们的帧同步框架要解决的第3个问题(定点数框架)
游戏如果断线了,要能够重连,由于帧同步游戏没有所谓“当前状态”的概念,就需要我们从游戏第0帧一直追到当前帧
这是我们的帧同步框架要解决的第4个问题(断线重连和追帧)
为了进一步提高网络通信的效率,我们不能采用为大量数据稳定传输准备的TCP协议,而需要采用为小批量数据传输准备的UDP协议,但UDP协议存在一系列传输稳定性问题
这是我们的帧同步框架要解决的第5个问题(稳定的UDP数据传输)
如何解决这些问题
- 要一次性解决这些问题,工作量无疑是巨大的,经过大量的积累和经历多个项目实践检验,我们积累了一套面向Unity和Cocos的跨平台帧同步解决方案,基于此框架可以快速实现稳定的单服万人在线的房间类游戏项目开发,详情请关注我们的后续系列文章。
- 也可加QQ:1517069595,带你从零开发一套帧同步框架,并基于此开发一个完整的3D实时竞技网游项目!
边栏推荐
- STM32单片机LORA无线远程火灾报警监控系统DS18B20MQ2火焰检测
- Tensorflow 2.0 使用流程详解
- 在Unity中让主摄像机发射一条射线,判断射线在游戏场景中所碰撞的游戏物体名字和标签名称(亲测有效)
- 卷积神经网络(CNN)实现mnist手写数字识别
- Machine Learning - Clustering - Shopping Mall Customer Clustering
- .Net Core imports tens of millions of data to Mysql
- (Flutter报错)Cannot run with sound null safety, because the following dependencies
- 二维卷积定理的验证(上)
- STM32F407ZG GPIO输出相关实验
- STM32单片机OLED俄罗斯方块单片机小游戏
猜你喜欢
LeetCode 162.寻找峰值(中等)
STC12C5A60S2单片机WIFI信号扫描报警监视系统信号增强信号过低报警
Deep learning TensorFlow entry environment configuration
Unity中Xml简介以及通过脚本读取Xml文本中的内容
【fiddler4】使用fiddler设置简单并发
Pico设备中的截图以及视频文件通过adb命令保存到电脑中
每日刷题(day01)——leetcode 53. 最大子数组和
pytorch-06. Logistic regression
PyTorch 之 可视化网络架构
51单片机智能远程遥控温控PWM电风扇系统红外遥控温度速度定时关机
随机推荐
I don't like my code
Notes for RNN and Decision Tree
开源游戏服务器框架NoahGameFrame(NF)简介(一)
Linux的文件IO与标准IO,以及IO缓存
Flutter Package 插件开发
氨氮的有效吸附材料
三种素数筛总结——(朴素筛,埃氏筛,线性筛)
LeetCode 100. The same tree (simple)
51单片机教室人数进出统计检测数码管显示装置红外传感器
系统架构和问题定位
【简易笔记】PyTorch官方教程简易笔记 EP1
C#对MySQL数据库进行增删改查操作(该操作还有防止MySQL注入功能)
【C语言】结构体变量学习笔记1
The way for programmers to make money from a sideline business and increase their monthly income by 20K
ASP.NET有关于文件上传、下载、全选、删除选中重要干货(亲测有效)
常用模块封装-csv文件操作封装
LeetCode 162.寻找峰值(中等)
氨氮吸附工艺
电路分析中的电容器的基本知识
基于MNIST数据集的简单FC复现