CocosCreator之分层管理的ListView

前言

进入公众号回复listview即可取得demo的git地址。

  1. 之前写的一篇文章《Creator之ScrollView那些事》中提到了官网Demo中提供的ListViewCtl,只是实现了纵向滑动,没有实现横向滑动。并且倡议官网能够把性能做全而后放入组件库中供开发者应用。
  2. 而后有个牛逼大神说这个ListView不ok。要我对本人的公众号内容负责。我还认为有什么重大的bug,其实是打断了合批操作。对于官网提供的ListViewCtr的操作形式必定会打断合批的 !不过对于一些简略的需要,比方我上次文章中的这个截图。


这样的列表须要合批吗?我的需要就是少创立几个节点就能够了。所以我感觉ok不ok还是要看需要吧!为什么tableview呼声那么高,而Laya也在官网组件中反对了ListView,曾经是很好的阐明了。

ListView的局限

  1. 首先,这个ListView是有局限的,它间接将Item放入了content中,必定会打断合批操作;


如果你有一个多列多行,并且item非常复杂的需要,那么用这个ListView必定是不适合的。就好比你用一把杀鸡的刀去杀一头牛,不喜剧才怪!所以大家在看到他人分享货色的时候倡议最好不要拿来主义,而是通过剖析后决定用还是不必,我置信作为程序猿,这点判断能力还是有的!

  1. 其次 ,这个ListView不反对网格显示。如果想要多行或者多列显示,须要本人在一个Item中排列好。而后本人设置每个道具的显示与暗藏,所以对于有多列显示需要的状况还是比较复杂的。

那么我先说说ListView采纳的原理,而后再说说如何改良吧。

ListView采纳的原理

  1. 依据可显示区域的宽或者高计算出须要创立的道具的数量。而后多加一行或者一列,防止滑动的时候显示不天然。

  1. 滑动时,将来到可见区域的道具放到与滑动方向相同的一端重复使用。

  1. 原理其实就这么两点,目标就是少创立节点。

反对网格显示的ListView——GridListView

  1. 首先我为之前的ListView减少了网格显示能力,代码中通过给定的spaceX和spaceY 联合可显示区域的宽或者高计算可显示的列数或者行数

  1. 如果只是做了网格显示能力而不做分层治理其实一样有局限1。尽管比你间接把道具放入content中好很多,然而dc仍然很高。

反对分层治理的ListView——GridLayerListView

  1. GridLayerListView 是继承了GridListView,重写了设置坐标和增加节点的办法。


  1. 这里的item仍然被增加到了content中,只是此时的它曾经没有子节点了,只是用来判断是否来到显示区域而存在的。
  2. 同时在增加item的时候给item自定义了一个LIST属性,用于保留子节点的援用,因为曾经不能通过item的children数组取得子节点了。
  3. 为每个子节点自定义一个属性INIT_POS,保留本地坐标,更新地位的时候会用到。

  1. 为了保障所有节点显示地位的正确性,代码中间接移除节点中存在的widget组件。

  1. 当你将一个ScrollView拖到界面上时,只须要调整ScrollView和view的宽高,代码中间接删除了默认的item节点

  1. GridLayerListView并没有应用对象池,如果的确有须要能够在getItem函数中本人通过对象池获取道具。

  1. 通过设置ScrollView的Horizontal 和 Vertical 扭转滚动方向,同时只反对一个方向滚动。

应用形式

  1. 将一个ScrollView拖到界面中,挂上GridLayerListView组件

  1. 定义一个解决逻辑的组件挂到界面上,并在逻辑组件中申明好应用的变量和函数,设置好GridLayerListView的参数。(其实跟ListViiew的应用形式是一样的)

  1. 设置ScrollView 和View 的宽高,留神尤其是View的宽高,因为View大小就是可见区域,代码中会依据View的宽高判断应该显示的列数或者行数。留神列数或者行数等于宽度或者高度/(item的宽度或者高度+横向间距或者纵向间距)

应用成果

为了看优化的成果,用到的两个纹理都去掉了Packable选项

  1. 不分层的GridListView dc=64


在不分层治理的状况下,道具中的label是否设置为Char模式dc都是一样的。

  1. 分层+Label不为Char模式 dc=23

  1. 分层+Label为Char模式 dc=9

  1. 道具的预制体构造

  1. 道具应用状况


依据后盾输入能够看出,一共有35个须要显示的道具,实际上只创立了3 x5 = 15个道具就搞定了。

  1. dc 从64 缩小到9,仍然用上了ListView少创立,反复利用的原理,只是加上分层管,达到了这样的成果,还算过得去吧。

结语

  1. 以上是我在之前的ListView根底上增加了网格显示,分层治理等能力后写进去的新组件,我给它起名叫GridLayerListView,是因为它是一个反对网格显示,分层治理节点的ListView。一个既能够杀鸡也能够杀牛的刀。就是对ListView情有独钟,没方法了。
  2. 我并没有说这个是最优的计划,也不保障没有bug(我还不是一个敢说本人写的货色没bug的牛人),思维仅供参考,大神能够绕道。如果你想将dc降到更低,那么你还须要做一些其余的优化。倡议浏览文弱书生陈皮皮的《Cocos Creator 性能优化:DrawCall》

进入公众号回复listview即可取得demo的git地址。

欢送扫码关注公众号《微笑游戏》,浏览更多内容。如果您感觉文章还能够,点赞、在看、分享、资助都是对我最大的激励,在下将感激不尽。

欢送扫码关注公众号《微笑游戏》,浏览更多内容。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理