单次执行节点上限 (MAX_NODE_EXECUTIONS)
max_node_executions 是 Maingraph for MC 针对单次蓝图触发所设置的安全阈值。它主要用于拦截那些在单个蓝图内部发生的无限循环或超大规模循环,从而保护服务器免受性能冲击。
配置信息
- 配置文件:
config/mgmc-common.toml - 配置键:
max_node_executions - 默认值:
5000 - 数值类型: 整数 (Integer)
为什么需要这个配置?
虽然 最大递归深度 可以防止蓝图之间的连锁反应导致的堆栈溢出,但它无法拦截单个蓝图内的逻辑死循环。
例如,如果你在蓝图中创建了如下逻辑:
- 循环开始: 使用
For Each或自定义的Exec链。 - 逻辑回流: 循环体末尾重新连回了循环开始的输入。
- 缺少跳出: 没有任何判断条件来中断这个循环。
这种情况下,递归深度始终为 1(因为没有产生新的调用栈),但它会占据 CPU 资源进行无限运算。max_node_executions 通过累计单次触发中执行过的节点总数,在达到阈值时强行中断执行,从而防止此类“逻辑黑洞”卡死服务器。
工作原理
蓝图引擎在每次执行时都会维护一个 NodeContext 对象:
- 计数累加: 每当一个带有
Exec针脚的节点被触发执行时,计数器nodeExecCount就会 +1。 - 阈值检查: 在执行任何节点逻辑之前,引擎会检查
nodeExecCount是否已超过配置值。 - 强制中断: 一旦超过阈值,该蓝图本次的所有后续执行将被立即丢弃。
如何调整
- 普通用户: 默认值
5000已经足够应对 99% 的复杂逻辑(即使是包含大型列表处理的蓝图)。 - 极端需求: 如果你正在编写处理数万个实体或方块的超大型自动化脚本,可能需要将此值调高至
20000或更多。 - 性能敏感型服务器: 如果你希望严格限制玩家脚本对 CPU 的占用,可以适当调低此值(如
1000)。
TIP
如果你的蓝图因为达到此限制而中断,通常意味着你的逻辑中存在可以优化的空间,或者确实产生了一个非预期的死循环。
与递归深度的区别
| 特性 | 递归深度限制 | 节点执行上限 |
|---|---|---|
| 主要目标 | 防止堆栈溢出 (StackOverflow) | 防止 CPU 耗尽 (Internal Loop) |
| 触发场景 | 蓝图触发蓝图(A 触发 B) | 单个蓝图内部循环(A -> A) |
| 检测对象 | 调用栈层数 | 执行节点总数 |