首页 > 其他分享 >桢同步问题分析以及解决方案

桢同步问题分析以及解决方案

时间:2023-07-07 22:44:17浏览次数:59  
标签:分析 同步 解决方案 void movementInfo private time using

问题展示以及源码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(PlayerPawn))]
public class MoveSync:MonoBehaviour
{

    private float time = 0;
    [SerializeField]
    private float SyncInternal = 0.5f;

    private PlayerPawn playerPawn;
    private void Start()
    {
        playerPawn= GetComponent<PlayerPawn>();
        //playerPawn.OnDirectionChange += SyncMovement;
    }

    private void Update()
    {
        time += Time.deltaTime;
        if (time > SyncInternal)
        {
            time -= SyncInternal;
            SyncMovement();
        }
    }

    //客户端->服务端 同步
    private void SyncMovement()
    {
        var direction = playerPawn.Direction.ToCC();
        var pos = transform.position.ToVec2().ToCC();
        MovementInfo movementInfo = new MovementInfo() { Direction= direction, Position = pos };
        SyncMovementToServer(movementInfo);
    }

    private void SyncMovementToServer(MovementInfo movementInfo)
    {
        Application.Instance.ClientService.ServerCaller.ServerProxy.AskSyncMovement(movementInfo);
    }
}

//服务端 ->客户端 同步
public void OnSyncPlayerMove(PlayerMovementInfo playerMovementInfo)
{

    //不处理自己的同步
    if (playerMovementInfo.PlayerId == DataCenter.Instance.PlayerId)
    {
        Log.Debug("");
        return;
    }

    var pawn = id2PlayerPawnDict[playerMovementInfo.PlayerId];
    pawn.SetPosition(playerMovementInfo.Position.ToUnity());
    pawn.SetDirection(playerMovementInfo.Direction.ToUnity());
}

问题观察以及分析

观察上图,我们可以发现玩家操作的角色会存在闪现,角色拉回等现象。

而导致这个问题出现的原因是 我们同时传递了 角色的位置信息 以及 角色的移动方向。
其中角色的位置信息是用于状态的及时更新,而角色的移动方向是用于状态的短期模拟。

观察代码,我们可以知道客户端向服务端同步的间隔是0.5f秒。

虽然移动是连续的,但这里我们传输数据必须是离散的。
因为如果你每时每刻都传输玩家的数据,那必然会占用大量的网络带宽
但如果同步的频率间隔太长,会导致角色响应迟缓

角色的移动方向用于模拟,这样我们可以不用一直发数据。
这里我们角色闪现,拉回无疑是同步太慢导致的。
比如角色在转角已经转弯,但是由于数据没有及时同步出去,模拟端由于信息缺失认为角色还在直行。
等到信源端再次同步的时候,就发生了模拟预测和源端数据不一致的现象。

问题解决以及结果展示

由于角色闪现是因为同步频率太少导致的,这里我们可以将角色的同步放到FixedUpdate提高同步的精度,接着提高同步的频率。就可以轻松解决问题。

读者也可以通过反复对比修改前后的源码来推敲细节以及其他可能的解决方案。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(PlayerPawn))]
public class MoveSync:MonoBehaviour
{

    private float time = 0;
    [SerializeField]
    private float SyncInternal = 0.05f;

    private PlayerPawn playerPawn;
    private void Start()
    {
        playerPawn= GetComponent<PlayerPawn>();
    }

    private void FixedUpdate()
    {
        time += Time.fixedDeltaTime;
        if (time > SyncInternal)
        {
            time -= SyncInternal;
            SyncMovement();
        }
    }

    // 客户端->服务端 同步
    private void SyncMovement()
    {
        var direction = playerPawn.Direction.ToCC();
        var pos = transform.position.ToVec2().ToCC();
        MovementInfo movementInfo = new MovementInfo() { Direction= direction, Position = pos };
        SyncMovementToServer(movementInfo);
    }

    private void SyncMovementToServer(MovementInfo movementInfo)
    {
        Application.Instance.ClientService.ServerCaller.ServerProxy.AskSyncMovement(movementInfo);
    }
}

相关文章

https://www.bilibili.com/video/BV1Qb411h7ua

https://zhuanlan.zhihu.com/p/38468615
https://www.zhihu.com/question/323505671

标签:分析,同步,解决方案,void,movementInfo,private,time,using
From: https://www.cnblogs.com/dewxin/p/17536053.html

相关文章

  • 别再说代码质量难评估了!SonarQube一键分析代码质量他不香吗?
    无论是架构师还是研发经理,代码质量都是必须要关注的重点。Sonar(没错,是Sonar,不是SonarQube)是一个用于代码质量管理的开源平台,用于管理代码的质量。它通过插件形式可以支持二十几种语言的代码质量检测,通过多个维度的检查了快速定位代码中潜在的或者明显的错误。千里之行始于足下,......
  • 别再说代码质量难评估了!SonarQube一键分析代码质量他不香吗?
    无论是架构师还是研发经理,代码质量都是必须要关注的重点。Sonar(没错,是Sonar,不是SonarQube)是一个用于代码质量管理的开源平台,用于管理代码的质量。它通过插件形式可以支持二十几种语言的代码质量检测,通过多个维度的检查了快速定位代码中潜在的或者明显的错误。千里之行始于足下,今......
  • c# 高并发问题及解决方案
    1、数据的不一致性解决:加锁2、大量的数据读取请求解决:缓存3、操作系统单个进程线程创建上限限制,抛出异常解决:分布式、负载均衡4、秒杀活动,多个请求,单个资源解决:消息队列......
  • chatgpt 与传统3D建模对比分析
    推荐:将NSDT场景编辑器加入你的3D工具链  随着人工智能技术的发展,越来越多的领域正逐渐被AI模型所取代。ChatGPT作为一种自然语言处理技术,越来越为人们所熟悉。最近,一些3D建模领域的专家想知道ChatGPT是否可以取代传统的手动3D建模。本文的目的是分析用ChatGPT取代传统手动3D建......
  • 易基因: DNA甲基化差异水平分析中的DMC、DMR、DMG鉴定 | 干货分享
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。DNA甲基化(DNAmethylation)为DNA化学修饰的一种形式,能够在不改变DNA序列的前提下,改变遗传表现。所谓DNA甲基化是指在DNA甲基化转移酶的作用下,在基因组CpG二核苷酸的胞嘧啶5号碳位共价键结合一个甲基基团。大量研究表明......
  • linux--I/O分析
    磁盘IO磁盘IO时的过程。第一步,首先是磁头径向移动来寻找数据所在的磁道。这部分时间叫寻道时间。第二步,找到目标磁道后通过盘面旋转,将目标扇区移动到磁头的正下方。第三步,向目标扇区读取或者写入数据。到此为止,一次磁盘IO完成。故单次磁盘IO时间=寻道时间+旋转延......
  • R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达
    全文下载链接:http://tecdat.cn/?p=25880 最近我们被客户要求撰写关于泊松过程的研究报告,包括一些图形和统计输出。本文描述了一个模型,该模型解释了交易的聚集到达,并展示了如何将其应用于比特币交易数据。这是很有趣的,原因很多。例如,对于交易来说,能够预测在短期内是否有更多的买......
  • Java语言语法语义分析器设计与实现
    Java语言词法分析器的设计与实现一.实验目的1.强化对系统软件综合工程实现能力、规划能力的训练;2.加强对词法分析原理、方法和基本实现技术的理解;二.实验内容用C语言(或C++)作为宿主语言完成:     其中具体要求:    1.使用DFA实现词法分析器的设计;    2.实现对Java源程......
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
    作者:卢文双资深数据库内核研发序言:以前对MySQL测试框架MTR的使用,主要集中于SQL正确性验证。近期由于工作需要,深入了解了MTR的方方面面,发现MTR的能力不仅限于此,还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能,因此,本着分享的精神,将其......
  • UniApp与微信小程序的异同点分析
    UniApp和微信小程序都是流行的移动应用开发框架,它们有一些相似之处,但也存在一些明显的异同点。在本篇博客中,我将对UniApp和微信小程序进行详细的异同点分析,并提供相关的示例代码。开发语言:微信小程序:使用WXML(类似于HTML)、WXSS(类似于CSS)和JavaScript进行开发。UniApp:支持使用Vue.js......