Gandi 3.0文档
官网 打开编辑器
文档/舞台与运行

运行时的保护与开关

作品运行时,有些写法会把编辑器一起拖慢,最典型的是在勾了「运行时不刷新屏幕」的自制积木里 放一个死循环。这一页说明编辑器如何限制这类情况,以及舞台控制条上那两颗模式按钮各自改了什么。

失控的「不刷新屏幕」循环#

自制积木可以勾选「运行时不刷新屏幕」,表示这一段连续执行完毕,中途不刷新画面。它的用途是让 密集计算跑得更快。问题出在其中再放一个没有退出条件的循环:

一个勾了「不刷新屏幕」的自制积木,里面是「重复执行」

在没有限制的情况下,这条线程每一帧可以占用 500 毫秒才让出控制权,相当于一秒两帧,编辑器的 任何操作都要等半秒才有反应。

现在多了一道限制:

不刷新屏幕的过程每一轮能占用多少时间

连续两轮把 500 毫秒用满,即判定为失控,之后每一帧只分配 40 毫秒。作品里的死循环仍然照常 执行(不会被静默停止,也不会被跳过),只是不再占满整帧。实测在这种情况下编辑器仍有 25 帧/秒(同一台机器上空转是 61),拖动、点菜单、按停止都正常。

第一轮仍然给满 500 毫秒。 一个规模大但有限的过程(生成一张地图、跑一遍寻路)本来就可能 需要几百毫秒,不应当因为慢而被限制。只有连续两轮都没有执行完才判定为失控;只要某一轮没有 用满预算,下一轮就恢复成 500 毫秒。

判定发生时,调试面板的日志里会写一条记录,指明是哪个角色的哪段脚本:

日志里的那一条:说是哪段脚本,以及现在每帧只给它 40 ms

那条日志右边的「跳到积木」会把工作区滚动到相应的积木上。日志页在调试面板里,见 调试 · 诊断与日志。

这道保护不改变作品的行为,只限制它占用编辑器的时间。死循环本身依然存在,仍然需要修改; 日志里那句「多半是循环缺了退出条件」指的就是这件事。

两个模式开关#

舞台控制条右边那两颗图标,和设置 →「高级」里的前两行,是同一对开关:在任一处修改,另一处 同步显示。

设置 · 高级

编译模式#

默认开。 作品的脚本先编译成 JavaScript 再运行,而不是逐块解释执行。密集计算的作品 (大量循环、大量运算)可以快数倍,大作品上是数量级的差别。

几点说明:

  • 这个开关不随作品保存,也不记在浏览器里。 刷新页面后回到默认的开启状态。
  • 无法编译的脚本会自动退回逐块解释,作品照常运行;调试面板的日志里会记录是哪个角色。
  • 设置断点会临时关闭它。 断点需要停在某一块积木上,而编译过的脚本没有逐块执行的结构。 因此一旦存在断点,调试面板会自动切回解释模式并在日志里记录一条,断点全部清除后再切回来。 见调试 · 断点。
  • 编译产物里的「不刷新屏幕」循环同样受上面那道保护:开启编译模式时编辑器会一并要求它 每帧让出控制权,判定失控后同样压到 40 毫秒。

什么时候该关掉它:编译过的脚本报错方式不同,少数积木在它下面的行为也有细微出入。 需要排查报错、或者逐步观察脚本怎么执行的时候,把它关掉。

加速模式#

默认关。 打开之后运行时不再等待屏幕刷新,一帧内尽可能多地执行。与原版 Scratch 的 「加速模式」相同。

相关#