From 47233923032fde97975bc69480d52c2e1f96d92d Mon Sep 17 00:00:00 2001 From: Yuto Terada <66758394+yuto-trd@users.noreply.github.com> Date: Thu, 5 Dec 2024 13:55:35 +0900 Subject: [PATCH] fix: fixed possible memory leak code (#1190) --- src/Beutl.Engine/Graphics/Rendering/RenderLayer.cs | 12 ++++++++++-- src/Beutl.Engine/Graphics/Rendering/Renderer.cs | 1 + src/Beutl/ViewModels/PlayerViewModel.cs | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Beutl.Engine/Graphics/Rendering/RenderLayer.cs b/src/Beutl.Engine/Graphics/Rendering/RenderLayer.cs index 9c5b81104..588348f1f 100644 --- a/src/Beutl.Engine/Graphics/Rendering/RenderLayer.cs +++ b/src/Beutl.Engine/Graphics/Rendering/RenderLayer.cs @@ -139,7 +139,7 @@ void AcceptsAll(IGraphicNode node) supportCache.Accepts(cache); if (cache.IsCached && !(cache.CanCacheBoundary() - && cacheContext.CanCacheRecursiveChildrenOnly(node))) + && cacheContext.CanCacheRecursiveChildrenOnly(node))) { cache.Invalidate(); } @@ -171,7 +171,15 @@ public void Dispose() } _cache.Clear(); - _currentFrame?.Clear(); + if (_currentFrame != null) + { + foreach (Entry item in _currentFrame) + { + item.Dispose(); + } + + _currentFrame.Clear(); + } } public Drawable? HitTest(Point point) diff --git a/src/Beutl.Engine/Graphics/Rendering/Renderer.cs b/src/Beutl.Engine/Graphics/Rendering/Renderer.cs index a37ff9afd..a4cb31021 100644 --- a/src/Beutl.Engine/Graphics/Rendering/Renderer.cs +++ b/src/Beutl.Engine/Graphics/Rendering/Renderer.cs @@ -66,6 +66,7 @@ public void Dispose() OnDispose(true); _immediateCanvas.Dispose(); _cacheContext.Dispose(); + RenderScene.Dispose(); GC.SuppressFinalize(this); IsDisposed = true; diff --git a/src/Beutl/ViewModels/PlayerViewModel.cs b/src/Beutl/ViewModels/PlayerViewModel.cs index a46919ed1..69791719a 100644 --- a/src/Beutl/ViewModels/PlayerViewModel.cs +++ b/src/Beutl/ViewModels/PlayerViewModel.cs @@ -680,6 +680,7 @@ public void Dispose() AfterRendered.Dispose(); PreviewInvalidated = null; Scene = null!; + PreviewImage.Value = null!; _logger.LogInformation("Disposed PlayerViewModel. ({SceneId})", _editViewModel.SceneId); }