unity UGUI 解决ScrollView加载大量Item导致卡顿的问题


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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对酒当歌﹏✍

您的鼓励是我写作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值