首页 > 其他分享 >UE 客户端和服务器上的时间同步

UE 客户端和服务器上的时间同步

时间:2024-07-01 10:10:07浏览次数:17  
标签:float GetWorld GetTimeSeconds 时间 UE 服务器 客户端

多客户端出现时间不同步的情况,,

由于每个客户端本地的时间,时区不同或者存在网络延迟造成的。所以为了能够使每个客户端显示的时间相同,就需要在Server上利用GetWorld()->GetTimeSeconds()获取服务器时间,然后传给客户端显示。
在传输过程中,要考虑到每个客户端的延迟需要做一些计算偏移,才能实现最终每个客户端的时间一致

利用RPC实现同步

UE中提过了RPC实现服务器和客户端的网络连接功能,其中ServerRPC表示在客户端调用,服务器执行,ClientRPC表示服务器调用,客户端执行。
在这里默认从客户端到服务器,从服务器到客户端的时间传输是一样的。

计算时间差

该时间差是指从客户端请求当前时间到服务器上调用ClientRPC后Client执行计算到的时间的差值,而该时间差就是产生每个客户端时间不同步的那些主要因素导致的。

  1. 首先在客户端上调用ServerRPC函数,该函数将接受客户端当前的时间GetTimeSeconds()作为参数,该时间作为起始时间,在服务器执行该函数,将得到服务器上当前时间
  2. ClientRPC将接受两个参数分别是客户端的起始时间和服务器当前时间,其中起始时间是用来计算RTT的,服务器当前时间是用来计算需要显示的时间的。
    Time_RTT = PreClientTime - NowClientTime。
    通过该RTT可以计算得到当服务器调用的ClientRPC函数在得到NowClientTime后,即该函数命令传递到客户端时,此时的ServerTime。
    NowServerTime = PreServerTime + RTT/2;
    当前的这个时间就应该是每个客户端最后应该显示的时间。为了分离,利用一个变量来接受差值NowServerTime - NowClientTime而不是直接的数值
void AXBlasterPlayerController::ServerRequestServerTime_Implementation(float TimeOfClientRequese)
{
	//获取接受时服务器的时刻
	float SeverTimeOfReceipt = GetWorld()->GetTimeSeconds();
	ClientReportServerTime(TimeOfClientRequese, SeverTimeOfReceipt);
}
//Client Run GetWorld()->GetTimeSeconds() is ClientCurrentTime
void AXBlasterPlayerController::ClientReportServerTime_Implementation(float TimeOfClientRequest, float TimeServerReceivedClientRequest)
{
	//计算RTT
	float RoundTripTime = GetWorld()->GetTimeSeconds() - TimeOfClientRequest;
	SingleTripTime = RoundTripTime * 0.5f;
	//ServerCurrentTime
	float CurrentServerTime = TimeServerReceivedClientRequest + SingleTripTime;

	ClientServerDelta = CurrentServerTime - GetWorld()->GetTimeSeconds();
}

Tick调用

该过程是确保客户端始终保持同步,通过设置的时间间隔调用

void AXBlasterPlayerController::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	SetHUDTime();
	CheckTimeSync(DeltaTime);
}
//在游戏过程中每隔一段时间同步服务器时间到客户端
void AXBlasterPlayerController::CheckTimeSync(float DeltaTime)
{

	TimeSyncRunningTime += DeltaTime;
	if (IsLocalController() && TimeSyncRunningTime > TimeSyncFrequency)
	{
		ServerRequestServerTime(GetWorld()->GetTimeSeconds());
		TimeSyncRunningTime = 0.f;
	}
}

HUD显示时间

通过对不同游戏状态(比如游戏中,中途加入游戏或者等待)提供相应的偏移,然后加上之前获得的NowServerTime即可

获取ServerTime

float AXBlasterPlayerController::GetSeverTime()
{
  //服务器上执行
	if (HasAuthority())
	{
		return GetWorld()->GetTimeSeconds();

	}
//客户端上执行需要加上偏移量,最终显现的是服务器上时间
	else
	{
		return GetWorld()->GetTimeSeconds() + ClientServerDelta;
	}
}

标签:float,GetWorld,GetTimeSeconds,时间,UE,服务器,客户端
From: https://www.cnblogs.com/XTG111/p/17981048

相关文章

  • 关于 VuePress 的主题
    什么是主题?读者对主题这个单词应该不陌生,例如大部分APP都支持白天主题和夜晚主题等,使用者可以很轻松的切换主题等等。VuePress中也有类似的概念。‍VuePress的主题在VuePress中,主题不仅仅是外观上的不同,不同的主题往往提供了不同的功能,能大大的完善我们的博客的功能,增强......
  • 如何在服务器中找到数据库文件路径
    在服务器中找到数据库文件路径的具体方法取决于您所使用的数据库管理系统和服务器的操作系统。以下是一些常见的数据库系统(如MySQL、MicrosoftSQLServer、Oracle、PostgreSQL和MongoDB)的文件路径查找方法的详细步骤:MySQL通过命令行查看:登陆MySQL数据库命令行客户端。......
  • 服务器硬件基础知识
    服务器硬件基础知识涵盖了多个核心组件,这些组件共同协作,确保服务器的稳定运行和高性能。以下是对服务器硬件基础知识的详细说明:一、主要硬件组件中央处理器(CPU)功能:执行计算和处理数据。重要因素:核心数、频率、缓存大小。厂商:Intel、AMD等。说明:CPU是服务器的“大脑”,负责处......
  • 2029年AI服务器出货量将突破450万台,AI推理服务器即将爆发式增长
    在2020年,新冠疫情与远程办公模式的兴起推动了所有类型服务器的出货量达到峰值,随后几年里,除了AI服务器之外的所有类别都回归到了正常水平。根据Omdia的研究数据,AI服务器的出货量在2020年急剧上升,并且至今未显示出放缓的迹象,预示着AI将成为数据中心应用的主导力量。Omdia在其《......
  • 猫头虎分享已解决Bug || 服务器配置错误(Server Configuration Error): ServerMisconfig
    ......
  • Dictate Your Coding Questions
    DictateYourCodingQuestionsCodeRushUltimate24.1introducesvoicesupportforinteractingwiththeGitHubCopilotChatAItool,savingtimewhenyouneedassistance.CodeRushUltimateisaVisualStudioextensiondesignedtoimprovedeveloperp......
  • Vue3学习(一)
    创建组件实例:我们传入 createApp 的对象实际上是一个组件import{createApp}from'vue'//从一个单文件组件中导入根组件importAppfrom'./App.vue'constapp=createApp(App)大多数真实的应用都是由一棵嵌套的、可重用的组件树组成的。App(rootcomponent)├......
  • 探索三丰云服务器:卓越性能与众多优点的完美结合
    在当今数字化时代,服务器成为了企业和个人开展业务、构建应用的重要基础设施。在众多服务器提供商中,三丰云服务器以其出色的性能和独特的优点脱颖而出。本文将为您详细介绍三丰云服务器的显著优势,让您深入了解为何它是您的理想选择。稳定可靠的性能三丰云服务器采用了先进的......
  • Java毕业设计-高校学生课堂考勤打卡系统 Vue前后端分离
    传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,班级信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的高校学生课堂考勤系统。......
  • Vue - 入门
    零:前端目前形势前端的发展史HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面->给后端(PHP、Python、Go、Java)->后端嵌入模板语法->后端渲染完数据->返回数据给前端->在浏览器中查看Ajax的出现->后台发送异步请求,Render+Ajax混合单用Ajax(加载数据,DO......