1、引言
我们在平常的开发中常常碰到列表类的数据处理!典型的像玩家列表这种可能数量非常庞大,可能有几百个!我们假设一次全部创建可能一下子就导致app安顿崩溃!下面我们带着问题一起分析。
2、问题分析
事实上我们我们在床架这些Item子节点的时候非常浪费性能,大量的Item导致手机内存不足而使得卡顿崩溃。我们在创建时,没有必要为每个成员创建一个专门的Item,只需要为可见部分创建铺满多1个的时候就可以了,一般这个数量不会太多!也就是:
实际创建数量 = content的高度 / 一个Item高度的高度 + 1
就可以了,在滚动的时候我们移动这些Item的位置,同时更新数据就可以了。好了分析完了,我们上代码了
3、代码部分
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
namespace Tools.UI
{
public class UIScrollControl : MonoBehaviour
{
#region property
//======控制组件
/// <summary>
/// 滑动框体 - UI组件
/// </summary>
private ScrollRect scroll_rect;
/// <summary>
/// 滑动条
/// </summary>
public Scrollbar scroll_bar;
//======逻辑数据
/// <summary>
/// 滑动子对象 - 列表
/// </summary>
private List<ScrollChild> all_child_list = new List<ScrollChild>();
/// <summary>
/// 总数目
/// </summary>
private int total_count;
/// <summary>
/// 当前下标
/// </summary>
private int cur_index;
/// <summary>
/// 内容位置
/// </summary>
private float start_content_pos;
/// <summary>
/// 滑动框高度
/// </summary>
private float rect_high;
/// <summary>
/// 起始滑动项位置
/// </summary>
private Vector2 start_scrollChild_pos;
/// <summary>
/// content初始大小
/// </summary>
private Vector2 start_content_size;
/// <summary>
/// 是否开始标识
/// </summary>
private bool is_start = false;
#endregion
#region 外部调用
/// <summary>
/// 打开控制
/// </summary>
/// <param name="_temp_obj"></param>
/// <param name="_total_count"></param>
/// <param name="_rect_high"></param>
/// <param name="_action"></param>
public void OpenControl(GameObject _temp_obj, int _total_count, float _rect_high,
System.Action<int, GameObject> _action = null)
{
if (is_start == false)
{
scroll_rect = transform.GetComponent<ScrollRect>();
if (scroll_rect == null || scroll_rect.content == null)
{
Debug.LogError("ScrollRect组件错误");
return;
}
start_content_size = scroll_rect.content.sizeDelta;
}
Clear();
float _show_area_high = start_content_size.y;
Vector2 _startPos = Vector2.zero;
float _heigh = Mathf.Max(_total_count * _rect_high, start_content_size.y);
_startPos = new Vector3(0, (start_content_size.y - _heigh) / 2, 0);
scroll_rect.content.sizeDelta = new Vector2(start_content_size.x, _heigh);
scroll_rect.content.localPosition = _startPos;
OpenControl(_temp_obj