多组带边界元素有序合并算法:类红石2D游戏动作排序需求
解决方案:无全局注册表的Action顺序冲突处理
针对你开发2D红石类游戏时遇到的多模块Action顺序冲突问题,结合你不需要全局注册表、动作数量少的场景,以下几个实用方案可以解决:
方案1:自动生成虚拟后置节点(最贴合你的示例需求)
核心思路是给每个真实Action自动生成一个虚拟后置节点(比如[ActionID]_post),模块内部的后续Action默认依赖前一个Action的虚拟后置节点,而外部模块的Action可以依赖真实Action节点来插入到中间位置。
实现逻辑:
- 框架层面:每个注册的Action(如
1.B)被创建时,自动生成对应的虚拟节点1.B_post,并设定1.B_post的执行顺序为紧接在1.B之后。 - 模块内部默认规则:模块内的Action(如1.C)如果定义为
after 1.B,框架自动将其改为after 1.B_post,保证模块内部的原有顺序链不被外部插入打断。 - 外部模块规则:外部模块的Action(如2.A)直接定义
after 1.B,就会被插入到1.B和1.B_post之间,也就是1.B之后、1.C之前。
示例代码(框架自动处理后):
模块1的定义(开发者写的):
1.A: after START 1.B: after 1.A 1.C: after 1.B
框架实际处理后的依赖链:
1.A: after START 1.B: after 1.A 1.B_post: after 1.B 1.C: after 1.B_post
模块2的定义:
2.A: after 1.B
最终执行顺序:1.A → 1.B → 2.A → 1.C,完全符合你的期望。
这个方案不需要开发者额外配置,也不需要全局注册表,框架自动处理依赖关系,对开发者友好。
方案2:给Action添加可选权重参数
在before/after的基础上,给每个Action增加一个可选的权重值(默认值可设为50),当多个Action依赖同一个边界时,按权重值排序(权重高的后执行,或反之,可根据需求设定)。
示例:
模块1的定义(开发者可手动指定权重,也可框架自动给模块内Action递加权重):
1.A: after START, weight=50 1.B: after 1.A, weight=60 1.C: after 1.B, weight=70
模块2的定义:
2.A: after 1.B, weight=65
最终执行顺序会按权重排序:1.A(50) → 1.B(60) → 2.A(65) → 1.C(70)。
优势:
- 灵活性高,开发者可以精准控制Action的插入位置
- 无需全局注册表,每个模块独立配置自己的权重
- 动作数量少的情况下,配置成本极低
方案3:以模块加载顺序作为 fallback 优先级
如果不想额外配置,可将模块加载顺序作为同依赖Action的优先级依据:
- 规则:当多个Action依赖同一个边界且无其他优先级定义时,后加载的模块的Action优先插入到前面(或后面,可配置)。
- 比如模块1先加载,模块2后加载,那么
2.A会被放在1.C前面,符合你的示例需求。
这个方案完全不需要开发者额外操作,但灵活性稍差,适合对顺序要求不极致的场景。
内容的提问来源于stack exchange,提问作者blaumeise20
相关产品推荐
相关产品推荐

