From e93f4f09bb4e08422f2f015231b28805d04882e2 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Mon, 6 Mar 2023 11:14:05 -0800 Subject: [PATCH] graphics resource tracking optimization --- src/Graphics/GraphicsDevice.cs | 7 +++---- src/Graphics/GraphicsResource.cs | 12 ++++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/Graphics/GraphicsDevice.cs b/src/Graphics/GraphicsDevice.cs index f821a6d..c1057d6 100644 --- a/src/Graphics/GraphicsDevice.cs +++ b/src/Graphics/GraphicsDevice.cs @@ -18,7 +18,7 @@ namespace MoonWorks.Graphics public bool IsDisposed { get; private set; } - private readonly List> resources = new List>(); + private readonly HashSet> resources = new HashSet>(); public GraphicsDevice( Backend preferredBackend, @@ -237,10 +237,9 @@ namespace MoonWorks.Graphics { lock (resources) { - for (var i = resources.Count - 1; i >= 0; i--) + foreach (var weakReference in resources) { - var resource = resources[i]; - if (resource.TryGetTarget(out var target)) + if (weakReference.TryGetTarget(out var target)) { target.Dispose(); } diff --git a/src/Graphics/GraphicsResource.cs b/src/Graphics/GraphicsResource.cs index 2e68546..0819a63 100644 --- a/src/Graphics/GraphicsResource.cs +++ b/src/Graphics/GraphicsResource.cs @@ -10,7 +10,7 @@ namespace MoonWorks.Graphics public bool IsDisposed { get; private set; } protected abstract Action QueueDestroyFunction { get; } - private WeakReference selfReference; + internal WeakReference weakReference; public GraphicsResource(GraphicsDevice device, bool trackResource = true) { @@ -18,8 +18,8 @@ namespace MoonWorks.Graphics if (trackResource) { - selfReference = new WeakReference(this); - Device.AddResourceReference(selfReference); + weakReference = new WeakReference(this); + Device.AddResourceReference(weakReference); } } @@ -27,11 +27,11 @@ namespace MoonWorks.Graphics { if (!IsDisposed) { - if (selfReference != null) + if (weakReference != null) { QueueDestroyFunction(Device.Handle, Handle); - Device.RemoveResourceReference(selfReference); - selfReference = null; + Device.RemoveResourceReference(weakReference); + weakReference = null; } IsDisposed = true;