Script Graph

使用指南

高阶教程 / 原生代码编译和批量编译完整指南

详细说明原生代码编译的使用时机、支持面分析、诊断处理、批量编译流程、结果解读和发布前验证顺序。

16

当工作流进入真实项目阶段,单个文件能跑只是第一步。你还需要确认所有 .sgw 都能编译、关键逻辑性能足够、类型引用没有断、自定义节点和插件节点仍然可用。

这篇讲两个高阶能力:

  • 原生代码编译:把支持范围内的工作流转成更直接的 TypeScript 代码,用于性能敏感路径。
  • 批量编译:一次检查项目内多个 .sgw,用于发布前和大改后的全局验证。

阅读前提和学习路线

阅读前建议已经理解:

本页的阅读顺序很重要:

先理解原生代码编译适合什么
  -> 再看支持面和诊断
  -> 再处理自定义节点影响
  -> 最后用批量编译做全局验证

不要把原生代码编译当成“一键加速”。它更像一条更严格的编译路径:能帮助性能敏感逻辑,但也会把不支持的节点、断掉的数据依赖和不明确的异步行为更早暴露出来。

原生代码编译解决什么问题

普通工作流更适合搭建、验证和调试。原生代码编译适合在逻辑稳定后提升关键路径性能。

适合开启的场景:

场景原因
每帧移动、计时、状态更新调用频率高
大量对象循环处理节点执行次数多
高频 UI 刷新容易造成卡顿
输入响应和物理控制对延迟更敏感
发布前性能收敛需要更稳定的执行成本

不建议一开始就开启:

场景原因
正在探索玩法先保证逻辑正确
节点还频繁替换支持面变化会干扰调试
只是低频按钮或菜单逻辑性能收益不明显
还没有排查清楚错误原生编译会增加排查维度

推荐节奏是:先普通方式跑通,再用打印节点排查正确性,最后再开启原生代码编译优化关键路径。

开关位置和含义

项目设置里有“启用工作流原生代码生成”开关。说明中明确它是实验性开关:开启后,支持范围内的工作流会编译为真实 TypeScript 代码直接执行;不支持的节点会导致编译失败,不会悄悄退回普通执行方式。

这意味着:

  • 开启后要认真看编译错误。
  • 不支持就是不支持,不能指望系统自动绕过去。
  • 最好逐步开启,而不是在发布前一次性给所有工作流开启。

原生编译会先做可行性分析

编译前会分析整张工作流,确认入口、节点、数据依赖、事件绑定、自定义节点等是否在支持范围内。

分析会关注:

检查方向说明
主 Flow 是否存在没有主 Flow 无法生成
入口是否可识别生命周期、全局事件、方法入口等
执行节点是否支持不支持的执行节点会产生诊断
数据节点是否支持上游数据依赖也必须可生成
事件绑定是否支持事件相关节点需要满足规则
自定义节点是否可生成bridgeoperation 需要被识别
异步能力是否明确需要等待的 Flow 会进入 await 模式

诊断通常会带上 Flow、节点 ID、节点类型和原因码。处理时先修第一条,因为后续错误可能是第一条引起的连锁反应。

自定义节点和原生编译

自定义节点会影响原生编译。大致规则:

节点执行方式原生编译注意点
bridge可被识别;如果异步,节点要标记 isAsync: true
operation可被识别;适合包装已有操作语义
未明确执行方式可能无法进入支持范围

如果自定义节点里有等待过程,例如加载资源、等待事件、请求外部结果,必须明确标记异步。否则生成代码时会错误理解执行顺序。

发布前处理自定义节点:

  1. 确认 node.type 稳定。
  2. 确认端口 ID 与返回字段一致。
  3. 确认异步节点标记正确。
  4. 在一个小工作流中单独编译。
  5. 再放入真实工作流。

原生编译失败时怎么排查

按这个顺序处理:

  1. 先看第一条诊断的节点类型。
  2. 打开对应 .sgw,定位节点。
  3. 判断是节点不支持、数据依赖不支持,还是事件绑定不支持。
  4. 如果是自定义节点,检查 bridgeoperationisAsync 和输出端口。
  5. 如果是资产管理或构造类逻辑,确认该 Flow 是否适合原生编译。
  6. 临时替换成普通支持节点,再重新编译验证。

常见诊断方向:

诊断方向含义处理方式
missing-main-flow主 Flow 缺失重新打开 .sgw 检查文件类型和主 Flow
unsupported-execution-node执行节点不支持替换节点或暂不开启原生编译
unsupported-data-node上游数据节点不支持改造数据来源
unsupported-node-type节点类型不在支持面内替换或等待支持
missing-data-source-node数据来源节点缺失修复断线或删除失效引用
unsupported-asset-management-constructor-flow构造流程里用了不合适的资产管理节点把资源加载移到更合适的 Flow

逐步开启策略

不要一次性把所有工作流都改成性能模式。推荐按风险分层:

阶段处理范围验证方式
1一个简单组件工作流单文件编译、场景预览
2一个高频组件工作流加打印、对比行为
3相关函数库单文件编译、调用方编译
4一组玩法工作流批量编译
5发布前全项目批量编译、真实场景跑通

每一步都保存一份可回退版本。性能优化不应该和大规模逻辑改造混在一起做。

批量编译解决什么问题

批量编译用来检查多个 .sgw 的编译状态,特别适合改动影响范围不明显的时候。

适合运行批量编译的时机:

  • 发布前。
  • 修改了枚举、结构体、接口或类之后。
  • 修改了函数库之后。
  • 修改自定义节点之后。
  • 更新或禁用插件节点之后。
  • 重命名、移动或删除 .sgw 文件之后。
  • 大量复制、整理、替换节点之后。
  • 开启或关闭原生代码编译相关配置之后。

批量编译不是替代单文件调试,而是验证“全项目引用关系仍然成立”。

批量编译入口

从菜单进入:

扩展 / 脚本图编辑器 / 批量编译

它会扫描项目内可编译的 .sgw 资产。当前覆盖这些文件类型:

类型是否纳入批量编译
组件
函数库
接口
枚举
结构体

批量编译会跳过不属于这些类型或无法识别的数据。

批量编译会保存已打开面板

如果某个 .sgw 正在工作流面板里打开,批量编译会先请求该面板保存,再读取文件编译。保存等待有超时限制;如果面板没有及时响应,该文件会失败并给出保存相关错误。

这条规则很重要:

  • 批量编译前先处理未完成的编辑。
  • 不要让多个未保存的工作流长期打开。
  • 如果提示等待保存超时,先手动保存该工作流,再重新批量编译。

批量编译结果怎么读

结果应按依赖层级读,不要只看失败数量。

优先级:

  1. 枚举、结构体、接口。
  2. 类。
  3. 函数库。
  4. 自定义节点和插件节点相关问题。
  5. 组件工作流。

原因是上层组件可能依赖底层类型和函数库。先修底层,一个错误可能会让多个组件恢复。

结果字段可以按下面理解:

信息用途
文件名找到失败的 .sgw
资源 URL确认项目内位置
文件路径必要时定位磁盘文件
成功/失败判断是否生成输出
错误摘要第一时间看懂问题
错误详情需要深挖时再看
输出路径成功时确认生成文件位置

推荐验证顺序

发布前或大改后,按这个顺序走:

  1. 保存所有打开的 .sgw
  2. 单独编译刚改过的文件。
  3. 编译枚举、结构体、接口。
  4. 编译类和函数库。
  5. 编译引用自定义节点或插件节点的关键组件。
  6. 运行批量编译。
  7. 打开真实场景预览。
  8. 清理临时打印。

不要把“批量编译通过”当成“玩法完全正确”。它证明文件能生成,不证明每条业务路径都已在场景里跑过。

大改后的分批策略

如果项目有很多 .sgw,一次看到大量失败会很难处理。可以分批:

批次目标
类型文件枚举、结构体、接口
领域模型
复用逻辑函数库
基础组件UI、角色、关卡根节点
高频组件更新、输入、物理、循环
插件引用使用插件节点的工作流

每批通过后再处理下一批。这样能避免同一个底层错误在几十个组件里重复出现。

常见失败原因和处理

失败原因典型表现处理方式
类型引用失效枚举、结构体或类找不到重新选择目标类型
节点不支持原生编译原生编译诊断指向某个节点替换节点或暂不开启原生编译
自定义节点变化端口 ID、输出字段或 node.type 不一致恢复旧契约或迁移工作流
插件节点不可用节点类型无法解析打开关联插件面板检查
资产路径失效加载节点失败或默认值丢失用选择器重新指定
已打开面板未保存保存超时或文件内容不是最新手动保存后重跑
文件类型不适合批量编译跳过或报不可编译检查 .sgw 主类型

原生编译和批量编译如何配合

推荐流程:

  1. 先普通方式跑通工作流。
  2. 单独开启关键工作流的原生编译路径。
  3. 修复所有原生编译诊断。
  4. 在场景里对比行为。
  5. 再用批量编译确认引用范围。
  6. 最后做发布前预览。

如果批量编译中有大量原生编译相关错误,先缩小范围,挑一个最简单的失败工作流处理。不要同时修改所有失败工作流。

性能优化时不要丢掉可读性

原生代码编译不是让你把所有逻辑塞进一张大图。可维护性仍然重要:

  • 高频逻辑可以优化,但文件职责仍要清楚。
  • 循环里少做资源加载。
  • 更新事件里少做节点查找。
  • 重复计算可以放进函数库。
  • 大量对象数据可以用结构体组织。
  • 关键输入输出保留清晰命名。

性能问题通常不是一个开关解决,而是“职责拆分、节点选择、资源时机、编译路径”一起处理。

发布前完整检查清单

  • 所有关键 .sgw 已保存。
  • 单文件编译通过。
  • 枚举、结构体、接口先通过。
  • 类和函数库通过。
  • 自定义节点和插件节点状态正常。
  • 原生代码编译诊断已处理。
  • 批量编译通过。
  • 真实场景预览跑通关键路径。
  • 临时打印已经清理。
  • 资产包、场景和资源进入构建配置。
  • 禁用的插件服务没有被工作流引用。

失败时的最短处理路径

如果你只想快速定位问题,按这个顺序:

  1. 看失败文件名。
  2. 看第一条错误摘要。
  3. 打开对应 .sgw
  4. 在入口后加打印,确认是否能普通运行。
  5. 如果普通运行也不对,先修逻辑。
  6. 如果普通运行正确,再处理原生编译支持面。
  7. 单文件通过后,再跑批量编译。

继续阅读: