/// <summary> /// Recycles unused resource with the specified recycle policy. /// </summary> /// <param name="recyclePolicy">The recycle policy.</param> /// <exception cref="System.ArgumentNullException">recyclePolicy</exception> public void Recycle(GraphicsResourceRecyclePolicyDelegate recyclePolicy) { if (recyclePolicy == null) { throw new ArgumentNullException("recyclePolicy"); } // Global lock to be threadsafe. lock (thisLock) { Recycle(textureCache, recyclePolicy); Recycle(bufferCache, recyclePolicy); } }
/// <summary> /// Recycles the specified cache. /// </summary> /// <typeparam name="TKey">The type of the t key.</typeparam> /// <param name="cache">The cache.</param> /// <param name="recyclePolicy">The recycle policy.</param> private void Recycle <TKey>(Dictionary <TKey, List <GraphicsResourceLink> > cache, GraphicsResourceRecyclePolicyDelegate recyclePolicy) { foreach (var resourceList in cache.Values) { for (int i = resourceList.Count - 1; i >= 0; i--) { var resourceLink = resourceList[i]; if (resourceLink.ReferenceCount == 0) { if (recyclePolicy(resourceLink)) { resourceLink.Resource.Dispose(); resourceList.RemoveAt(i); } // Reset the access count resourceLink.AccessCountSinceLastRecycle = 0; } } } }