Some handling of dropped packages
This commit is contained in:
@@ -266,6 +266,37 @@ CanvasRenderer:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2406178}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!1 &2841571
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2841572}
|
||||
m_Layer: 0
|
||||
m_Name: Resend previous events
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &2841572
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2841571}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 297676220}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1001 &6734103
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -9639,6 +9670,42 @@ PrefabInstance:
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 00a825a5aeafee94789192f61cbb3a5a, type: 3}
|
||||
--- !u!1 &297676219
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 297676220}
|
||||
m_Layer: 0
|
||||
m_Name: NetworkManager
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &297676220
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 297676219}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 1897221841}
|
||||
- {fileID: 2841572}
|
||||
- {fileID: 963448677}
|
||||
- {fileID: 1334822256}
|
||||
- {fileID: 1683006206}
|
||||
m_Father: {fileID: 1886023632}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1001 &300095180
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -28642,6 +28709,37 @@ Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 1315692994360949719, guid: 00a825a5aeafee94789192f61cbb3a5a, type: 3}
|
||||
m_PrefabInstance: {fileID: 1641300668}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!1 &963448676
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 963448677}
|
||||
m_Layer: 0
|
||||
m_Name: Ping
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &963448677
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 963448676}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 297676220}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &964231232 stripped
|
||||
GameObject:
|
||||
m_CorrespondingSourceObject: {fileID: 4099390335584803315, guid: 00a825a5aeafee94789192f61cbb3a5a, type: 3}
|
||||
@@ -41660,6 +41758,37 @@ GameObject:
|
||||
m_CorrespondingSourceObject: {fileID: 1914595051839510733, guid: 9fbd72f5bc3c5434a87ab8539789c584, type: 3}
|
||||
m_PrefabInstance: {fileID: 8042777216032092028}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!1 &1334822255
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1334822256}
|
||||
m_Layer: 0
|
||||
m_Name: FullSync respects delay
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &1334822256
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1334822255}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 297676220}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1001 &1335132404
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -51668,6 +51797,37 @@ PrefabInstance:
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 00a825a5aeafee94789192f61cbb3a5a, type: 3}
|
||||
--- !u!1 &1683006205
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1683006206}
|
||||
m_Layer: 0
|
||||
m_Name: Store events in separate arrays
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &1683006206
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1683006205}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 297676220}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!4 &1683500364 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 1315692994360949719, guid: 00a825a5aeafee94789192f61cbb3a5a, type: 3}
|
||||
@@ -58786,6 +58946,7 @@ Transform:
|
||||
- {fileID: 712073434}
|
||||
- {fileID: 106401850}
|
||||
- {fileID: 851913432}
|
||||
- {fileID: 297676220}
|
||||
- {fileID: 1961479820}
|
||||
- {fileID: 2129311453}
|
||||
- {fileID: 2142346958}
|
||||
@@ -58899,12 +59060,12 @@ Transform:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1897221840}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1961479820}
|
||||
m_Father: {fileID: 297676220}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &1898242099 stripped
|
||||
GameObject:
|
||||
@@ -60490,7 +60651,6 @@ Transform:
|
||||
- {fileID: 2030126881}
|
||||
- {fileID: 2103220969}
|
||||
- {fileID: 455444785}
|
||||
- {fileID: 1897221841}
|
||||
- {fileID: 147662346}
|
||||
- {fileID: 29433776}
|
||||
m_Father: {fileID: 1886023632}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -245,7 +245,7 @@ namespace Marro.PacManUdon
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleError()
|
||||
private void HandleError(bool clearBuffer)
|
||||
{
|
||||
retriesWithoutSuccess++;
|
||||
|
||||
@@ -259,7 +259,12 @@ namespace Marro.PacManUdon
|
||||
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Encountered data error, attempting to recover via full sync.");
|
||||
|
||||
if (clearBuffer)
|
||||
{
|
||||
ClearBuffer();
|
||||
}
|
||||
|
||||
isSynced = false;
|
||||
|
||||
if (!isOwner)
|
||||
{
|
||||
@@ -293,16 +298,7 @@ namespace Marro.PacManUdon
|
||||
|
||||
var timestamp = TimeToTimestamp(SyncedTime);
|
||||
|
||||
if (timestamp != lastEventTimestamp)
|
||||
{
|
||||
lastEventId = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
lastEventId++;
|
||||
}
|
||||
|
||||
var eventId = lastEventId;
|
||||
var eventId = GetNextEventId(lastEventId);
|
||||
|
||||
InitializeEvent(eventType, timestamp, eventId, BufferMaxSizeBytes, out byte[][] data, out var index);
|
||||
|
||||
@@ -334,6 +330,9 @@ namespace Marro.PacManUdon
|
||||
|
||||
RequestSerialization();
|
||||
|
||||
lastEventTimestamp = timestamp;
|
||||
lastEventId = eventId;
|
||||
|
||||
retriesWithoutSuccess = 0; // We had success!
|
||||
}
|
||||
|
||||
@@ -354,6 +353,12 @@ namespace Marro.PacManUdon
|
||||
data[0] = header;
|
||||
index = 1;
|
||||
}
|
||||
|
||||
[NetworkCallable]
|
||||
public void RequestEventReceived(NetworkEventType eventType)
|
||||
{
|
||||
SendEvent(eventType);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Receiver
|
||||
@@ -368,56 +373,78 @@ namespace Marro.PacManUdon
|
||||
SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.Owner, "RequestEventReceived", eventType);
|
||||
}
|
||||
|
||||
private void ProcessIncomingData()
|
||||
private void StoreIncomingData()
|
||||
{
|
||||
if (networkedData.Length == 0)
|
||||
{
|
||||
return; // Nothing to process
|
||||
return; // Nothing to store
|
||||
}
|
||||
|
||||
Debug.Log($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Received {networkedData.Length} bytes!\nBytes received:\n{BytesToString(networkedData)}");
|
||||
|
||||
var length = networkedData.Length;
|
||||
int index = 0;
|
||||
while (index < length)
|
||||
int eventSize = 0; // Store event size here so we can increment the index no matter how we increment the loop
|
||||
while (true)
|
||||
{
|
||||
index += eventSize;
|
||||
|
||||
if (index >= length)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (length - index < HeaderLength)
|
||||
{
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) {nameof(ProcessIncomingData)}: Remaining data in networkedData is not long enough to form a complete event!");
|
||||
HandleError();
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) {nameof(StoreIncomingData)}: Remaining data in networkedData is not long enough to form a complete event! remaining: {length - index}.");
|
||||
HandleError(false);
|
||||
return;
|
||||
}
|
||||
|
||||
eventSize = networkedData[index + HeaderEventSizeIndex];
|
||||
|
||||
if (length - index < eventSize)
|
||||
{
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) {nameof(StoreIncomingData)}: Event size is larger than total remaining data! {nameof(eventSize)}: {eventSize}, remaining: {length - index}.");
|
||||
HandleError(false);
|
||||
return;
|
||||
}
|
||||
|
||||
var eventSize = networkedData[index + HeaderEventSizeIndex];
|
||||
var eventType = (NetworkEventType)networkedData[index + HeaderEventTypeIndex];
|
||||
|
||||
if (eventType == NetworkEventType.FullSync)
|
||||
{
|
||||
ProcessIncomingFullSync(index, eventSize); // Immediately process full sync
|
||||
index += eventSize;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isSynced)
|
||||
{
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Received event of type {eventType} while we are not yet synced to the remote time, ignoring event.");
|
||||
index += eventSize;
|
||||
continue;
|
||||
}
|
||||
|
||||
var timestamp = networkedData[index + HeaderTimestampIndex];
|
||||
var messageId = networkedData[index + HeaderEventIdIndex];
|
||||
var eventId = networkedData[index + HeaderEventIdIndex];
|
||||
|
||||
if (timestamp == lastEventTimestamp
|
||||
&& messageId == lastEventId)
|
||||
&& eventId == lastEventId)
|
||||
{
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Duplicate message of type {eventType}, timestamp: {timestamp}, messageId: {messageId}.");
|
||||
index += eventSize;
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Duplicate message of type {eventType}, timestamp: {timestamp}, messageId: {eventId}.");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (eventId != GetNextEventId(lastEventId))
|
||||
{
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) EventIds were not sequential! Did we miss a serialization? Timestamp: {timestamp}, eventId: {eventId}, lastEventId: {lastEventId}.");
|
||||
HandleError(false);
|
||||
return;
|
||||
}
|
||||
|
||||
AppendEventToBuffer(index, eventSize);
|
||||
index += eventSize;
|
||||
|
||||
lastEventTimestamp = timestamp;
|
||||
lastEventId = eventId;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -472,14 +499,14 @@ namespace Marro.PacManUdon
|
||||
if (!success)
|
||||
{
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Malformed data reported by {obj.name} during event type {eventType}!");
|
||||
HandleError();
|
||||
HandleError(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (index > this.bufferIndex)
|
||||
{
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Buffer overflow during {nameof(SyncedObject.SetSyncedData)} for {obj.name} in event type {eventType}!");
|
||||
HandleError();
|
||||
HandleError(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -488,7 +515,7 @@ namespace Marro.PacManUdon
|
||||
if (index != eventSize)
|
||||
{
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Amount of data read does not match event size! Expected {eventSize}, read {index}.");
|
||||
HandleError();
|
||||
HandleError(true);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -558,7 +585,7 @@ namespace Marro.PacManUdon
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) Too much data in buffer to store event!");
|
||||
}
|
||||
|
||||
HandleError(); // We can store event now that we cleared the buffer.
|
||||
HandleError(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -621,7 +648,7 @@ namespace Marro.PacManUdon
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"({nameof(PacManUdon)} {nameof(NetworkManager)}) New event is earlier than previous event!");
|
||||
HandleError();
|
||||
HandleError(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -637,15 +664,24 @@ namespace Marro.PacManUdon
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Header
|
||||
public static byte GetNextEventId(byte currentEventId)
|
||||
{
|
||||
if (currentEventId == byte.MaxValue) // Udon forces overflow checks
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
currentEventId += 1;
|
||||
|
||||
return currentEventId;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VRC events
|
||||
public override void OnOwnershipTransferred(VRCPlayerApi newOwner)
|
||||
{
|
||||
SetOwner(newOwner == Networking.LocalPlayer);
|
||||
|
||||
if(isOwner)
|
||||
{
|
||||
HandleError();
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnPreSerialization()
|
||||
@@ -685,7 +721,7 @@ namespace Marro.PacManUdon
|
||||
{
|
||||
if (!isOwner)
|
||||
{
|
||||
ProcessIncomingData();
|
||||
StoreIncomingData();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -58,9 +58,13 @@ public class TestBallManager : UdonSharpBehaviour
|
||||
{
|
||||
networkManager.SimulateSyncToTimestamp(NetworkManager.TimeToTimestamp(networkManager.SyncedTime - 0.5f));
|
||||
}
|
||||
else if (networkManager.IsOwner)
|
||||
{
|
||||
networkManager.SendEvent(NetworkEventType.FullSync);
|
||||
}
|
||||
else
|
||||
{
|
||||
networkManager.SendEvent((NetworkEventType)0);
|
||||
networkManager.RequestEvent(NetworkEventType.FullSync);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user