首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >反思下开发中位置同步遇到的问题

反思下开发中位置同步遇到的问题

作者头像
keyle
发布2024-11-01 12:10:52
发布2024-11-01 12:10:52
17800
代码可运行
举报
文章被收录于专栏:礼拜八不工作礼拜八不工作
运行总次数:0
代码可运行

先简单描述下本篇记录的是什么. 起因是服务器这段时间在查流量,需要严格控制乃至减少现在数据包的 大小/频率。 目前服务器的逻辑大概在30hz的频率刷新当前逻辑块,客户端并未走单独的逻辑刷新层。故现在客户端并未按照帧去判定当前是否同步,而是走固定的刷新周期。 250ms为一个刷新周期,触发当前同步的判定;

先列一下几种位置同步的【条件】:

代码语言:javascript
代码运行次数:0
运行
复制
角度是否变更
位置是否变更

在固定的周期内会检测一次两个条件是否超出一定的阈值,如果超过定量则在该周期内同步一次。服务器则根据当前同步的角度预测计算帧当前角色可能的位置。

如果是这种做法,当前移动速度为6m/s :

代码语言:javascript
代码运行次数:0
运行
复制
客户端刷新周期250ms,延迟为200ms,服务器得到当位置的最大误差为:(0.25s + 0.2s) * 6m = 2.7m   每秒4个包
客户端刷新周期100ms,延迟为200ms,服务器得到当位置的最大误差为:(0.1s + 0.2s) * 6m  = 1.8m   每秒10个包
客户端刷新周期50ms,延迟为200ms,服务器得到当位置的最大误差为:(0.05s + 0.2s) * 6m  = 1.5m   每秒20个包
...

以此类推,稍微优化一下也用不了那么多包,如果【条件】没有变更的话是不需要持续在周期内同步。也就变成了每帧判定【条件】是否变更,如果没有变更则无需同步, 否则走默认的周期检测,检测周期也就可以改为1s同步一次当前位置。

条件的改变频率

在此基础上可以知道延迟固定的最大误差为 0.2s * 6m = 1.2m ,那么现在基于此应该去尽量少的发送数据包,也尽量少降低误差。 如果【条件】改变的频繁会大幅增加发包的数量,甚至可能每帧都产生一个包。如果玩家在原地绕圈的时候. 此时增加【条件】的冗余可以减少当前发包的数量,如 增加 角度/距离 变更的判定范围。 实际上这样做的效果并不好,原因是【条件】太容易满足。

基于误差累计替换【条件】(航位推算法DR)

前面有说到服务器预测当前物体,在计算帧的坐标是基于 运动朝向 + 物体坐标

那么在我们的检测代码中可以做两次计算:

先预测服务器得到的当前物体位置 : 上次同步的坐标 + 运动方向 * 同步结束后累计的时间 计算当前物体实际距离与 预测服务器得到的当前物体位置 之间的距离

如果当前位置与服务器预测的位置误差控制在一定的范围内则不需要同步反之立即同步一次;

这样的好处是误差可以控制在一定的范围内并且尽量的少发送同步包;比如误差控制在0.1m范围,如果发送的包超量再适当的增加此范围。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 礼拜八不工作 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 条件的改变频率
  • 基于误差累计替换【条件】(航位推算法DR)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档