讨论一下 Drawcall 优化,大家来围观

肯定不是为了追求drawcall数值小而优化啊,而是为了追求更好的流畅度、省电、低发热量,让用户有更好的体验。
如果整个游戏drawcall平均保持在你说的20 - 30左右,那性能一定非常好。但现在稍微复杂一点的功能很容易突破百个Drawcall,而在那些非全屏功能互相叠加的情况下drawcall就容易上升到几百个。

2赞

围观中

BMFont这个坑碰上了还没解决,为场景中每个元素添加了一个BMFont 文字,active为false,发现内存比不加的时候居然多了一倍!场景元素也并不多,二三百个,因为这个不得不改变了游戏逻辑

不是所有地方动合适用BMFont的,比如剧情对话。
资源是需要手动卸载后才能够释放出内存的,不要以为destroy了就内存就自动回来了。

因为对引擎渲染这部份没有很熟悉,
但我有一个疑问,虽然还没有实际测试过

假设我在创建prefab的时候,动态的把所有的节点平铺在第一层,再加入parent节点,
这样是否对DrawCall有帮助呢?

当然假设有mask之类的东西,就不能这么做了…

改变parent就改变了渲染顺序了,不可行的。
节点平铺可以达到优化drawcall的效果,但开发功能很不方便,根本做不到的。你想象一下编辑器的节点没有子父节点关系,你还能不能好好做游戏了。

1赞

我都是destory,还有其他需要卸载的地方吗?我就是切换场景的时候cc.sys回收下内存

这就是开发功能方便和优化性能的矛盾。如果相同贴图的节点放一起,有些要按功能组织的节点就没法摆了

2.0后的动态图集不就是为了达到这个目的吗

你是说把整个prebab里的所有节点都平级放一起?
这样可能会破坏原来的前后层级关系。

不是,动态图集只是帮你把工程目录自动打包成图集而已,跟手动打图集一样,节约了你手动打图集的步骤,但自动打图集是有弊端的。

动态加载的资源需要通过cc.loader.release(uuid)才能释放出内存。

你是混淆了动态图集和自动图集的概念吧…dynamicAtlas != autoAtlas

编程就是在各种最优之间取舍,很多的非全屏功能说明设计本身没有做好规划,加个遮罩隐藏底层面板这个最容易做的优化都没做就更不要纠结更麻烦的优化了。如果实在不能隐藏就把底层不响应的面板截图成sprite放在下面好了。。。

1赞

我是以为你想指的是自动打包图集。
除了label字体,其它有动态图集?

业务需求可不是一个人说了算,需要在不放弃表现效果的情况下做到流畅,尽量完整的实现设计者的设定,而你说的那些也仅仅是迫不得已才那样处理的一种方式。如果底层性能更好,提供的优化方案更多,那开发者实现功能可以更灵活嘛。当然,在性能瓶颈时,往往都需要放弃一些表现。

我知道一种优化方案:就是动态修改node的渲染顺序,将同图集和label渲染分开,就能达到优化drawcall的效果。
这种思路是参考fairyGUI,奈何本人才刚刚开始使用creater,还没有具体验证这种思路可不可行。

把label的zindex 置于非纹理图的最高层, laya也是这样处理的。这样就是

AAAABBBB AAAABBBB CCCCCCC

不用他的富文本和lable这样问题就解决了

听说 Mask 也会增加 Drawcall,可是我需要用到啊,有大佬支招吗?