Gandi 3.0文档
官网 打开编辑器
文档/调试工作台

调试工作台

作品卡顿、脚本没有按预想运行、想知道哪块积木最费时,都可以在「调试」面板里查。它把运行 中的作品拆开来看:每一帧花了多少毫秒、哪条脚本在占时间、哪块积木被执行了多少次,还能在 积木上下断点,停下来查看变量。

调试面板的概览页

录完一段之后的样子:上面是每帧耗时、帧率这几个数,下面是「这次慢在哪」的结论,每条都能点 「跳到积木」跳转过去。

打开方式#

顶栏中间那排图标最右边的田字格按钮是抽屉,点开,里面有「调试」。

抽屉里的调试入口

它以悬浮窗的形式打开,默认落在编辑器右下角,620 × 560。可以拖标题栏移动、拖边缘改大小。 调试要边运行边观察,浮窗形式便于同时看到工作区和舞台。

常用时可以把抽屉里的「调试」图标拖到顶栏那一排上,以后一步就能打开。

刚打开时面板是空的:

刚打开的面板

面板结构#

最上面一条是运行控制工具条,在任何一页都显示。

工具条
控件 作用
「录制」 开始记录,一直录到点「停止」为止
「5 秒」 录 5 秒自动停
「轻」/「完整」 记录的详细程度,见下面「两个档位」
「暂停」/「继续」 F8。命中断点时这颗按钮变绿,写着「继续」
「单步」 F9,执行一块积木
「跳过」 F10,自制积木整段跳过
「跳出」 Shift + F9,执行完当前过程再停

右边是状态胶囊:「已暂停」/「单步中」、「录制中」、「编译」或「解释」(开了加速会写成 「解释 · 加速」),以及有录制数据时的每帧毫秒。录制期间把鼠标停在毫秒那颗胶囊上,会显示 探针自身占了多少。

面板窄到一定程度时这排按钮会收起内容:窄于 700px 隐藏 F8 这类角标,窄于 640px 连按钮上 的文字也隐藏,只留图标。

工具条下面是页签,一共十一页:

页 讲什么 文档
概览 每帧几毫秒、卡在哪,加导出 / 导入 / 基线 本篇
帧 每一帧的柱状图,点一根查看那一帧 本篇
线程 每段脚本的耗时,以及当前存活的线程 本篇
积木 最费时的积木排行 本篇
监视 当前角色和舞台的变量、列表,可直接修改 监视 / 渲染 / 内存
断点 断点表、暂停现场、调用栈 断点与单步
事件 广播、帽子、克隆各发生了多少次 本篇
渲染 画面为什么慢:大造型、特效、克隆体 监视 / 渲染 / 内存
内存 堆内存走势、对象数、最大的列表 监视 / 渲染 / 内存
日志 绿旗、说话、克隆、日志点、变量变化 诊断与日志
外观 工作区上各种描边与标记的颜色和开关 监视 / 渲染 / 内存

「断点」和「日志」页签上带数字角标,是当前断点数和日志条数。

数据来源#

面板里的数字是从哪来的

面板里的数字由 VM 在运行时逐条记录。由此有两个结果:不录制时探针不执行任何代码,平时 不必担心它拖慢作品;探针只能测到 VM 内的时间,编辑器界面占用的主线程时间要靠帧间隔 倒推(见「界面开销」那条结论)。

性能录制#

两个档位#

档位 记什么 什么时候用
轻 每帧的耗时、绘制耗时、线程数;每条线程每一轮的耗时和块数;广播 / 帽子 / 克隆 判断卡不卡、哪段脚本重
完整 上面全都记,外加每一块积木的自耗时和执行次数 定位到具体是哪块积木

默认是「完整」。「积木」页、结论里的「最费时的积木」,还有工作区上的热度描边,都只有 「完整」档才有。轻档录完切到「积木」页会是这样:

轻档没有积木记录

代价是「完整」档要给每块积木计时,本身有开销,占用多少可以在工具条右边那颗毫秒胶囊的悬停 提示里看到。作品特别重时,先用「轻」档定位到脚本,再切「完整」档确认是哪一块。

录制一段#

  1. 点「录制」(或「5 秒」)。
  2. 点绿旗让作品运行,把卡顿的那一段操作一遍。
  3. 点「停止」。

录制期间工具条上有红色的「录制中」,「录制」按钮变成「停止」:

录制中

录制中概览页已经在出结论,界面每 500 毫秒刷新一次。录完停下来,数字才是这一整段的平均值。

缓冲有上限:最多留最近 3600 帧(30fps 下约两分钟)、20 万条积木记录。超出后从最早的开始 丢弃,所以录得太久只会剩下末尾那一段。

概览页怎么读#

顶上一句话是这段录制的概况:录了几秒、几帧、平均每帧几毫秒。下面五个数:

数 意思 什么时候变红
每帧 一帧里 VM 花掉的总时间(脚本 + 渲染) 超过一帧的预算
帧率 这段录制里实测的帧率 低于 24
最长一帧 这段里最卡的那一帧 超过两帧的预算
超预算的帧 超过预算的帧占多少 超过 20%
绘制 每帧里画面渲染占了多少 超过 6 ms 转橙

一帧的预算跟着作品的帧率走:默认 30 帧每秒,一帧就是 33.3 ms;作品自己设成 60 帧, 一帧就是 16.7 ms。面板上写出来的那个数就是当前的预算,后面跟着帧率,例如 「超过了 33.3 ms 的预算(30 帧)」。

再下面是结论卡片,那是这个面板最主要的输出。怎么读、有哪些规则,见 诊断规则与日志。

帧#

一根柱子一帧,越高越慢。虚线是一帧的预算,线上标着是多少毫秒;超过预算的柱子是红的, 到六成以上是橙的。

帧页

上面能选看最近 120 / 300 / 900 帧还是「全部」,默认 300 帧。鼠标停在柱子上显示那一帧的 详情,点一下柱子,下面会展开:

  • 第一行是这一帧的概况:多少毫秒、几条线程动过 / 帧末还存活几条、执行了多少块积木, 以及这一帧是不是编译模式、是不是加速模式。
  • 「绘制」是渲染占的时间。
  • 「其它」是这一帧里既不属于渲染、也不属于下面列出的那几条线程的部分。
  • 再往下是这一帧里最费时的几条线程,点一行跳到那段脚本。

排查间歇性卡顿看这一页:先在图上找出特别高的柱子,点开看当时在运行什么。

线程#

一条「线程」就是一段正在运行的脚本。同一个角色的同一段脚本,即使有几百个克隆体各自运行, 也合并成一行;取消上面的「合并克隆体」就会拆开。

线程页
列 意思
角色 谁的脚本;克隆体合并时会写「N 个克隆体」
脚本 帽子积木 › 下一块 › 循环体第一块。仅写「当绿旗被点击」无法区分同一角色的多段脚本
每帧 这段脚本平均每帧花多少毫秒
峰值 最费时的那一帧花了多少
块/帧 平均每帧执行多少块积木。旁边有「无等待」标签表示它在一帧内不会停下
状态 运行中 / 等待 Promise / 让出 / 等下一帧 / 已结束

脚本名底下还可能有小字:「不刷新屏幕」说明这段运行在勾了「运行时不刷新屏幕」的自制积木 里,「编译」说明它是编译执行的。

表格下面是泳道图,每段脚本一条,横轴与上面的帧图对齐,可以看出某段脚本是一直在运行,还是 隔一阵才动一次。最多画 12 条。

最上面那行「现在 N 条线程,M 条在跑」是实时的,不是录制里的。点「展开」能看到此刻每条 线程停在哪一块、是什么状态,还能直接把某条线程停下来(见 断点与单步)。

积木#

「完整」档才有。按总耗时排,最多列 40 行。

积木页

「每帧」是这块积木平均每帧花的毫秒,「次数」是整段录制里被执行了多少次,「占比」是它占 所有积木时间的比例。积木名下面那行灰字是它的 opcode,遇到扩展积木或者名字对不上时有用。

点任意一行跳到工作区里那块积木。

这里统计的是自耗时:C 形积木(重复执行、如果…那么)只算它自己判断条件和安排下一轮的 开销,循环体里的积木分别计入自己名下;自制积木的调用块也只算调用本身,过程内部的积木单独 统计。

事件#

录制期间的广播、帽子、克隆各发生了多少次。

事件页

「启动的脚本」是这些事件一共启动了多少条脚本,底下的小字是平均每次启动几条。广播的问题 通常就出在这个数上:一次广播启动一百条脚本,和一帧发一百次广播,开销都很大。

「来源」是发出方,最多列前三个。

工作区上的热度#

录「完整」档时,工作区里的积木会按耗时描边,越费时描得越粗越亮。

工作区里的热度描边

只描耗时高的那些:低于最热那块 15% 的不画,避免整段脚本连成一片。最热的十几块另外加一层 很薄的柔光。颜色和强度在「外观」页调,也能整个关掉。

停止录制之后描边保留,便于对照。切到「轻」档会清除。

保存与对比#

概览页最下面有三颗按钮。

导出 / 导入#

「导出」把这段录制存成一个 .gtrace 文件(就是 JSON)。里面除了四组原始记录,还存了当时 翻译好的积木名和脚本名:读回来时作品可能已经改过,甚至不是同一个作品,文字必须跟着记录走。

文件名是标签页标题加导出时间。眼下标签页标题固定是 Gandi 3.0,所以导出的文件叫 Gandi 3.0-20260909-151735.gtrace 这样;导入之后那条提示里显示的名字也是它。

「导入」读回一份。读回来之后概览页顶上会有一条提示:

导入录制文件后的提示

查看文件时面板不再从 VM 取数据,帧窗口会自动切到「全部」。点「录制」回到实时数据。

导入的录制

它适合排查本机复现不出来的卡顿:让对方录一段发过来。

记为基线#

「记为基线」把当前这段记下来作为参照。之后再录一段,「线程」和「积木」表会多出一列 「比基线」,概览的「每帧」和「绘制」下面也带上差值。

线程表里的比基线列
概览 KPI 上的差值

绿色的负数是快了,红色的正数是慢了,差不到 0.05 ms 写「持平」,基线里没有的行写「新」。 改一处优化、再录一段、对比数字有没有变化,比凭感觉判断可靠。

基线存在内存里,刷新页面即丢失;.gtrace 是文件,可以长期保留。跨天对比时先导出,下次 导入之后再「记为基线」。

细节#

  • 「界面开销」这条结论值得重视。 探针只能测到 VM 内的时间。如果脚本只用了几毫秒、帧率 却上不去,多半是工作区里积木太多、监视器太多,或者这个面板本身(「完整」档加热度描边) 在占用主线程。作品单独运行时没有这部分开销。
  • 关掉面板会停掉录制,工作区上的描边和标记也会收起。舞台上的帧率仪表是独立的:它开着 的时候关闭面板不会关掉探针(仪表自身要用)。
  • 面板里的数据每 250 毫秒取一次,录制中界面每 500 毫秒重画一次:二十万条积木记录刷新过勤 会拖慢作品本身。
  • 一次只计算当前这一页需要的数据:切到「积木」页才会汇总积木。因此切页时有短暂延迟。

相关#