Files
Main/Assets/Launcher/ExternalLibs/NGUI/Scripts/Internal/CachedGeometries.cs
2025-01-25 04:38:09 +08:00

102 lines
3.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}