如何优化UGUI的ScrollRect

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何优化UGUI的ScrollRect相关的知识,希望对你有一定的参考价值。

1. 判定cell大小
LoopScrollRect要解决的核心问题是:如何计算每个元素的大小。这里我使用了Content Size Fitter配合Layout Element来控制每个cell的长宽,因此对于GridLayout直接取高度,否则取Preferred Height。需要注意的是,除了元素本身的大小之外,我们还要将padding考虑进去。

这个其实也是最核心的一个地方:在能够准确计算格子大小的基础上,后续工作就好实现了。

2. 如何优雅的增删元素
对于每个ScrollRect,其实只需要考虑在头部和尾部是否需要增加或者删除元素。在这里以头部的各种情况为例进行解释,因为在正向滑动情况下,必须保证在修改元素之后整个ScrollRect内容显示一致不跳变;这些情况比尾部处理会麻烦一些。

NewItemAtStart函数实现了在头部增加一个(或一行,针对GridLayout)元素,并返回这些元素的高度;DeleteItemAtStart代表删除头部的一个元素。需要注意的是,在修改头部元素之后要及时修改content的anchoredPosition,这样才能保证整个内容区域不会因为多了或者少了一行而产生跳变。

3. 何时需要增删元素
这里需要有两个概念viewBounds和contentBounds:前者是指ScrollRect本身的大小,一般也对应Mask;后者是指ScrollRect里所有cell组成的内容部分的大小。在这个基础上就简单了:如果contentBounds的最上面比viewBounds的最上面要低,那么尝试在顶部增加元素;如果contentBounds的最上面比viewBounds的最上面高很多,那么尝试删除元素。

4. 对象池交互
在新建cell和销毁cell的时候,使用对象池来避免内存碎片;同时这里使用了SendMessage来向每个cell发送必须的信息,保证数据的正确性。

5. 滚动条相关

这块我其实是估算的,根据当前的长度和当前元素个数/总个数按照比例缩放,这个在所有cell大小一致的情况下是没有问题的;但是如果大小不一致我就无法得到精确结果,所以会产生一定抖动。我暂时没有更好办法,因为得到的信息就是不够用。
参考技术A UGUI的ScrollRect在加载太多物体的时候,第一次弹出界面会非常卡顿,而且不在界面里的内容依然会参与绘制,导致毫无意义的浪费。笔者对此进行了一番研究本回答被提问者采纳

UGUI ScrollRect 代码定位

  在NGUI 的scrollview组建定位可以直接用value;但是在ugui上的scrollrect确实分的更细了分为 verticalNormallizedPosition 和HorizontalNormaliazedPozition 以及可以设置vector2的NormallizedPosition, 但是这里面有一个坑,实例化列表时要定位需要等待一帧ugui布局才能完成,需要做个协程在endofFrame执行

以上是关于如何优化UGUI的ScrollRect的主要内容,如果未能解决你的问题,请参考以下文章

ugui 拖拽组件 scrollrect 怎么实现自动停在子对象中心

UGUI ScrollRect 代码定位

unity UGUI动态滑动列表

unity3d UGUI怎么获取ScrollRect到组件

UGUI- 单列列表(VerticalLayoutGroup)

游戏开发实战Unity循环复用列表,支持不规则尺寸(对象池 | UGUI | ScrollRect | Demo源码)