完整课程入口:996 全套课程体系 | Lua 学习路径 | 幂尔框架 mirs.cn
同样是打开一个面板,有的秒开,有的掉帧——差别通常不在逻辑代码,而在渲染层。Cocos 系引擎每帧提交的绘制命令(DrawCall)数量、纹理切换次数、UI 树深度,共同决定界面开销。一次 DrawCall 就是 CPU 向 GPU 下达的一次绘制指令,几百次还撑得住,上千次就开始掉帧;每切换一张纹理,还要付出重新绑定资源的代价。界面卡顿排查,先查这两项。
引擎自动合批的前提非常苛刻:相邻的节点使用同一张纹理、同一份材质,且中间不能被不透明节点打断。所以散图直接拖进界面的做法天生反合批——十个图标十张纹理,十次绑定十次绘制。UI 合图(图集)就是解药:把面板里所有小图打包进一张 2048×2048 大图,所有图标共享同一纹理,绘制命令天然合并。
实操规范:按"面板"而非按"类型"打图集——同一个面板里出现的图必须同图集,跨面板共用的通用件(按钮底、边框、货币图标)进公共图集。合图后用引擎的渲染统计面板对比 DrawCall 数,从 400 降到 60 是常见幅度。特别提醒:加了自定义 Shader 的控件会打断合批,一个面板里至多一两处,别给普通图标乱穿衣服。
层级过深。UI 树每层都要做变换计算与遍历,策划堆出来的十层嵌套容器是常客。把深层布局拍平、隐藏节点用可见性开关而非反复创建销毁,能同时降低构建耗时与渲染开销。
内存泄漏。Cocos 的节点树是引用计数世界,两个经典泄漏点:从场景里 removeChild 但别处还握着引用;注册了事件监听却从不注销,闭包把整棵界面树抓在手里。排查看两个地方——切场景后内存水位是否回落、同一面板反复开关内存是否阶梯上涨。规范是"谁注册谁注销",界面基类统一在 onExit 里反注册全部监听。
接到界面卡顿反馈,按固定顺序走:先看渲染统计的 DrawCall 与纹理切换(八成是图集问题);再查 UI 树深度与隐藏节点数量;然后测开关面板的内存曲线定位泄漏;最后才怀疑逻辑代码。顺序对了,大部分问题十分钟内现形;顺序错了,会在错误日志里浪费一下午。
openwindows(actor, winID)
查看自己面板,合图与合批的前提是界面结构稳定,先确认面板生命周期
| 参数 | 类型 | 说明 |
|---|---|---|
| actor | object | 玩家对象(必填参数) |
| winID | integer | 101=装备 102=状态 103=属性 104=技能 105=生肖 106=称号 1011=时装(必填参数) |
refreshitem(actor, item, type, position, value)
刷新物品信息到前端,列表类界面频繁刷新会直接抬高 DrawCall
| 参数 | 类型 | 说明 |
|---|---|---|
| actor | object | 玩家对象(必填参数) |
| item | object | 物品对象(必填参数) |
| type | number | [1,2,3](必填参数) |
| position | number | 当type=1,取值范围[0..49]type=2,取值范围[0..19](必填参数) |
| value | number | 设置物品对应位置值(必填参数) |
addbutton(actor, windowid, buttonid, icon)
增加自定义按钮,动态按钮数量是合批被打断的主因之一
| 参数 | 类型 | 说明 |
|---|---|---|
| actor | object | 玩家对象(必填参数) |
| windowid | integer | 主窗口ID(必填参数) |
| buttonid | integer | 按钮ID(必填参数) |
| icon | string | 图标内容(必填参数) |
delbutton(actor, windowid, buttonid)
删除自定义按钮,隐藏而不是删除可以让批次保持稳定,但要权衡内存
| 参数 | 类型 | 说明 |
|---|---|---|
| actor | object | 玩家对象(必填参数) |
| windowid | string | 主窗口ID(必填参数) |
| buttonid | integer | 按钮ID(必填参数) |
playeffect(actor, effectid, offsetX, offsetY, times, behind, selfshow)
在人物身上播放特效,特效往往会打断合批,排查时逐个关掉验证
| 参数 | 类型 | 说明 |
|---|---|---|
| actor | object | 玩家对象(必填参数) |
| effectid | integer | 特效ID(必填参数) |
| offsetX | integer | 相对于人物偏移的X坐标(必填参数) |
| offsetY | integer | 相对于人物偏移的Y坐标(必填参数) |
| times | integer | 播放次数0-一直播放(必填参数) |
| behind | integer | 播放模式0-前面1-后面(必填参数) |
setitemlooks(actor,itemPos,char,pictrue,item)
修改装备内观Looks值,外观相关改动会重建图集
| 参数 | 类型 | 说明 |
|---|---|---|
| actor | object | 玩家对象(必填参数) |
| itemPos | number | 装备位置(-2操作物品对象) |
| char | string | 操作符(+ - =)(必填参数) |
| pictrue | number | 图片LOOKS值(必填参数) |
| item | object | 物品对象,当参数2itemPos为-2时必填(可选参数) |
printusetime(play, on, off)
打印脚本总耗时(微秒),先排除脚本耗时,再谈渲染层
| 参数 | 类型 | 说明 |
|---|---|---|
| play | object | 玩家对象 |
| on | integer | 1=开始技术2=结束计时并打印耗时 |
| off | integer | 2=结束计时 |