This commit is contained in:
2026-06-17 21:26:06 +08:00
parent d663942ce4
commit abbc326ee5
33 changed files with 42784 additions and 41922 deletions
@@ -3,6 +3,7 @@ using Assets.MyGame.Scripts.Net.WebResponses;
using Assets.MyGame.Scripts.Net.WebResponses.ChineseChess;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;
using Unity.VisualScripting;
using UnityEngine;
@@ -215,20 +216,105 @@ public partial class WebSocketSendList
}
/// <summary>
/// 数据同步
/// 同步等级常量(秒)
/// </summary>
public const float SYNC_LV1 = 0.2f;
public const float SYNC_LV2 = 0.5f;
public const float SYNC_LV3 = 1f;
// 队列
private static float _syncLv1Timer;
private static float _syncLv2Timer;
private static float _syncLv3Timer;
private static Dictionary<int, SyncGameData> _syncLv1Cover = new Dictionary<int, SyncGameData>();
private static List<SyncGameData> _syncLv1Append = new List<SyncGameData>();
private static List<SyncGameData> _syncLv2Append = new List<SyncGameData>();
private static List<SyncGameData> _syncLv3Append = new List<SyncGameData>();
/// <summary>数据同步(自动按类型分级入队)</summary>
public static void SyncGameData(object obj)
{
WebSocketSendList sendObj = new WebSocketSendList
var sgd = obj as SyncGameData;
if (sgd == null)
{
SendImmediate(JsonConvert.SerializeObject(obj));
return;
}
switch (sgd.frameType)
{
case FrameDataType.fireBullet:
SendImmediate(BuildJson(sgd));
return;
case FrameDataType.rotateTurrect:
case FrameDataType.changeAutoTarget:
_syncLv1Cover[sgd.sitPos] = sgd;
return;
case FrameDataType.randomDieFish:
_syncLv1Append.Add(sgd);
return;
case FrameDataType.createFish:
case FrameDataType.changeTurretState:
case FrameDataType.changeTurret:
case FrameDataType.freezeFish:
_syncLv2Append.Add(sgd);
return;
default:
_syncLv3Append.Add(sgd);
return;
}
}
/// <summary>每帧调用,由 GameMainPanel.Update 驱动</summary>
public static void FlushSyncQueues(float dt)
{
_syncLv1Timer += dt;
if (_syncLv1Timer >= SYNC_LV1) { _syncLv1Timer = 0f; FlushLv1(); }
_syncLv2Timer += dt;
if (_syncLv2Timer >= SYNC_LV2) { _syncLv2Timer = 0f; FlushLv2(); }
_syncLv3Timer += dt;
if (_syncLv3Timer >= SYNC_LV3) { _syncLv3Timer = 0f; FlushLv3(); }
}
private static void FlushLv1()
{
foreach (var kv in _syncLv1Cover) SendImmediate(BuildJson(kv.Value));
foreach (var sgd in _syncLv1Append) SendImmediate(BuildJson(sgd));
_syncLv1Cover.Clear();
_syncLv1Append.Clear();
}
private static void FlushLv2()
{
foreach (var sgd in _syncLv2Append) SendImmediate(BuildJson(sgd));
_syncLv2Append.Clear();
}
private static void FlushLv3()
{
foreach (var sgd in _syncLv3Append) SendImmediate(BuildJson(sgd));
_syncLv3Append.Clear();
}
private static void SendImmediate(string json)
{
WebSocketManager.Instance.Send(SocketType.game, json);
}
private static string BuildJson(object obj)
{
var sendObj = new WebSocketSendList
{
type = 1,
invocationId = "1",
target = "SyncGameData",
arguments = new System.Collections.Generic.List<object>()
arguments = new System.Collections.Generic.List<object>
{
GameManager.Instance.gameData.currRoomData.roomId,
obj
}
};
sendObj.arguments.Add(GameManager.Instance.gameData.currRoomData.roomId);
sendObj.arguments.Add(obj);
WebSocketManager.Instance.Send(SocketType.game, JsonConvert.SerializeObject(sendObj));
return JsonConvert.SerializeObject(sendObj);
}
}