Files
art_test_main/Assets/Plugins/Easy performant outline/Scripts/RTHandlePool.cs

79 lines
2.0 KiB
C#
Raw Normal View History

2025-11-03 11:25:01 +08:00
using System;
using System.Collections.Generic;
using EPOOutline.Utility;
using UnityEngine;
using UnityEngine.Rendering;
namespace EPOOutline
{
public class RTHandlePool : IDisposable
{
private class PoolSegment : IDisposable
{
private List<RTHandle> allocated = new List<RTHandle>();
private Queue<RTHandle> free = new Queue<RTHandle>();
public RTHandle GetFree()
{
if (free.Count != 0)
return free.Dequeue();
var newCreated = OutlineEffect.HandleSystem.Alloc(new RenderTargetIdentifier());
allocated.Add(newCreated);
return newCreated;
}
public void ReleaseAll()
{
free.Clear();
foreach (var entry in allocated)
free.Enqueue(entry);
}
public void Dispose()
{
foreach (var entry in allocated)
{
#if !UNITY_6000_0_OR_NEWER
RTHandleUtility.RemoveDelegates(entry);
#endif
entry.Release();
}
allocated.Clear();
free.Clear();
}
}
private readonly PoolSegment textureSegment = new PoolSegment();
private readonly PoolSegment rtiSegment = new PoolSegment();
public RTHandle Allocate(Texture target)
{
var entry = textureSegment.GetFree();
entry.SetTexture(target);
return entry;
}
public RTHandle Allocate(RenderTargetIdentifier target)
{
var entry = rtiSegment.GetFree();
entry.SetRenderTargetIdentifier(target);
return entry;
}
public void ReleaseAll()
{
textureSegment.ReleaseAll();
rtiSegment.ReleaseAll();
}
public void Dispose()
{
textureSegment.Dispose();
rtiSegment.Dispose();
}
}
}