【分享】利用PostRender实现分层合批渲染(附 Demo 和引擎源码解读)

等一个官方回复,多摄像头能否实现分层合批 @jare。好多小伙伴试了都不行。

同样试了不行

关注结果中~

大佬,在CocosDashboard中下载到的各种2.3.x版本中drawcall都不会减少。请问大佬这是bug还是已经没这功能了?如果只是暂时的bug,我就不修改代码等大佬们修复。不然就得修改实现了:joy:

如果你用的是散图那么开启动态合批那么在native 和小游戏平台需要自己主动强制开启合批功能

我自己试了一下也没有效果,难道是我的姿势不对尴尬:innocent:

多camera有没有额外消耗。
creator我没有发现问题。

我在2dx里面明显感觉到新增camera掉帧严重。
只针对你发的这话做一点请教……

当我没说过吧哈哈,camera 目前起不到优化作用。

1赞

嗯,确实不行

感谢大佬分享

我什么的OK,就Mask不起效

_proto._children = function (node) {

if ( node._platRender ) {
    return this._next._func(node);
}

let cullingMask = _cullingMask;
let batcher = _batcher;

let parentOpacity = batcher.parentOpacity;
let opacity = (batcher.parentOpacity *= (node._opacity / 255));

let worldTransformFlag = batcher.worldMatDirty ? WORLD_TRANSFORM : 0;
let worldOpacityFlag = batcher.parentOpacityDirty ? OPACITY_COLOR : 0;
let worldDirtyFlag = worldTransformFlag | worldOpacityFlag;

if ( node._parentFlatRender )
{
    let children = node.allChildren();
    for (let i = 0, l = children.length; i < l; i++) {
        let c = children[i];

        // Advance the modification of the flag to avoid node attribute modification is invalid when opacity === 0.
        c._renderFlag |= worldDirtyFlag;
        if (!c._activeInHierarchy || c._opacity === 0) continue;

        if(c.childrenCount > 0) {
            c._renderFlag &= ~CHILDREN;
        }

        _cullingMask = c._cullingMask = c.groupIndex === 0 ? cullingMask : 1 << c.groupIndex;

        // TODO: Maybe has better way to implement cascade opacity
        let colorVal = c._color._val;
        c._color._fastSetA(c._opacity * opacity);
        flows[c._renderFlag]._func(c);
        c._color._val = colorVal;

        if(c.childrenCount > 0) {
            c._renderFlag |= CHILDREN;
        }
    }
}
else
{
    let children = node._children;
    for (let i = 0, l = children.length; i < l; i++) {
        let c = children[i];

        // Advance the modification of the flag to avoid node attribute modification is invalid when opacity === 0.
        c._renderFlag |= worldDirtyFlag;
        if (!c._activeInHierarchy || c._opacity === 0) continue;

        _cullingMask = c._cullingMask = c.groupIndex === 0 ? cullingMask : 1 << c.groupIndex;

        // TODO: Maybe has better way to implement cascade opacity
        let colorVal = c._color._val;
        c._color._fastSetA(c._opacity * opacity);
        flows[c._renderFlag]._func(c);
        c._color._val = colorVal;
    }

    batcher.parentOpacity = parentOpacity;
}

this._next._func(node);

};

1赞

有什么招数

mask如果在组件内部,是没法处理的。因为mask是依赖自身的render/postRender实现stencil test,对其子节点做遮罩,不适合分层渲染场景。

mask如果在组件外部,理论上不会影响效果。

2赞

感觉能关注这个问题的都是爱学习的好同学哈哈,我在这发个招聘广告,独立工作室招人,已经和头条、B站展开合作,资金充沛,潜力巨大,工作氛围好,福利佳,关键是双休哦…(哈哈作为游戏公司双休竟然也是亮点了),项目为重度二次元卡牌类。
现有职位两名:
中级creator工程师(25k-30k)
职责:城建、世界大地图等复杂系统开发,sdk接入等,有较强的性能意识,对工作质量有较高追求,良好的自驱性

高级(资深)creator工程师(30k-35k)
职责:creator引擎优化、定制、升级,要求对引擎有深入了解,精通引擎底层原理,优化开发工具链,提高开发效率,进行突破性技术调研,从技术角度提高游戏品质,提高表现上限

地点:北京中关村知春路附近

以上只是大概基本情况,求贤若渴,有意者速速联系:1ob_vxn5rvr58b@dingtalk.com

3赞

native 怎么实现好呢?

看了2.4.3的源码,renderflow和RenderComponent的函数都是_checkBacth。
而不是_checkBatch,是不是官方单词拼错了?

1赞

牛大发了,,,必须给大佬顶一下

通过多camera处理确实是一个很好的方案,引起有考虑支持吗 :joy:

战略mark