Forest_Client/Forest/Assets/PhxhSDK/Phxh/Pools/Texture2DPool.cs

94 lines
2.8 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace PhxhSDK
{
public class Texture2DPool : Singlenton<Texture2DPool>
{
private const int cachedTime = 5;
private const int maxCached = 6;
private readonly Dictionary<string, Queue<TextureInfo>> _texturePool = new();
private float _currentTime;
public Texture2D CreateTexture(string name, int width = -1, int height = -1)
{
if (width > 0 && height > 0)
{
var key = _GenKey(width, height);
if (_texturePool.TryGetValue(key, out var textures))
if (textures != null && textures.Count > 0)
{
var texInfo = textures.Dequeue();
return texInfo.tex;
}
}
var tex = new Texture2D(2, 2);
tex.name = name;
return tex;
}
public void DestroyTexture(Texture2D texture2D)
{
if (texture2D != null)
{
var key = _GenKey(texture2D.width, texture2D.height);
Queue<TextureInfo> textureInfos = null;
if (!_texturePool.TryGetValue(key, out textureInfos) || textureInfos == null)
{
textureInfos = new Queue<TextureInfo>();
_texturePool.Add(key, textureInfos);
}
if (textureInfos.Count < maxCached)
textureInfos.Enqueue(new TextureInfo { cacheTime = Time.time, tex = texture2D });
}
}
private string _GenKey(int width, int height)
{
return $"{width}_{height}";
}
public void Update(float deltaTime)
{
_currentTime += deltaTime;
if (_currentTime >= 1f)
{
_currentTime = 0;
_ClearOldCache();
}
}
private void _ClearOldCache()
{
var e = _texturePool.GetEnumerator();
var currentTime = Time.time;
while (e.MoveNext())
{
var textureInfos = e.Current.Value;
if (textureInfos != null && textureInfos.Count > 0)
{
var textureInfo = textureInfos.Peek();
while (currentTime - textureInfo.cacheTime >= cachedTime)
{
textureInfos.Dequeue();
if (textureInfos.Count > 0)
textureInfo = textureInfos.Peek();
else
break;
}
}
}
}
private class TextureInfo
{
public float cacheTime;
public Texture2D tex;
}
}
}