summaryrefslogtreecommitdiff
path: root/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Client/Assembly-CSharp/InnerNet/InnerNetClient.cs')
-rw-r--r--Client/Assembly-CSharp/InnerNet/InnerNetClient.cs17
1 files changed, 12 insertions, 5 deletions
diff --git a/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs b/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs
index 4a68332..5806605 100644
--- a/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs
+++ b/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs
@@ -635,6 +635,7 @@ namespace InnerNet
}
// 结束游戏
+ // MsgWrite:EndGame
public MessageWriter StartEndGame()
{
MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable);
@@ -819,7 +820,7 @@ namespace InnerNet
this.EnqueueDisconnect(reason3, null);
return;
}
- case 4:
+ case Tags.RemovePlayer:
break;
case (int)TagAlias.GameData:
case (int)TagAlias.GameDataTo: // 把这类消息存在队列里,主线程后续调用
@@ -1665,11 +1666,15 @@ namespace InnerNet
{
uint netId = reader.ReadPackedUInt32();
InnerNetObject innerNetObject;
- if (this.allObjectsFast.TryGetValue(netId, out innerNetObject))
+ if (this.allObjectsFast.TryGetValue(netId, out innerNetObject)) // 如果有这个netObject
{
+ // 反序列化,更新数据
innerNetObject.Deserialize(reader, false);
return;
}
+ // 如果没有这个netObject且DestroyedObjects里也没有记录这个netId已经被销毁,那么
+ // 意味着SpawnMsg还没过来,因为Udp没法保证收到包的顺序,所以这里延迟执行这个消息,等到对应的netId收到后执行
+ // 如果下次执行的时候还是没有,那么继续调用DeferMessage,cnt>10次的时候退出这个递归
if (!this.DestroyedObjects.Contains(netId))
{
this.DeferMessage(cnt, reader, "Stored data for " + netId);
@@ -1765,7 +1770,7 @@ namespace InnerNet
case DespawnFlag: // MsgRead:DespawnMsg,收到消息后,销毁对应的netObject
{
uint netId = reader.ReadPackedUInt32();
- this.DestroyedObjects.Add(netId);
+ this.DestroyedObjects.Add(netId); // 回收这个netId
InnerNetObject innerNetObject5 = this.FindObjectByNetId<InnerNetObject>(netId);
if (innerNetObject5)
{
@@ -1819,7 +1824,9 @@ namespace InnerNet
}) + string.Join<byte>(" ", reader.Buffer));
}
- // 延迟到下一帧调用回调?
+ // 延迟到下一帧调用回调,因为Udp没法保证消息顺序,对于那些需要netObject存在的消息,比如同步netObject内容,可能
+ // 会出现netObject还没有创建的情况(因为没有受到SpawnMsg),这里会先缓存起来,每帧去检查一下,但超过10次后就放弃了
+ // cnt是递归次数
private void DeferMessage(int cnt, MessageReader reader, string logMsg)
{
if (cnt > 10)
@@ -1830,7 +1837,7 @@ namespace InnerNet
int cnt2 = cnt;
cnt = cnt2 + 1;
Debug.Log(logMsg);
- MessageReader copy = MessageReader.CopyMessageIntoParent(reader);
+ MessageReader copy = MessageReader.CopyMessageIntoParent(reader); // 拷贝
List<Action> preSpawnDispatcher = this.PreSpawnDispatcher;
lock (preSpawnDispatcher)
{