Skip to content

Commit 954baf7

Browse files
committed
[修改]1. 修改RPC的回调和Notify的顺序问题
1 parent 9524be0 commit 954baf7

File tree

4 files changed

+30
-9
lines changed

4 files changed

+30
-9
lines changed

Runtime/Network/Network/NetworkManager.NetworkChannelBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,8 @@ public virtual void Update(float elapseSeconds, float realElapseSeconds)
308308
}
309309

310310
ProcessHeartBeat(realElapseSeconds);
311-
PRpcState.Update(elapseSeconds, realElapseSeconds);
312311
ProcessInvokingNotifyMessage();
312+
PRpcState.Update(elapseSeconds, realElapseSeconds);
313313
}
314314

315315
/// <summary>

Runtime/Network/Network/NetworkManager.RpcState.cs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public sealed partial class NetworkManager
1818
public partial class RpcState : IDisposable
1919
{
2020
private readonly ConcurrentDictionary<long, RpcMessageData> m_HandlingObjects = new ConcurrentDictionary<long, RpcMessageData>();
21+
private readonly GameFrameworkLinkedList<MessageObject> m_ExecutionMessageLinkedList = new GameFrameworkLinkedList<MessageObject>();
2122
private readonly HashSet<long> m_HandlingObjectIds = new HashSet<long>();
2223
private EventHandler<MessageObject> m_RpcStartHandler;
2324
private EventHandler<MessageObject> m_RpcEndHandler;
@@ -50,24 +51,42 @@ public void Dispose()
5051
/// 处理RPC回复消息。
5152
/// 此方法用于处理接收到的RPC回复消息,并触发相应的结束处理程序。
5253
/// </summary>
53-
/// <param name="message">要处理的消息对象,必须实现IResponseMessage接口。</param>
5454
/// <returns>如果成功处理回复消息,则返回true;否则返回false。</returns>
55-
public bool Reply(MessageObject message)
55+
private void InvokingReplyRpcMessage()
5656
{
57-
if (message.GetType().IsImplWithInterface(typeof(IResponseMessage)))
57+
while (m_ExecutionMessageLinkedList.First != null)
5858
{
59-
if (m_HandlingObjects.TryRemove(message.UniqueId, out var messageActorObject))
59+
var messageObject = m_ExecutionMessageLinkedList.First.Value;
60+
61+
if (m_HandlingObjects.TryRemove(messageObject.UniqueId, out var messageActorObject))
6062
{
6163
try
6264
{
63-
messageActorObject.Reply(message as IResponseMessage);
64-
m_RpcEndHandler?.Invoke(this, message);
65+
messageActorObject.Reply(messageObject as IResponseMessage);
66+
m_RpcEndHandler?.Invoke(this, messageObject);
6567
}
6668
catch (Exception e)
6769
{
6870
Log.Fatal(e);
6971
}
72+
}
73+
m_ExecutionMessageLinkedList.RemoveFirst();
74+
}
75+
}
7076

77+
/// <summary>
78+
/// 处理RPC回复消息。
79+
/// 此方法用于处理接收到的RPC回复消息,并触发相应的结束处理程序。
80+
/// </summary>
81+
/// <param name="message">要处理的消息对象,必须实现IResponseMessage接口。</param>
82+
/// <returns>如果成功处理回复消息,则返回true;否则返回false。</returns>
83+
public bool TryReply(MessageObject message)
84+
{
85+
if (message.GetType().IsImplWithInterface(typeof(IResponseMessage)))
86+
{
87+
if (m_HandlingObjects.TryGetValue(message.UniqueId, out _))
88+
{
89+
m_ExecutionMessageLinkedList.AddLast(message);
7190
return true;
7291
}
7392
}
@@ -105,6 +124,8 @@ public Task<IResponseMessage> Call(MessageObject messageObject)
105124

106125
public void Update(float elapseSeconds, float realElapseSeconds)
107126
{
127+
InvokingReplyRpcMessage();
128+
108129
if (m_HandlingObjects.Count > 0)
109130
{
110131
var elapseSecondsTime = (long)(elapseSeconds * 1000);

Runtime/Network/Network/SystemSocket/NetworkManager.SystemTcpNetworkChannel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ private bool ProcessPackBody()
213213

214214
DebugReceiveLog(messageObject);
215215

216-
var replySuccess = PRpcState.Reply(messageObject);
216+
var replySuccess = PRpcState.TryReply(messageObject);
217217
if (!replySuccess)
218218
{
219219
InvokeMessageHandler(messageObject);

Runtime/Network/Network/WebSocket/NetworkManager.WebSocketNetworkChannel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ private void ReceiveCallback(byte[] buffer)
298298
}
299299
}
300300

301-
var replySuccess = PRpcState.Reply(messageObject);
301+
var replySuccess = PRpcState.TryReply(messageObject);
302302
if (!replySuccess)
303303
{
304304
InvokeMessageHandler(messageObject);

0 commit comments

Comments
 (0)