Files
Main/Assets/Launcher/ExternalLibs/NGUI/Scripts/Internal/CachedGeometries.cs

102 lines
3.2 KiB
C#
Raw Permalink Normal View History

2025-01-25 04:38:09 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 针对UIWidget UIGeometry 数据buffer缓存
/// </summary>
public static class CachedGeometries
{
#region//私有变量
//UV
private static Dictionary<int, BetterList<BetterList<Vector2>>> cachedListsOfVector2List = new Dictionary<int, BetterList<BetterList<Vector2>>>();
//顶点
private static Dictionary<int, BetterList<BetterList<Vector3>>> cachedListsOfVector3List = new Dictionary<int, BetterList<BetterList<Vector3>>>();
//颜色
private static Dictionary<int, BetterList<BetterList<Color32>>> cachedListsOfColorList = new Dictionary<int, BetterList<BetterList<Color32>>>();
//总缓存大小
private static int allCacheSize = 0;
//未使用的缓存大小
private static int unUseCacheSize = 0;
#endregion
#region//公有函数
public static void Free(BetterList<Vector3> verts)
{
Free(cachedListsOfVector3List, verts, 12);
}
public static void Free(BetterList<Vector2> verts)
{
Free(cachedListsOfVector2List, verts, 8);
}
public static void Free(BetterList<Color32> cols)
{
Free(cachedListsOfColorList, cols, 16);
}
public static void Get(int count, ref BetterList<Vector3> verts)
{
Get(count, cachedListsOfVector3List, ref verts, 12);
}
public static void Get(int count, ref BetterList<Vector2> verts)
{
Get(count, cachedListsOfVector2List, ref verts, 8);
}
public static void Get(int count, ref BetterList<Color32> cols)
{
Get(count, cachedListsOfColorList, ref cols, 16);
}
public static void PrintInfo()
{
Debug.LogErrorFormat("NGUI Cacahe InfoUsed {0}, Unused {1}, AllCache {2}", allCacheSize - unUseCacheSize, unUseCacheSize, allCacheSize);
}
#endregion
#region//私有函数
private static int FormatCount(int vecCount)
{
if (vecCount > 0 && vecCount % 32 == 0)
{
return vecCount;
}
else
{
return (vecCount / 32 + 1) * 32;
}
}
private static void Free<T>(Dictionary<int, BetterList<BetterList<T>>> cache, BetterList<T> source, int size)
{
if (source == null || source.buffer == null)
return;
var count = FormatCount(source.buffer.Length);
BetterList<BetterList<T>> list = null;
if (!cache.TryGetValue(count, out list))
{
list = new BetterList<BetterList<T>>();
cache.Add(count, list);
}
unUseCacheSize += count * size;
list.Add(source);
}
private static void Get<T>(int vertexCount, Dictionary<int, BetterList<BetterList<T>>> cache, ref BetterList<T> source, int size)
{
var count = FormatCount(vertexCount);
BetterList<BetterList<T>> list = null;
if (cache.TryGetValue(count, out list) && list.size > 0)
{
source = list[list.size - 1];
source.Clear();
list.RemoveAt(list.size - 1);
unUseCacheSize -= count * size;
}
else
{
allCacheSize += count * size;
source = new BetterList<T>(count);
}
}
#endregion
}