Skip to content

Commit 5ba15ce

Browse files
committed
fix(UI): 修复UI资源释放时未处理资源句柄的问题
添加assetHandle参数到ReleaseUIForm方法,确保在释放UI表单时同时卸载关联资源。修改UI打开流程以正确传递和设置资源句柄,避免内存泄漏。 GameFrameX/GameFrameX#24
1 parent e00146e commit 5ba15ce

2 files changed

Lines changed: 7 additions & 3 deletions

File tree

Runtime/FairyGUIFormHelper.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,17 @@ public override IUIForm CreateUIForm(object uiFormInstance, Type uiFormType, obj
146146
/// </summary>
147147
/// <param name="uiFormAsset">要释放的界面资源。</param>
148148
/// <param name="uiFormInstance">要释放的界面实例。</param>
149-
public override void ReleaseUIForm(object uiFormAsset, object uiFormInstance)
149+
/// <param name="assetHandle">资源句柄。</param>
150+
public override void ReleaseUIForm(object uiFormAsset, object uiFormInstance, object assetHandle)
150151
{
151152
if (uiFormInstance is GComponent component)
152153
{
153154
component.RemoveFromParent();
154155
component.Remove();
155156
component.Dispose();
156157
}
158+
159+
m_AssetComponent.UnloadAssetHandle(assetHandle);
157160
}
158161

159162
private void Awake()

Runtime/UIManager.Open.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ protected override async Task<IUIForm> InnerOpenUIFormAsync(string uiFormAssetPa
108108
if (assetHandle.IsSucceed())
109109
{
110110
// 加载成功
111+
openUIFormInfo.SetAssetHandle(assetHandle);
111112
return LoadAssetSuccessCallback(uiFormAssetName, openUIFormInfoData, assetHandle.Progress, openUIFormInfo);
112113
}
113114

@@ -201,13 +202,13 @@ private IUIForm LoadAssetSuccessCallback(string uiFormAssetName, object uiFormAs
201202
{
202203
m_UIFormsToReleaseOnLoad.Remove(openUIFormInfo.SerialId);
203204
var form = GetUIForm(openUIFormInfo.SerialId);
205+
m_UIFormHelper.ReleaseUIForm(uiFormAsset, null, openUIFormInfo.AssetHandle);
204206
ReferencePool.Release(openUIFormInfo);
205-
m_UIFormHelper.ReleaseUIForm(uiFormAsset, null);
206207
return form;
207208
}
208209

209210
m_UIFormsBeingLoaded.Remove(openUIFormInfo.SerialId);
210-
UIFormInstanceObject uiFormInstanceObject = UIFormInstanceObject.Create(uiFormAssetName, uiFormAsset, m_UIFormHelper.InstantiateUIForm(uiFormAsset), m_UIFormHelper);
211+
UIFormInstanceObject uiFormInstanceObject = UIFormInstanceObject.Create(uiFormAssetName, uiFormAsset, m_UIFormHelper.InstantiateUIForm(uiFormAsset), m_UIFormHelper, openUIFormInfo.AssetHandle);
211212
m_InstancePool.Register(uiFormInstanceObject, true);
212213

213214
var uiForm = InternalOpenUIForm(openUIFormInfo.SerialId, uiFormAssetName, openUIFormInfo.FormType, uiFormInstanceObject.Target, openUIFormInfo.PauseCoveredUIForm, true, duration, openUIFormInfo.UserData, openUIFormInfo.IsFullScreen);

0 commit comments

Comments
 (0)