com.alicizax.unity.ui.exten.../Runtime/RecyclerView/ViewProvider/SimpleViewProvider.cs
陈思海 dc8c840d69 RecyclerView 大优化
优化RecycleView 渲染架构
优化RecyclerView 渲染性能 增加 缓存 异步
增加Navagation导航锚点相关
2026-03-31 15:18:50 +08:00

68 lines
2.1 KiB
C#

using System;
namespace AlicizaX.UI
{
public sealed class SimpleViewProvider : ViewProvider
{
private readonly ObjectPool<ViewHolder> objectPool;
public override string PoolStats =>
$"hits={objectPool.HitCount}, misses={objectPool.MissCount}, destroys={objectPool.DestroyCount}, active={objectPool.ActiveCount}, inactive={objectPool.InactiveCount}, peakActive={objectPool.PeakActive}, capacity={objectPool.MaxSize}";
public SimpleViewProvider(RecyclerView recyclerView, ViewHolder[] templates) : base(recyclerView, templates)
{
UnityComponentFactory<ViewHolder> factory = new(GetTemplate(), recyclerView.Content);
objectPool = new ObjectPool<ViewHolder>(factory, 0, 1);
}
public override ViewHolder GetTemplate(string viewName = "")
{
if (templates == null || templates.Length == 0)
{
throw new NullReferenceException("ViewProvider templates can not null or empty.");
}
return templates[0];
}
public override ViewHolder[] GetTemplates()
{
if (templates == null || templates.Length == 0)
{
throw new NullReferenceException("ViewProvider templates can not null or empty.");
}
return templates;
}
public override ViewHolder Allocate(string viewName)
{
var viewHolder = objectPool.Allocate();
viewHolder.gameObject.SetActive(true);
return viewHolder;
}
public override void Free(string viewName, ViewHolder viewHolder)
{
objectPool.Free(viewHolder);
}
public override void Reset()
{
Clear();
(Adapter as IItemRenderCacheOwner)?.ReleaseAllItemRenders();
objectPool.Dispose();
}
public override void PreparePool()
{
int warmCount = GetRecommendedWarmCount();
if (warmCount <= 0)
{
return;
}
objectPool.EnsureCapacity(warmCount);
objectPool.Warm(warmCount);
}
}
}