Skip to content

提供有界的主线程游戏动作队列 - #34

Closed
hby7921 wants to merge 1 commit into
EricSun0218:mainfrom
hby7921:codex/reverse-optimize
Closed

提供有界的主线程游戏动作队列#34
hby7921 wants to merge 1 commit into
EricSun0218:mainfrom
hby7921:codex/reverse-optimize

Conversation

@hby7921

@hby7921 hby7921 commented Aug 15, 2026

Copy link
Copy Markdown

改动

新增 QueuedGameActionHandler,为 IGameActionHandler 提供通用的宿主线程动作交接实现。

支持:

  • 有界 FIFO 动作队列;
  • Pump(maximumWorkItems) 控制每次处理数量;
  • 排队阶段取消;
  • 运行时停止时清理等待动作;
  • 已开始执行的动作不因调用方超时被取消;
  • ExecuteAsyncRecoverAsync 使用同一个主线程入口;
  • 单个动作异常不会阻塞后续动作;
  • 继续复用现有 GameActionReceiptoperationIdgenerationId

宿主只需要在游戏 Tick 中调用 Pump,并在执行回调中完成游戏状态验证和实际修改。

测试

增加了队列上限、Pump 限制、取消竞态、关闭竞态、恢复线程、异常隔离,以及 Durable Dispatcher 重复 operationId 测试。

Fixes #33

@hby7921
hby7921 requested a review from EricSun0218 as a code owner August 15, 2026 15:53
@EricSun0218

EricSun0218 commented Aug 15, 2026

Copy link
Copy Markdown
Owner

非常感谢你认真完成并提交这套实现。也向你真诚道歉:这是我的疏忽,我没有及时看到 #34 已经提交,就又实现并合并了 #35,造成了重复劳动。

我随后逐项对照了两套实现。这个 PR 对 FIFO、队列容量、排队取消、停止、恢复入口、异常隔离和 durable operation 去重的方向是正确的;当前 main 的实现覆盖了这些能力,并额外提供:

  • 组合任意异步 IGameActionHandler,而不只接受同步委托;
  • 分别限制 pending 与 active action,避免异步动作无界在途;
  • 首次 Pump 绑定宿主线程,并拒绝跨线程或重入 Pump;
  • IAsyncDisposable 等待已开始动作完成;
  • 重启后的 reconcile、取消后的恢复,以及 Godot/Unity 真编辑器 smoke 覆盖。

对应文档示例已经放在 docs/getting-started.md,相关 CI 与引擎门禁也已全部通过。由于两边新增了同名公共类型,PR 目前已经冲突;继续合并或机械 rebase 会重复 API 并丢失现有安全边界,因此这里将其作为 superseded by #35 关闭,而不是因为贡献质量问题关闭。

再次感谢你把 #33 从问题描述推进到完整实现。这次重复完全是维护侧没有及时发现 PR、协调不到位造成的,抱歉浪费了你的时间。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

是否需要为 IGameActionHandler 提供一个通用的主线程队列实现?

2 participants