diff options
author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2019-12-31 16:18:11 -0500 |
---|---|---|
committer | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2019-12-31 16:18:11 -0500 |
commit | dca60f42b2048d6b0b27517b9e7686665e61e9c2 (patch) | |
tree | a212a2aebb137e96e43bc4c7a0aaf287b434d812 /src/SMAPI/Framework | |
parent | d9a9cef172be8c34b57e345732bf4e582898bcbc (diff) | |
download | SMAPI-dca60f42b2048d6b0b27517b9e7686665e61e9c2.tar.gz SMAPI-dca60f42b2048d6b0b27517b9e7686665e61e9c2.tar.bz2 SMAPI-dca60f42b2048d6b0b27517b9e7686665e61e9c2.zip |
fix XNA keeping loaded assets alive forever (#685)
Diffstat (limited to 'src/SMAPI/Framework')
-rw-r--r-- | src/SMAPI/Framework/ContentManagers/BaseContentManager.cs | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs b/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs index 41ce7c37..36f2f650 100644 --- a/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs +++ b/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs @@ -41,6 +41,10 @@ namespace StardewModdingAPI.Framework.ContentManagers /// <summary>A list of disposable assets.</summary> private readonly List<WeakReference<IDisposable>> Disposables = new List<WeakReference<IDisposable>>(); + /// <summary>The disposable assets tracked by the base content manager.</summary> + /// <remarks>This should be kept empty to avoid keeping disposable assets referenced forever, which prevents garbage collection when they're unused. Disposable assets are tracked by <see cref="Disposables"/> instead, which avoids a hard reference.</remarks> + private readonly List<IDisposable> BaseDisposableReferences; + /********* ** Accessors @@ -84,6 +88,7 @@ namespace StardewModdingAPI.Framework.ContentManagers // get asset data this.LanguageCodes = this.GetKeyLocales().ToDictionary(p => p.Value, p => p.Key, StringComparer.InvariantCultureIgnoreCase); + this.BaseDisposableReferences = reflection.GetField<List<IDisposable>>(this, "disposableAssets").GetValue(); } /// <summary>Load an asset that has been processed by the content pipeline.</summary> @@ -276,6 +281,9 @@ namespace StardewModdingAPI.Framework.ContentManagers assetName = this.AssertAndNormalizeAssetName(assetName); this.Cache[assetName] = value; } + + // avoid hard disposable references; see remarks on the field + this.BaseDisposableReferences.Clear(); } /// <summary>Parse a cache key into its component parts.</summary> |