diff options
Diffstat (limited to 'Client/Assembly-CSharp/InnerNet/InnerNetClient.cs')
-rw-r--r-- | Client/Assembly-CSharp/InnerNet/InnerNetClient.cs | 17 |
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) { |