[噼里啪啦]虚拟列表+渲染合批,通用不改引擎,支持2.4.x和3.8.x,开源且简单

虚拟列表部分我基于一下帖子的来做的:V7投稿|做一个小白也能用明白的节点循环列表优化DC
这次我主要写的是关于分层渲染的事情,因为上一个帖子用到了空节点的方式,所以我就想着能不能把这个方法发扬光大,毕竟这是真的多端通用不用改引擎啊。
先看效果,没有优化前:


打开分层优化后:

直接从33到3个dc。

gitee链接地址:LayeredVirtualList : 虚拟列表,控件渲染节点可分层 后续如有更新直接在这里找哦,喜欢就点个赞吧:+1:

主要的使用方式和代码就在这里了

实现方式:
1.给一个渲染节点A(例如label和sprite,是可以支持所有渲染类型的节点的)挂在一个脚本RenderAlternative。
2.RenderAlternative里面的init方法会复制渲染节点并附加在新建的节点B并使节点B的渲染表现和A保持一致,并删除节点A的渲染组件使其成为“数据节点”(乱取的名字)
3.RenderAlternative上有两个参数,一个是挂载的父节点,一个是在父节点的zindex。通过这个可以让同一类的渲染的节点在同一批渲染,而且即便同一批也会继承在原有渲染节点A在列表里面的顺序渲染哦。
4.如果节点A的父节点也有RenderAlternative,则zIndex会叠加在父节点上进行渲染,保证原有的次序不会被打乱。

6.27 更新啦,代理渲染已经基本稳定,上面的2问题已经被处理掉啦,可以正常继承透明度了

6.28 又更新啦。新增列表释放,动态添加数据,动态插入数据,动态删除数据方法(增删改都会反映到显示哦)

6.29 又又更新啦 新增了3.8的适配版本哦~已测试能运行,但是因为node没有zindex了,所以层级各位需要用代理脚本里面的zindex属性来微调哦

7.1. 又又又更新啦! 2.x版本新增了循环利用itemCell的功能,也就是说数据量1000的时候也不用真的生成1000个itemCell啦,只要在初始化的时候传入 最大的itemCell数量即可自动进行循环利用,当然最大数量是(可视item数量*2)+2,这个值可以适当调大保证数量够用,目前只适配了竖向的循环利用,横向的滚动目前还不支持循环利用哦~很快会加上的~,2.x稳定后也会同步写到3.x上面去

7.2 又又又又更新啦

  1. 2.x和3.x版本的代理生成方式统一化,均支持所有的渲染组件啦。
  2. 并且2.x昨天更新的循环利用功能是不支持增删插入操作的,目前已经兼容啦。
  3. 因为目前循环利用cell的功能只有竖向支持,并且没有做大量测试,如果循环利用功能有BUG的话可以选择先不使用哦,只要初始化不传入参数即可不使用循环利用哦。

7.3 又又又又又更新啦
1.调整了2.x和3.x的代理渲染的刷新方式,避免出现渲染残留问题
2. 2.x版本目前的循环cell功能基本完善,可支持单行单列的竖向和横向滚动,至于为什么只支持单行单列,因为多行多列的计算成本太高,聪明的小伙伴们都会把一行有多个或者一列有多个做成一个cell的对吧 :joy:
3.x的循环cell功能还在路上,毕竟循环cell能解决大家诟病的节点多了的问题

7.9 又又又又又又更新啦 这次鸽了太久啦

  1. 3.x已经更新了循环cell的功能啦~~
  2. 3.x优化了showNode的结构

7.12 修复了3.x版本的分层排序问题,使其与2.x的zindex保持一致

7.16 又又又又又又又更新啦

  1. 修复了3.x版本的uiopacity的透明度继承。
  2. 调整了虚拟列表的脚本结构。
  3. showNode基类的变量以及子节点代理脚本将自动进行初始化

7.29 又又又又又又又又更新啦

  1. 将2.4.x版本同步到最新功能。
  2. 修复3.8.x版本可能出现的快速滑动的bug。
  3. 修复自动启动代理节点不会处理子节点下子节点的问题
  4. 修复代理脚本中sIndex无效的问题。
  5. 精简代码结构。

存在的问题:

  1. 开启cell循环后,只支持单行单列(不过可以通过将多个做成一个cell解决99%的问题);
  2. 被代理节点a相对父级以及祖级有旋转值时,a的父级以及祖籍不能出现scaleX和scaleY不一致的情况,被代理节点本身没有这个限制。

在这里解答部分疑惑
1.开启渲染分层代理之后被代理的节点的父级位移,旋转,缩放会不会导致代理节点和被代理节点的表现不同 。
答:并不会,代理节点每一帧都是直接获取世界矩阵里面的参数来进行位置大小缩放的变化,所以会一直保持一致,唯一不一致的情况也只有上面的 问题2。

2.插入和删除会不会有性能消耗
答:基本没消耗,不会进行全部更新或者全部重新生成的操作。

3.修改代理节点的参数会不会很麻烦?例如改sprite的图片或者改label的stirng。
答:不会,代理后脚本绑定的变量会被proxy替代原有变量,就按原来的方式做即可。

4.渲染分层的脚本除了这列表能用,别的地方能用吗
答:可以,界面的dc优化同样可以用或者割草游戏的小怪身上的挂件,都可以通过这个来进行dc优化。

40赞

牛批,这个思路比之前那种渲染前改一遍节点结构的好多了!

:blush: 也没有那么好啦,哈哈哈

markmark

3.8也搞起来啊,2.4的人现在用的人越来越少了.

1赞

其实改3.8也好改的,我后面再改一版吧

使用cc.instantiate来复制会不会好些

我之前用的就是cc.instantiate,会出问题,因为会有子节点一起被拷贝过来,考虑到频繁的进行拷贝和移除子节点的性能消耗,我选择自己复制一下属性,你也可以用instantiate,复制后只要把子节点都destroy就行



这里是不是少了两个true

Mask!

思路不错.

没错,哈哈哈哈哈

大佬,见笑了 :blush:

mark 等个3.8后续

这个感觉是个新思路:call_me_hand::call_me_hand::call_me_hand:

更新啦~~~目前已经BUG应该修的差不多了,下周准备3.8版本的适配啦~

坐等3.8版本,加油~~~

我已经肝肝肝,肝出来啦~~哈哈哈,3.8适配版本,直接gitee拉取即可哦

感谢分享~~

Mark!!!