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, _total_
内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅建议:此资源以Matlab仿真为核心,建议者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

对酒当歌﹏✍

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

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

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

打赏作者

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

抵扣说明:

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

余额充值