新年礼物,根据论坛前辈经验改造的简单易用draw call优化组件


首先感谢大大的思路,
拖了了这么久终于我把缩放的bug的改了(orz)
也陆陆续续在论坛看了很多前辈的优化经验,直接上干货
引擎是2.2.x版本
创建100个item

优化后

变成了8(label相关的有段自动处理逻辑,一般不需要自己分配层级了哈)
DEMO+组件
DrawCallDemo.zip (762.5 KB)
当然list结合

这位大大的组件会更好哈
祝大家新年快乐,觉得喜欢的不妨给我点个赞呀!
注意:
因为原生渲染走的另外的逻辑,所以把ExtendRenderFlow,js的代码用if (!cc.sys.isNative)包起来(ps:虽然把jsb-engine.js下面重写渲染的代码粘到下面也能解决原生报错,但没必要不是吗:joy:

12赞

同时调整了定制引擎实现功能,为覆写引擎文件实现,方便以后升级引擎用,也方便使用微信引擎插件

如果有写的不好的地方麻烦论坛的大大指点一下,感激不尽

mask

这个报错有影响么

这个不错,支持

这个是那个creator.d.ts没有申明哈,不影响运行,看不顺眼就点那个快速修复,编辑器会自动申明

有没有老哥体验完了,跟我说一下感想,有什么需要改进的吗?:joy:

打包安卓报错了

01-03 10:20:28.483 1898 1948 D jswrapper: JS: LoadScene 0ahsh1RupCKpw6znpbqyMG: 7194.749ms
01-03 10:20:28.484 1898 1948 E jswrapper: ERROR: Uncaught TypeError: cc.RenderFlow.register is not a function, location: jsb-adapter/jsb-engine.js:0:0
01-03 10:20:28.484 1898 1948 E jswrapper: STACK:
01-03 10:20:28.484 1898 1948 E jswrapper: [0]anonymous@jsb-adapter/jsb-engine.js:5033
01-03 10:20:28.484 1898 1948 E jswrapper: [1]30.d._update3DFunction@src/cocos2d-jsb.9961b.js:6546
01-03 10:20:28.484 1898 1948 E jswrapper: [2]30.d._upgrade_1x_to_2x@src/cocos2d-jsb.9961b.js:6532
01-03 10:20:28.484 1898 1948 E jswrapper: [3]_onBatchCreated@src/cocos2d-jsb.9961b.js:9071
01-03 10:20:28.484 1898 1948 E jswrapper: [4]_load@src/cocos2d-jsb.9961b.js:9945
01-03 10:20:28.484 1898 1948 E jswrapper: [5]runSceneImmediate@src/cocos2d-jsb.9961b.js:7937
01-03 10:20:28.484 1898 1948 E jswrapper: [6]anonymous@src/cocos2d-jsb.9961b.js:8036
01-03 10:20:28.484 1898 1948 E jswrapper: [7]anonymous@src/cocos2d-jsb.9961b.js:26613
01-03 10:20:28.484 1898 1948 E jswrapper: [8]anonymous@src/cocos2d-jsb.9961b.js:21815
01-03 10:20:28.484 1898 1948 E jswrapper: [9]anonymous@src/cocos2d-jsb.9961b.js:30551
01-03 10:20:28.484 1898 1948 E jswrapper: [10]fireTimeout@jsb-adapter/jsb-builtin.js:2038
01-03 10:20:28.484 1898 1948 E jswrapper: [11]tick@jsb-adapter/jsb-builtin.js:2000
01-03 10:20:28.484 1898 1948 E jswrapper: [ERROR] (C:/CocosCreator_2.2.2/resources/cocos2d-x/cocos/scripting/js-bindings/jswrapper/v8/Object.cpp, 562): Invoking function (0x7ec33d3fa0) failed!

安卓的好像是编译的二进制文件,可能覆写不得行,你在组件上加个
if (!cc.sys.isNative)
过滤一下,原生就不开启功能了,反正原生drawCall高点也不卡

厉害了:smiley:

刚才打包试了一下,解决了这个问题又有新的问题,我觉得应该是原生调的底层文件和H5的不一样,原生还是屏蔽掉吧:joy:

mark一哈~

mark,并等待原生的终极优化大法。
PS:谁说原生不看draw call的,玩家卡了照样喷:joy:

找了一下,原生的渲染是在jsb-engine.js 最后面 这一段实现的,所以原生这个组件用不了,因为渲染都不走上面覆写的代码了

var RenderFlow = cc.RenderFlow;

RenderFlow.FLAG_REORDER_CHILDREN = 1 << 29;
RenderFlow.FLAG_WORLD_TRANSFORM_CHANGED = 1 << 30;
RenderFlow.FLAG_OPACITY_CHANGED = 1 << 31;

var _dirtyTargets = [];
var _dirtyWaiting = [];
var _rendering = false;

var director = cc.director;
RenderFlow.render = function (scene) {
    _rendering = true;

    for (var i = 0, l = _dirtyTargets.length; i < l; i++) {
        var node = _dirtyTargets[i];
        node._inRenderList = false;

        var comp = node._renderComponent;
        if (!comp) continue;
        var assembler = comp._assembler;
        if (!assembler) continue;

        var flag = node._dirtyPtr[0];

        if (flag & RenderFlow.FLAG_UPDATE_RENDER_DATA) {
            node._dirtyPtr[0] &= ~RenderFlow.FLAG_UPDATE_RENDER_DATA;
            assembler._updateRenderData && assembler._updateRenderData();
        }
        if (flag & RenderFlow.FLAG_COLOR) {
            node._dirtyPtr[0] &= ~RenderFlow.FLAG_COLOR;
            comp._updateColor && comp._updateColor();
        }
    }

    _dirtyTargets.length = 0;

    this._nativeFlow.render(scene._proxy, director._deltaTime);

    _dirtyTargets = _dirtyWaiting.slice(0);
    _dirtyWaiting.length = 0;

    _rendering = false;
};

RenderFlow.init = function (nativeFlow) {
    cc.EventTarget.call(this);
    this._nativeFlow = nativeFlow;
};

RenderFlow.register = function (target) {
    if (target._inRenderList) return;

    if (_rendering) {
        _dirtyWaiting.push(target);
    } else {
        _dirtyTargets.push(target);
    }

    target._inRenderList = true;
};

@wercfz
@hx947621385

ojbk

:3:

@503722728 我试了一下,发现子节点的位置变动并不会生效,是什么问题呢,奇怪的是文本是可以的,但sprite就不行,比如对子节点做tween操作,渲染出来是不动的

tween 会出问题,tween的时候调整成每帧刷新或者 改用chile渲染,或者animation组件来动画都可以解决

mark !