Skip to content

2026.1.2000

Choose a tag to compare

@qq362946 qq362946 released this 28 Aug 23:38
· 24 commits to main since this release

Fantasy 2026.1.2000

本次更新统一了漫游创建、断线重连与生命周期管理,新增服务端启动钩子、协议拷贝方法和服务发现 API,并修复网络连接、WebGL、协程锁及热更新相关问题。

更新范围:自 2026.1.1001 发布后,至 f0a67dd0(发布 2026.1.2000,2026-08-29),共 24 条提交:18 条非合并提交(含 1 条版本发布提交)、6 条合并记录。

新增与改进

  • 服务端启动钩子:新增 IEntryInitializeHook,支持在配置加载完成、Scene 创建之前自动发现并执行自定义启动逻辑,可用于配置校验、数据库连接检查和外部服务验证。
  • 协议拷贝方法:C# 协议导出自动生成 DeepCopy() 和 CopyTo(ref ...) 方法,便于在业务中复制协议对象。相关贡献:PR #203。
  • 服务发现 API:开放 ServiceDiscovery.SelectOne、SelectByHash、GetAddress,新增 GetAllAddress,方便业务自行选择服务实例及获取地址集合。相关问题:#206。
  • 漫游创建与重连统一:通过 GetOrCreateRoaming 获取或创建漫游上下文,统一 Session 绑定、重连恢复与延迟销毁流程;保留可配置的重连窗口,默认 3 分钟。
  • 漫游连接与生命周期整理:统一由 Link 建立或恢复目标端连接,完善关闭、解绑及 Terminus 清理流程;新增 ErrRoamingOwnerChanged,用于标识来自失效漫游上下文的控制请求。

问题修复

漫游与场景

  • 修复客户端重连后,旧 Session 的延迟清理任务误删新 Session 漫游组件的问题,避免由此引发的异常断线与空引用错误。相关贡献:PR #198。
  • 使用 Session 与漫游上下文的 RuntimeId 校验生命周期请求,防止旧 Gate 的延迟暂停、解绑或销毁请求影响新 Gate 已接管的 Terminus。
  • 修复同一 Root Scene 下的 SubScene 之间漫游传送后,第二次传送失败的问题;各 SubScene 独立管理 Roaming 与 Terminus,并在关闭时完成相应清理。
  • 修复同一 Process 内漫游传送后,其他服务器无法正常发送漫游消息的问题;恢复目标端漫游消息锁,并在旧路由失效时返回路由错误,供发送端重新查询。
  • 修复 Scene 创建期间线程上下文不正确导致的 WebSocket 异常,补齐 Scene/SubScene 初始化及服务发现异步操作后的 Scene 线程切换。

网络与客户端

  • 修复 HTTPServerNetwork 销毁时可能阻塞的问题,支持异步停止与释放,并接入 Scene 关闭流程。
  • 修复 WebSocket 服务端连接断开后,底层 TCP 连接未正确关闭的问题,完善接入失败及连接销毁时的资源释放。相关问题:#207。
  • 补齐客户端 RPC 响应完成回调的异常捕获与日志输出,覆盖普通和 Debug 消息调度器。相关问题:#212。

Unity 与 WebGL

  • 修复启用 FANTASY_WEBGL 时替换 Unity 编辑器主线程 SynchronizationContext,导致编译管线出现 InvalidCastException 的问题。相关问题:#204。
  • 修复 WebGL 构建中 Runtime.Connect() 或 Scene.Create() 一直等待、无法返回的问题,统一使用主线程调度器的同步上下文。
  • 完善 Unity 编辑器配置对象加载失败时的默认实例回退,以及程序集自动拷贝入口的空值检查,避免启动时因配置对象不可用而报错。

运行时与热更新

  • 修复协程锁超时后只记录日志、未释放锁的问题;超时从成功持锁时开始计时,超时后自动释放,并避免随后 Dispose() 重复释放。相关贡献:PR #200。
  • 修复 Default ID 模式下,World ID 大于 255 时被强制转换为 byte 而静默截断的问题;相关 World ID 传递及 World.Id 改为使用 uint。相关问题:#205。
  • 修复热更新程序集清单无法替换的问题;注销时可校验程序集实例,防止旧程序集卸载时误删新清单,并同步更新 SourceGenerator 生成的卸载逻辑。相关贡献:PR #215。

升级注意事项

本次包含不兼容的漫游 API 与内部协议变更,使用漫游功能的项目请先完成调用迁移。

原有调用 迁移方式
session.CreateRoaming(...)、session.TryCreateRoaming(...) 改用 await session.GetOrCreateRoaming(roamingId, delayRemove);返回值为漫游上下文,不再返回首次创建/重连状态。
roaming.ReLink(...) 改用 roaming.Link(targetSceneAddress, forwardSessionAddress, roamingType, args),由目标端自动处理首次创建或恢复。
roaming.Link(session, sceneConfig, roamingType, args) 改用地址参数重载,例如 roaming.Link(sceneConfig.Address, session.RuntimeId, roamingType, args)。
SessionRoamingComponent.Disconnect() 移除整个漫游上下文时,改用 await session.RemoveRoaming(),或 await scene.RemoveRoaming(roamingId)。
  • 保持稳定的漫游身份:重连前后应使用相同的 roamingId。delayRemove 的单位为毫秒,小于等于 0 时立即销毁。目标端事件中的 CreateTerminusType.ReLink 仍保留,不等同于已删除的源端 ReLink() 方法。
  • 统一升级漫游服务端节点:内部漫游请求调整了字段布局并增加归属校验。请同步升级 Gate 与参与漫游的后端服务,避免新旧版本混用。
  • 检查 World ID 类型:如业务代码将 World.Id 保存为 byte,需要同步调整。World ID 模式仍保留原有的 8 位 World ID 限制,本次并未扩大该模式的编码范围。
  • 检查协程锁超时设置:超时现在会释放锁,但不会取消仍在执行的业务逻辑。请核对长耗时操作的 timeOut 设置,避免超时后业务继续运行而失去互斥保护。
  • 更新生成产物:使用新增协议拷贝方法前,请通过新版协议导出工具重新生成代码;更新框架及 SourceGenerator 后,请重新编译热更新程序集,以使用新的卸载逻辑。

文档与示例

工具与发布

  • 将 Fantasy.Net、Fantasy.Cli、Fantasy.Unity 及协议工具的相关版本标识更新为 2026.1.2000。
  • 更新仓库内的 Fantasy-Net、Fantasy.Cli NuGet 包,以及 Unity SourceGenerator 和协议导出工具的二进制文件。

贡献者

感谢 @shazhongcheng、@WuTangKel、@AmaniDawn 的贡献。

完整提交记录

展开查看全部 24 条提交(含 6 条合并记录)

以下保留原始提交标题,按 Git 历史顺序从旧到新列出;日期采用提交的作者日期。

日期 提交 作者 原始提交标题
2026-07-22 f7fe350c qq362946 修复了HTTPServerNetwork 再销毁的时候,有可能卡主的问题
2026-07-25 651f2813 qq362946 修复了 Scene 在创建的时候,WebSocket因为可能在错误的线程下导致的问题。
2026-07-29 3cd1de04 qq362946 新增 IEntryInitializeHook 接口
2026-07-30 0c301152 shazhongcheng 修复重连后旧 Session 延迟删除新 Roaming 组件
2026-08-08 96259cb9 WuTangKel fix: 协程锁超时后自动释放
2026-08-08 6df3507b qq362946 Merge pull request #200 from WuTangKel/fix/coroutine-lock-timeout-not-release
2026-08-12 830c6ef4 Amani 增加协议生成时候,自动生成深拷贝方法,便于开发时候的深拷贝操作
2026-08-17 2a5d62a4 qq362946 Merge pull request #198 from shazhongcheng/修复session延迟删除bug
2026-08-17 493d5d4d qq362946 Merge pull request #203 from AmaniDawn/main
2026-08-17 2cc61137 qq362946 优化RoamingComponent 的代码
2026-08-17 182b3e7e qq362946 Merge branch 'main' of https://github.com/qq362946/Fantasy
2026-08-20 f38cb73f qq362946 统一漫游创建、重连与生命周期管理
2026-08-20 c1bf22ed qq362946 修复了漫游传送后,如果 subScene 在同一个 Scene 会出现第二次传送失败的问题
2026-08-20 7b1a4c58 qq362946 修复了漫游传送后,如果在同一个 Process 的时候,其他服务器无法正常发送漫游消息的问题
2026-08-20 2d13b36b qq362946 根据 #204 修复FANTASY_WEBGL 在编辑器替换主线程 SynchronizationContext,编译管线 InvalidCastException
2026-08-20 da30b498 qq362946 根据 #207 修复WebSocket 服务端连接断开后底层 TCP 未关闭
2026-08-20 e07b7fc1 qq362946 修复 WebGL Build,Runtime.Connect() 或 Scene.Create() 永远不返回的问题
2026-08-20 5f5282c4 qq362946 根据 #205 修复Default idFactory 文档允许 World ID > 255,运行时却 (byte) 静默截断的问题
2026-08-20 9c7f2695 qq362946 根据 #206 暴露更多的服务发现 API,目前能暴露都暴露都出来。
2026-08-24 f980109d shazhongcheng 修复热更新程序集清单无法替换问题
2026-08-29 7afefead qq362946 Merge pull request #215 from shazhongcheng/修复热更程序集替换问题
2026-08-29 245f9739 qq362946 修复 #212
2026-08-29 7e712587 qq362946 Merge branch 'main' of https://github.com/qq362946/Fantasy
2026-08-29 f0a67dd0 qq362946 发布 2026.1.2000

查看本次版本提交范围的完整代码差异