【实用系列】3.x循环列表+分层渲染实现,解决item多drawcall高的问题

image 补充一张图

使用的版本是3.8.0

在numItems方法执行完后,设置下content的位置。他这个是等于提供了原理和示例,一些需求还是要自己去实现的

能以此demo给个示例吗?我重置了content的位置,貌似还是不行

这个可能要根据自己的需求来(单纯重置可能不行,因为此时的index和uuid的绑定关系错了),比如我的

        if (value < this._numItems) {
            this._contentUI.node.setPosition(0, 0);
            this._itemList.forEach((item, index) => {
                this._initItemPosition(item, index);
            });
        }

_initItemPosition(item, index){
        // TODO 重置位置
        item.setPosition(posX, posY);
        this._uuid2index[item.uuid] = index;
        this._index2node[index] = item;
}

我们是不改渲染,在ts层实现分层支持多平台,但是还没有实现循环列表

3.7.4 尝试把修改部分同步到原生部分,不太会写C++ 让ai帮忙翻译了一些,有什么不对的大佬们可以指点指点。
测试drawcall确实降了
修改如下:
Node.h 定义两个字段标记
image
Node.cpp 初始化字段(测试发现如果不初始化好像会渲染出错)
image

Batcher2d.h
image

Batcher2d.cpp
image
修改walk方法
image

然后在ts端
image
在jsb_scene_auto.cpp中通过jsb绑定setEnableLevelRender方法
image

1赞

__renderQueue 可以考虑使用map 替换掉vector
然后这个分层存在一个缺陷,如果mask 嵌套分层,遮罩是有问题的

image 这里其实也没必要每次自己清理,出了作用域自己清理效率反而高一些

同时 还有一个问题,当分层的子节点数量规模大于一定程度之后,合批就会失效了
image
原本设置的合批上限是144kb ,我手动改成了1440

确实遮罩会出问题,不怎么会写C++,只能先这样了,希望大佬能补充修改修改

修改了一个版本,修复了在mask 嵌套的情况下 遇见mask中断合批,mask 内部继续合批,出了mask 也继续合批,同时,允许跳过部分node 合批 ,修改引擎比较麻烦,使用 UI.prototype.walk = function ()的方式 直接覆盖了原本的batch2d.walk

能分享一下吗?谢谢!

涉及到的文件有点多,因为做了一些扩展 ,把功能做到组件里面了,包含编辑器的组件直接添加

mark.

确实存在这个问题,改了算法,可以从仓库中拉取
https://gitee.com/ccc_28/level-render.git

厉害了,我这按照你的改动,确实成功了,我在3.8.2中按照你这流程只改到了walk方法,就能成功了,后面的ts端和jsb_scene_auto.cpp并不需要修改。其实当初通过property覆盖引擎写法,这样就可以不用指定自定义引擎。结果后面原生端走c++的batcher。

mark~

(帖子被作者删除,如无标记将在 24 小时后自动删除)

image 为什么设置的是600高度,展示出来的只有293???image 没有太看懂是哪里更改了scrollview的整体高度