← ClaudeAtlas

cocos-creator-drawcalllisted

优化 Cocos Creator 渲染性能时使用。合批、图集、动静分离、Label。
Wade-DevCode/awesome-coding-skills-cn · ★ 3 · AI & Automation · score 78
Install: claude install-skill Wade-DevCode/awesome-coding-skills-cn
# Cocos Creator 降 DrawCall ## 何时用 - 游戏在中低端机上帧率不稳,用 DrawCall 面板发现每帧 DrawCall 超过 100+ 时。 - 增加了若干 UI 节点后帧率明显下降,怀疑合批被打断时。 - UI 图片散布在多个独立贴图文件,没有合并图集时。 - 场景里有频繁移动/变色的动态节点和大量静态 UI 混排,导致静态内容也每帧重绘时。 - 动态文本(计分、倒计时)用了系统字体,导致每个 Label 都是独立 DrawCall 时。 ## 核心规则 ### 1. 合批条件:同材质 + 同贴图 + 连续层级,缺一不可 **规则:** Cocos Creator 3.x 的自动合批(Auto Batching)要求相邻渲染节点使用完全相同的材质实例和贴图,且在渲染树中是连续的兄弟节点;只要中间插入一个使用不同贴图的节点,从该节点开始就会打断合批,之前和之后的节点各自成为独立批次。 **为什么:** AI 生成 UI 布局时完全不考虑渲染顺序,喜欢按逻辑语义组织节点层级:把背景、图标、文字、特效各自放一层,每层里再嵌套子节点。这种结构在视觉上没问题,但渲染时背景(图集A)→ 图标(图集B)→ 文字(Label 单独纹理)→ 特效(序列帧图集C)来回切换贴图,每切换一次就是一次新的 DrawCall,最终一个看起来简单的卡片 UI 产生了 8 个 DrawCall。新手以为"用了同一个图集就能合批",却不知道中间穿插了一个不同材质的节点就已经把批次切断了,从 DrawCall 面板看到的批次数远超预期。 **怎么做:** - 用 Creator 编辑器的 **Render Batches 面板**(菜单 Scene → Show Batches),直观看到哪些节点形成了一批,哪里发生了断批。 - 把使用同一图集的节点在层级面板中排列为连续兄弟节点,使用不同材质的节点(特效、粒子)移到最顶层或最底层,集中放置减少切换次数。 - 避免在同材质节点序列中间插入 `Mask` 组件节点——`Mask` 会强制开启模板测试,打断合批。 - 合批验证:在 Profile 模式下运行,对比增减节点前后的 DrawCall 数,用数字而非感觉确认合批效果。 --- ### 2. 图集:同屏 UI 精灵打入同一图集,权衡尺寸与内存 **规则:** 同一个界面(大厅、战斗 HUD、商店)内频繁出现的精灵必须合并到同一张图集;图集尺寸控制在 1024×1024(中端机)或 2048×2048(高端机),超出则拆分多张;不同界面的独占图集在切换界面时及时释放。 **为什么:** 没有图集是 DrawCall 爆炸最直接的原因:100 个 UI 图片分别存为独立 PNG,渲染时每个图片一次 DrawCall,哪怕它们相邻、同材质,贴图句柄不同就无法合批。AI 生成美术资源管理代码时几乎从不提图集,直接 `resources.load("sprites/icon_1")` 逐个加载散图。另一个常见错误是图集做得过大:一张 4096×4096 的图集在中端安卓机上加载耗时 200~400ms,且常驻 64MB GPU 内存,换来的收益是减少了几个 DrawCall——完全不划算。图集尺寸要根据目标机型 GPU 内存上限精心规划。 **怎么做:** - 在 Creator 编辑器中,选中存放精灵的文件夹 → 右键 → 「创建图集(Auto Atlas)」,配置最大尺寸和间距,构建时自动合图。 - 按界面分组:`hall_a