提交帧同步案例

This commit is contained in:
PC-20230316NUNE\Administrator
2024-01-26 19:15:07 +08:00
parent 3a345ab966
commit 68c4d5e811
3928 changed files with 463020 additions and 1 deletions

View File

@@ -0,0 +1,181 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Plugins.JNGame.System;
using Plugins.JNGame.Util;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Plugins.JNGame.Sync.Frame
{
public abstract class JNSyncFrame : SystemBase
{
//同步时间 (和服务器保持一致)
private int _nSyncTime = 67;
//大于多少帧进行追帧
private int _nMaxFrameBan = 3;
//大于多少帧进行快速追帧
private int _nMaxFrameLoopBan = 18;
//将服务器帧数进行平分
private int _nDivideFrame = 3;
//帧队列
private List<JNFrameInfo> _nFrameQueue = new();
//本地帧数
private int _nLocalFrame = 0;
//运行的帧
private int _nFrameRun = 0;
//暂存帧列表
private Dictionary<int,JNFrameInfo> _nFrameTempQueue = new();
//ID 每添加 JNSyncFrameComponent + 1
public Func<int> nSyncID = RandomUtil.Next(0);
//随机数
public Func<double> nRandom = RandomUtil.SyncRandom(100);
//随机数整数
public Func<int, int, int> nRandomInt = RandomUtil.SyncRandomInt(100);
//是否开始同步
Boolean _isStart = false;
//帧更新
int dtTotal = 0;
//输入更新
int dtInputTotal = 0;
public override Task OnInit()
{
Physics.autoSimulation = false;
Physics.autoSyncTransforms = false;
return Task.CompletedTask;
}
//重置数据
public void Reset()
{
this.nSyncID = RandomUtil.Next(0);
this.nRandom = RandomUtil.SyncRandom(100);
this.nRandomInt = RandomUtil.SyncRandomInt(100);
}
//更新同步
public void Update(int dt)
{
if(!_isStart) return;
dtTotal += dt;
dtInputTotal += dt;
int nSyncTime = this.DyTime();
if(nSyncTime > 0){
while(nSyncTime != 0 && this.dtTotal > nSyncTime){
this.onUpdate();
this.dtTotal -= nSyncTime;
nSyncTime = this.DyTime();
}
}else{
//追帧运行 保持前端 15 帧 刷新
int endTime = DateTime.Now.Millisecond + 66;
while(this.DyTime() == 0 && DateTime.Now.Millisecond < endTime){
this.onUpdate();
}
}
}
//运行帧
public void onUpdate()
{
}
//自适应间隔时间
private int DyTime(){
int dt = this._nSyncTime / this._nDivideFrame;
int loop = dt;
//大于nMaxFrameBan 进行 追帧
if(this._nFrameQueue.Count > this._nMaxFrameBan) {
//计算超过的帧数
int exceed = this._nFrameQueue.Count - this._nMaxFrameBan;
int most = this._nMaxFrameLoopBan - this._nMaxFrameBan;
int ldt = ((most - exceed) / most) * dt;
//自适应追帧算法
if(exceed <= this._nMaxFrameLoopBan){
loop = ldt;
}else{
loop = 0;
}
}else{
loop = dt;
}
return loop;
}
/**
* 接收帧数据
* @param frame 帧数据
* @param isLatestData 是否最新的帧数据
*/
public void AddInput(JNFrameInfo frame,Boolean isLatestData = false){
if(isLatestData){
//如果推的帧小于本地帧 则 重开
if(frame.Index < _nLocalFrame){
Reset();
return;
}
}
//我需要的下一帧
int index = _nLocalFrame + 1;
//判断接受的帧是否下一帧 如果不是则加入未列入
if (frame.Index != index){
_nFrameTempQueue.Add(frame.Index,frame);
//在未列入中拿到需要的帧
JNFrameInfo tamp = null;
if ((tamp = _nFrameTempQueue[index]) == null){
//如果没有则向服务器请求我需要的帧数
}
else
{
//如果有则覆盖
frame = tamp;
}
}
//删除临时帧
_nFrameTempQueue.Remove(frame.Index);
_nLocalFrame = index;
//分帧插入
_nFrameQueue.Add(frame);
for (var i = 0; i < this._nDivideFrame - 1; index++) {
_nFrameQueue.Add(new JNFrameInfo());
}
}
//发送帧数据
protected abstract void OnSendInput(JNFrameInputs inputs);
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 44e6e0cb968b4bc0a21ed772b81d1c39
timeCreated: 1706003302

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 240dc802e5754972a9f7590feea56628
timeCreated: 1706163840

View File

@@ -0,0 +1,51 @@
using System;
using UnityEngine;
namespace Plugins.JNGame.Sync.Frame.game
{
//所有帧同步组件的基类
public abstract class JNSyncFrameComponent<T> : MonoBehaviour
{
//标识
private int _nId;
//当前输入
private T _input;
//是否有输入
public Boolean isInput => this._input == null;
//是否初始化完成
public Boolean isSyncInitSuccess = false;
//清空输入
public void ClearInput(){
this._input = default(T);
}
private void Awake()
{
//向帧同步获取Id
this._nId = GetSync().nSyncID();
this.OnSyncLoad();
}
//初始化完成
public void OnSyncInitSuccess(){}
//获取同步类
protected abstract JNSyncFrame GetSync();
//加载
public abstract void OnSyncLoad();
//帧同步
public abstract void OnSyncUpdate(int dt,JNFrameInfo frame,Input input = null);
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1a802748c1744ea886c648699b51245f
timeCreated: 1706163852