前言
进入公众号回复listview即可取得demo的git地址。
- 之前写的一篇文章《Creator之ScrollView那些事》中提到了官网Demo中提供的ListViewCtl,只是实现了纵向滑动,没有实现横向滑动。并且倡议官网能够把性能做全而后放入组件库中供开发者应用。
- 而后有个牛逼大神说这个ListView不ok。要我对本人的公众号内容负责。我还认为有什么重大的bug,其实是打断了合批操作。对于官网提供的ListViewCtr的操作形式必定会打断合批的 !不过对于一些简略的需要,比方我上次文章中的这个截图。
这样的列表须要合批吗?我的需要就是少创立几个节点就能够了。所以我感觉ok不ok还是要看需要吧!为什么tableview呼声那么高,而Laya也在官网组件中反对了ListView,曾经是很好的阐明了。
ListView的局限
- 首先,这个ListView是有局限的,它间接将Item放入了content中,必定会打断合批操作;
如果你有一个多列多行,并且item非常复杂的需要,那么用这个ListView必定是不适合的。就好比你用一把杀鸡的刀去杀一头牛,不喜剧才怪!所以大家在看到他人分享货色的时候倡议最好不要拿来主义,而是通过剖析后决定用还是不必,我置信作为程序猿,这点判断能力还是有的!
- 其次 ,这个ListView不反对网格显示。如果想要多行或者多列显示,须要本人在一个Item中排列好。而后本人设置每个道具的显示与暗藏,所以对于有多列显示需要的状况还是比较复杂的。
那么我先说说ListView采纳的原理,而后再说说如何改良吧。
ListView采纳的原理
- 依据可显示区域的宽或者高计算出须要创立的道具的数量。而后多加一行或者一列,防止滑动的时候显示不天然。
- 滑动时,将来到可见区域的道具放到与滑动方向相同的一端重复使用。
- 原理其实就这么两点,目标就是少创立节点。
反对网格显示的ListView——GridListView
- 首先我为之前的ListView减少了网格显示能力,代码中通过给定的spaceX和spaceY 联合可显示区域的宽或者高计算可显示的列数或者行数
- 如果只是做了网格显示能力而不做分层治理其实一样有局限1。尽管比你间接把道具放入content中好很多,然而dc仍然很高。
反对分层治理的ListView——GridLayerListView
- GridLayerListView 是继承了GridListView,重写了设置坐标和增加节点的办法。
- 这里的item仍然被增加到了content中,只是此时的它曾经没有子节点了,只是用来判断是否来到显示区域而存在的。
- 同时在增加item的时候给item自定义了一个LIST属性,用于保留子节点的援用,因为曾经不能通过item的children数组取得子节点了。
- 为每个子节点自定义一个属性INIT_POS,保留本地坐标,更新地位的时候会用到。
- 为了保障所有节点显示地位的正确性,代码中间接移除节点中存在的widget组件。
- 当你将一个ScrollView拖到界面上时,只须要调整ScrollView和view的宽高,代码中间接删除了默认的item节点
- GridLayerListView并没有应用对象池,如果的确有须要能够在getItem函数中本人通过对象池获取道具。
- 通过设置ScrollView的Horizontal 和 Vertical 扭转滚动方向,同时只反对一个方向滚动。
应用形式
- 将一个ScrollView拖到界面中,挂上GridLayerListView组件
- 定义一个解决逻辑的组件挂到界面上,并在逻辑组件中申明好应用的变量和函数,设置好GridLayerListView的参数。(其实跟ListViiew的应用形式是一样的)
- 设置ScrollView 和View 的宽高,留神尤其是View的宽高,因为View大小就是可见区域,代码中会依据View的宽高判断应该显示的列数或者行数。留神列数或者行数等于宽度或者高度/(item的宽度或者高度+横向间距或者纵向间距)
应用成果
为了看优化的成果,用到的两个纹理都去掉了Packable选项
- 不分层的GridListView dc=64
在不分层治理的状况下,道具中的label是否设置为Char模式dc都是一样的。
- 分层+Label不为Char模式 dc=23
- 分层+Label为Char模式 dc=9
- 道具的预制体构造
- 道具应用状况
依据后盾输入能够看出,一共有35个须要显示的道具,实际上只创立了3 x5 = 15个道具就搞定了。
- dc 从64 缩小到9,仍然用上了ListView少创立,反复利用的原理,只是加上分层管,达到了这样的成果,还算过得去吧。
结语
- 以上是我在之前的ListView根底上增加了网格显示,分层治理等能力后写进去的新组件,我给它起名叫GridLayerListView,是因为它是一个反对网格显示,分层治理节点的ListView。一个既能够杀鸡也能够杀牛的刀。就是对ListView情有独钟,没方法了。
- 我并没有说这个是最优的计划,也不保障没有bug(我还不是一个敢说本人写的货色没bug的牛人),思维仅供参考,大神能够绕道。如果你想将dc降到更低,那么你还须要做一些其余的优化。倡议浏览文弱书生陈皮皮的《Cocos Creator 性能优化:DrawCall》
进入公众号回复listview即可取得demo的git地址。
欢送扫码关注公众号《微笑游戏》,浏览更多内容。如果您感觉文章还能够,点赞、在看、分享、资助都是对我最大的激励,在下将感激不尽。
欢送扫码关注公众号《微笑游戏》,浏览更多内容。
发表回复