【分享】自定义渲染合批之自定义顶点格式(附 Demo 和引擎源码解读)

2.4的原生平台很多都重写了,跟非原生的不一致,烦死了
js层写的fillBuffer就没用,因为原生层组件有自己的fillBuffer,压根不会来调用你js层的fillBuffer

我的方法是兼容native的。
不要把逻辑写到fillBuffer里,native是通过renderData获取顶点数据。
另外getVfmt()、getBuffer()这几个方法和文中保持一致即可。

请教下,有没有办法在一个组件里生成使用多张纹理的顶点?一部分使用纹理A,一部分使用纹理B
非原生的我是在fillBuffer里按个flush,但原生平台不行啊

顶点格式里加一组uv就可以了。
可以参考我的另一篇文章,文中第二部分用的纹理遮罩方法。

多谢指点,我去看看

Native报错
Simulator: scripting\js-bindings\auto\jsb_renderer_auto.cpp: Line: 3772, Function: js_renderer_Assembler_setRenderDataList
Simulator: sembler_setRenderDataList : Invalid Native Object
这个有可能是new RenderData的时候导致的吗

你可以下我的Demo,基于Demo去调整。自己撸一遍要试错很多次。

因为我是用2.2.0的creator写的,看了下官方引擎assembler的部分有所改动,Invalid Native Object估计是c++加载释放不同步,我去看一下官方怎么改的再试试吧

我成功了,多谢大佬指点:grin:

:+1::+1::+1:

sixsixsix

mark!!!

请问大佬有没有粒子合批的思路

    // cocos2d\particle\particle-system-assembler.js
    fillBuffers (comp, renderer) {
        if (!this._ia) return;
        
        const PositionType = cc.ParticleSystem.PositionType;
        if (comp.positionType === PositionType.RELATIVE) {
            renderer.node = comp.node.parent;
        } else {
            renderer.node = comp.node;
        }
        renderer.material = comp._materials[0];
        renderer._flushIA(this._ia);
    }

每个粒子系统都有独立的IA (InputAssember),renderer._flushIA() 调用会断合批。
你可以考虑自己处理合并掉这些IA的数据。

你遇到的是什么场景,粒子合批价值大吗?偶尔的DC+1不要太在意。:grin:

1赞

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

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

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

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

提个小建议,招聘信息里加工作室名称、工作地点。

多谢楼主提醒,已加,希望能借楼主宝地招到贤士 哈哈哈,HR推过来的简历太乱了,招不到合适的人,我只能找特殊地方发个消息碰碰运气了

价值大呀,一个子弹上加一个粒子,20个子弹就增加了39个dc

文中提到的“合批”是什么意思,这几天才刚在了解shader相关,找学习资料找到来这里了,很多这方面的东西都不了解。想在2d项目里把图做成梯形这种2.5D的效果。一直没找到如何实现。有说用shader,但一直没思路中


这种?

1赞