-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2D渲染时, 某些情况下会莫名其妙的断批 #17365
Comments
可能和 MeshBuffer 的機制有關, 2D 渲染對象會優先使用同一個 MeshBuffer 的空間 這邊的管理比較複雜, 可能需要官方想辦法處理 |
@minggo 这个问题你们官方有复现吗? 有解决方案或者优化建议吗? |
我最近也遇到這個問題, 研究了下引擎的寫法 此外複用時, 放入節點池 renderData 的 chunk 並不會被釋放 (生命週期和渲染組件綁定) 目前我的解法是:
b. 重新申請 chunk 並複製舊內容到新 chunk 中的方式 目前實測起來, draw calls 有不錯的下降程度 |
@yoki0805 万分感谢. 希望引擎组能看到. |
这个问题我们已经注意到了,后续会优化。 |
有没有复现demo |
給予 2D 物件隨機的存在時長, 用於模擬遊玩過程的生成與刪減 |
好的 |
这个问题我们看了,因为我们的ui合批方案采用的是网格合批,顶点数组的默认长度是4096,当使用相同资源的ui节点超出这个范围就会新建chunk,这个时候就会新增drawcall,可以适当增加该范围,但是并不一定越大越好。demo里会突然暴增是因为使用的是NodePool,NodePool是会回收使用,而不会销毁,这会导致MeshBuffer已经分配的数据依旧存在chunk中,系统只能继续新增chunk,应该使用node的destroy方法,每帧才会重新计算chunk。 |
Demo 只是對實際情況做了簡化的模擬 也許我們只需要一個能手動清除 chunk 數據的 API, |
嗯, 這樣就已經滿好用的 |
@GengineJS 但是我的情况和 @yoki0805 的略有不同, 我没有用到 对象池. 只是单纯的一堆东西画在屏幕上. 我这种情况无解了吗 ? |
一堆东西是什么?有多少数量?是只新增不删除么?评论沟通方式成本很高,尽量一次性把问题描述清楚下 |
|
Cocos Creator version
3.8.3
System information
all
Issue description
现象:
两个本来是可以合批, 在一个dc里被绘制的sprite节点 莫名其妙的断批了.
首先 我在2D渲染DC优化方面有一定经验, 所以可以排除低级错误 (比如 不能合批的 被我误以为可以合批).
查看了一下dc信息, 发现断批时会出现下图中的情况
这两个dc指令的参数一模一样, 且都使用的同一个 texture, 但是中间插入了一次 bindVertexArrayOES , 导致断批 (或者说是因为断批 才多执行了一次 bindVertexArrayOES , 具体cocos 3内部如何处理的我没太明白)
Relevant error log output
No response
Steps to reproduce
如上
Minimal reproduction project
No response
The text was updated successfully, but these errors were encountered: