龙岗网站设计效果,一元购网站建设,活动策划流程及细节,宣传网课程里的版本好像是1.9#xff0c;目前使用版本为3.8.3 开始~ 目录 状态同步帧同步帧同步客户端帧同步服务端ECS框架概念ECS的解释ECS的特点EntityComponentSystemWorld ECS实现逻辑帧渲染帧 ECS框架使用帧同步ECS 状态同步
一般游戏的同步策略有两种#xff1a;…课程里的版本好像是1.9目前使用版本为3.8.3 开始~ 目录 状态同步帧同步帧同步客户端帧同步服务端ECS框架概念ECS的解释ECS的特点EntityComponentSystemWorld ECS实现逻辑帧渲染帧 ECS框架使用帧同步ECS 状态同步
一般游戏的同步策略有两种状态同步和帧同步 如下时序图为状态同步
c1操作从a走到b再走到c因为不必关注细节所以c1将a走到c这个信息告诉给服务端服务端验证这个操作是否合规将验证结果告诉回c1同时服务端还将这个信息转发给了c2和c3c2网络比较快立刻收到了这条数据根据插值模拟模拟出c1从a走到c的动作当然如果请求频率够快将a到b和b到c都告诉了c2那就模拟的更精细c3因为网络较慢过了很久才收到服务端的数据此时c1已经做下一个动作了那c3就会采取一个瞬移或加速的方式模拟c1的移动 优点 容易断线重连因为数据都在服务端容易防外挂因为逻辑都在服务端简单粗暴客户端只需获取服务端数据并展示 缺点 服务器压力大需要承担很大的计算量流量大数据均由服务端传送过来不同玩家屏幕表现不一样 帧同步
帧同步的计算全部在客户端服务端只负责做每帧收集操作合并操作并且转发 那么问题来了怎么保证所有客户端结果相同 相同输入 相同逻辑 相同结果 逻辑层和显示层的分离
同一帧c1想要移动c2想要进行攻击他们将数据都发送给了服务端服务端只进行合并转发给两个客户端c1收到了c1想要移动c2想要攻击的数据并进行模拟c2同样收到了c1想要移动c2想要攻击的数据并进行模拟下一帧中客户端都没有操作没有数据传给服务端服务器同样进行发送操作 注意 现代网游用这种模式当c2掉线了服务端仍然逐帧执行c1并没有受到影响而老代网游模式每一帧客户端都需要给服务端传送数据没操作也要传当c2掉线后服务端发现收不到c2的数据就会锁帧所有客户端都需要等待直到再次所有客户端的数据再老代网游如果有一个客户端网速很慢客户端就会拉长帧时间去保证每个客户端的帧更新是同步的会导致网速快的客户端也很慢 优点 流量低所有逻辑都在客户端方便做录像功能直接客户端再次执行运算逻辑即可服务器逻辑简化 缺点有可能作弊需要保证各端运算结果一致性比如随机数无限小数等实时性要求比较高帧同步的特点就是每秒同步很多次断线重连需要重新跑所有逻辑可优化 状态同步和帧同步比较
帧同步客户端
客户端职责
玩家操作不直接处理而是发送给服务器收到服务器一帧数据模拟一帧 帧同步但是逻辑在服务端
[代码实现]在下面
帧同步服务端
具体步骤可以看之前的文章 还是再总结一下 快速开始NodeJs项目 npm init -y 安装TS npm install typescript --save-dev 安装WS npm install ws --save-dev 安装提示 npm install types/ws --save-dev 生成tsconfig.json tsc --init 安装即时编译 npm install ts-node --save-dev 添加nodemon npm install nodemon --save-dev 服务端职责
把玩家加入到一局游戏中下发初始消息每一帧收集操作合包转发
代码实现(客户端服务端)
ECS框架概念
ECS的解释
E - Entity 实体C - Component 组件S - System 系统
ECS的特点
网络-数据-逻辑-显示层相互独立C/S端可以运行同一份逻辑代码方便验证作弊 服务端没有creator内api逻辑显示放在一起的话服务端跑不了可以方便的进行预测和回退
Entity
每个Entity对象都有不同的EntityIdComponent挂在的对象同种类型的Component只能拥有一个提供Component的增删查和备份
Component
Component只包含数据不能拥有逻辑函数Component挂载在Entity上ComponentId使用不同的位来区分因为Component操作比较频繁所以需要使用位运算效率优化 位运算
System
System只拥有逻辑不能包含数据System拥有不同Type,比如逻辑帧System渲染帧System依靠SystemType来确定执行顺序和每帧执行次数onUpdate函数由系统自动触发不能手动调用
World
ECS世界的入口单例驱动System和Update提供Entity的增删查功能使用forEach根据ComponentId组合来遍历Entity
ECS实现
实现代码
逻辑帧渲染帧
如下图为一帧执行的内容和不同机器的运行速度
我们期望1s内能执行60帧每一帧执行一个逻辑帧和一个渲染帧那就需要每一帧耗时不超过16.6ms高性能机器每一帧耗时16ms(88)可以满足1s执行60帧低性能机器每一帧耗时24ms(1212)无法满足1s执行60帧那就会优先执行逻辑帧不执行渲染帧去满足1s执行60次逻辑帧保证高低性能机的逻辑次数一致以确保执行结果相同 ECS框架使用
实现和使用放在一起了 使用ECS实现一个简单的demo箭头旋转前进 实现代码
帧同步ECS
代码实现