Skip to content

Commit e7d5508

Browse files
committed
refactor(web): 适配 ReferencePool 释放及资源管理优化
- Dispose → ReferencePool.Release,new → WebProtoBufData.Create - 非 WebGL 路径 finally 块补充 ReferencePool.Release - WebGL 路径重构为 try/finally,确保 UnityWebRequest.Dispose 和 ReferencePool.Release 始终执行 - 移除共享 MemoryStream 字段,改为每请求独立 MemoryStream 实例, 消除并发数据竞争和重复 Dispose 问题 - ShutdownProtoBuf 列表清理从 RemoveAt(0) O(n²) 优化为 for 循环 - 移除 WebGL 路径多余的花括号块
1 parent 69856e3 commit e7d5508

2 files changed

Lines changed: 29 additions & 31 deletions

File tree

Runtime/Web/WebProtoBuffManager.ProtoBuf.cs

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.IO;
44
using System.Net;
@@ -62,20 +62,16 @@ private void ShutdownProtoBuf()
6262
while (m_WaitingProtoBufQueue.Count > 0)
6363
{
6464
var webData = m_WaitingProtoBufQueue.Dequeue();
65-
webData.Dispose();
65+
ReferencePool.Release(webData);
6666
}
6767

6868
m_WaitingProtoBufQueue.Clear();
69-
while (m_SendingProtoBufList.Count > 0)
69+
for (int i = 0; i < m_SendingProtoBufList.Count; i++)
7070
{
71-
var webData = m_SendingProtoBufList[0];
72-
m_SendingProtoBufList.RemoveAt(0);
73-
webData.Dispose();
71+
ReferencePool.Release(m_SendingProtoBufList[i]);
7472
}
7573

7674
m_SendingProtoBufList.Clear();
77-
78-
m_MemoryStream.Dispose();
7975
}
8076

8177
/// <summary>
@@ -96,23 +92,29 @@ private async void MakeProtoBufBytesRequest(WebProtoBufData webData)
9692
}
9793

9894
unityWebRequest.timeout = (int)RequestTimeout.TotalSeconds;
99-
{
100-
unityWebRequest.SetRequestHeader("Content-Type", ProtoBufContentType);
101-
byte[] postData = webData.SendData;
102-
unityWebRequest.uploadHandler = new UnityEngine.Networking.UploadHandlerRaw(postData);
103-
}
95+
unityWebRequest.SetRequestHeader("Content-Type", ProtoBufContentType);
96+
byte[] postData = webData.SendData;
97+
unityWebRequest.uploadHandler = new UnityEngine.Networking.UploadHandlerRaw(postData);
10498

10599
var asyncOperation = unityWebRequest.SendWebRequest();
106100
asyncOperation.completed += (asyncOperation2) =>
107101
{
108-
m_SendingProtoBufList.Remove(webData);
109-
if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError || unityWebRequest.error != null)
102+
try
110103
{
111-
webData.Task.TrySetException(new Exception(unityWebRequest.error));
112-
return;
113-
}
104+
m_SendingProtoBufList.Remove(webData);
105+
if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError || unityWebRequest.error != null)
106+
{
107+
webData.Task.TrySetException(new Exception(unityWebRequest.error));
108+
return;
109+
}
114110

115-
webData.Task.SetResult(new WebBufferResult(webData.UserData, unityWebRequest.downloadHandler.data));
111+
webData.Task.SetResult(new WebBufferResult(webData.UserData, unityWebRequest.downloadHandler.data));
112+
}
113+
finally
114+
{
115+
unityWebRequest.Dispose();
116+
ReferencePool.Release(webData);
117+
}
116118
};
117119
#else
118120
try
@@ -132,10 +134,11 @@ private async void MakeProtoBufBytesRequest(WebProtoBufData webData)
132134
{
133135
using (Stream responseStream = response.GetResponseStream())
134136
{
135-
m_MemoryStream.SetLength(response.ContentLength);
136-
m_MemoryStream.Position = 0;
137-
await responseStream.CopyToAsync(m_MemoryStream);
138-
webData.Task.SetResult(new WebBufferResult(webData.UserData, m_MemoryStream.ToArray())); // 将流的内容复制到内存流中并转换为byte数组
137+
using (var ms = new MemoryStream())
138+
{
139+
await responseStream.CopyToAsync(ms);
140+
webData.Task.SetResult(new WebBufferResult(webData.UserData, ms.ToArray()));
141+
}
139142
}
140143
}
141144
}
@@ -161,6 +164,7 @@ private async void MakeProtoBufBytesRequest(WebProtoBufData webData)
161164
finally
162165
{
163166
m_SendingProtoBufList.Remove(webData);
167+
ReferencePool.Release(webData);
164168
}
165169
#endif
166170
}
@@ -219,7 +223,7 @@ private Task<WebBufferResult> PostInner(string url, MessageObject message, objec
219223
Body = SerializerHelper.Serialize(message),
220224
};
221225
var sendData = SerializerHelper.Serialize(messageHttpObject);
222-
var webData = new WebProtoBufData(url, sendData, uniTaskCompletionSource, userData);
226+
var webData = WebProtoBufData.Create(url, sendData, uniTaskCompletionSource, userData);
223227
m_WaitingProtoBufQueue.Enqueue(webData);
224228
return uniTaskCompletionSource.Task;
225229
}
@@ -240,4 +244,4 @@ private void DebugSendLog(MessageObject messageObject)
240244
#endif
241245
}
242246
}
243-
}
247+
}

Runtime/Web/WebProtoBuffManager.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.IO;
43
using System.Text;
54
using GameFrameX.Runtime;
65
#if UNITY_WEBGL
@@ -18,9 +17,6 @@ public partial class WebProtoBuffManager : GameFrameworkModule, IWebProtoBuffMan
1817
// 用于构建URL的StringBuilder
1918
private readonly StringBuilder m_StringBuilder = new StringBuilder(256);
2019

21-
// 用于存储请求和响应数据的内存流
22-
private readonly MemoryStream m_MemoryStream;
23-
2420
// 超时时间(秒)
2521
private float m_Timeout = 5f;
2622

@@ -31,7 +27,6 @@ public partial class WebProtoBuffManager : GameFrameworkModule, IWebProtoBuffMan
3127
public WebProtoBuffManager()
3228
{
3329
MaxConnectionPerServer = 8;
34-
m_MemoryStream = new MemoryStream();
3530
Timeout = 5f;
3631
}
3732

@@ -75,7 +70,6 @@ protected override void Update(float elapseSeconds, float realElapseSeconds)
7570
protected override void Shutdown()
7671
{
7772
ShutdownProtoBuf();
78-
m_MemoryStream.Dispose();
7973
}
8074

8175
/// <summary>

0 commit comments

Comments
 (0)