6.7 KiB
6.7 KiB
Changelog
本文件记录 ShrinkEventBus 在当前工作区中的包内变更。
[2.0.1] - 2026-08-28
Added
ShrinkEventSubscriberAttribute新增显式Lifetime,选择AwakeToDestroy的MonoBehaviour会由 ILPostProcessor 在编译期织入生成绑定的Attach与Dispose,禁用对象时保持订阅,销毁时自动释放。- 自动生命周期支持已有或缺失的
Awake/OnDestroy,并保留可重写基类生命周期调用;默认仍为Manual,避免既有 2.0 使用方升级后重复订阅。
[2.0.0] - 2026-08-23
Added
- 新增统一
IShrinkEvent契约、ShrinkEventSubscriber/ShrinkSubscribe特性与Post/PostAsync入口。 - 新增命名多 Bus:Game、Scene、Mod、World、Server 及自定义
ShrinkBusKey。 - Bus 创建时可选择 Inline、Unity MainThread、DedicatedThread 或 TaskPool 调度器,并支持有界队列、溢出策略、最大并发与关闭排空。
- Unity 中异步 handler 与调度优先使用 UniTask;新增
ShrinkMonoEventScope管理普通 MonoBehaviour 的绑定生命周期。 - ILPostProcessor 为特性标记的普通 C# / Mono 类型生成
IShrinkGeneratedSubscriber强类型绑定,发布热路径不使用反射调用。 - 新增可选
com.cneicy.shrink-eventbus-entities包,Burst Job 通过 NativeQueue writer/playback 进入同一 Bus。 - 新增
Tools~/DotNet/ShrinkEventBus.CoreValueTask 运行时与 Roslyn incremental generator,纯 .NET 宿主无需 Unity 或 UniTask。 - EventBus 可视化调试器使用 UI Toolkit 重写,新增 Bus 导航、实时指标、分发耗时、线程/执行模式/结果详情、问题筛选、跟随和 CSV 导出;详细采样只在窗口主动采集时启用。
- 新增独立 Play Mode benchmark,覆盖 0/1/8/30 handler、取消、异步和生成绑定开销。
- Inline Bus 使用专用运行时实现,非取消全同步 channel 在订阅变化时生成有序 multicast dispatcher;
ShrinkPostResult压缩为 32-bit 状态,保持 API 不变。
Breaking
- 删除
EventBase、EventBusSubscriber/EventSubscribe、RegisterEvent/SubscribeEvent/TriggerEvent、手工 Delegate 注册和旧反射通道。 - 所有事件改为实现
IShrinkEvent;取消和结果分别实现IShrinkCancelableEvent、IShrinkResultEvent<TResult>。
[1.3.0] - 2026-06-12
Breaking
- 移除
EventBase.GetListenerList()。事件对象不再内置ListenerList,改为持有派发时的快照数组;调试请使用GetSubscribers()(现在返回拷贝)。 - 数字优先级
0现在映射到NORMAL(原为LOW),与枚举重载的默认值保持一致。 - 所有 int 数字优先级重载(
RegisterEvent/SubscribeEvent)不再提供默认值0,必须显式传入数字——消除与枚举重载之间的重载二义性。不带优先级的调用现在唯一解析到枚举重载(NORMAL)。
Fixed
- 织入前会检查类型自身及基类链上是否存在实例
[EventSubscribe]方法,没有的类型不再织入,避免在Awake中抛出注册异常。 AutoRegister(含 Mod 框架反射路径)遇到没有任何匹配[EventSubscribe]方法的类型时,改为输出警告并跳过,不再抛异常;显式Register()仍保持严格抛错。ListenerList父子链脏标记传播与快照重建之间的竞态:同一总线内所有监听列表(含父子链)现共用一把锁。RegisterCore的 check-then-act 竞态(并发下同一实例可能被注册两次)。EventPool.Release的双重归还竞态;对象池增加容量上限(128),超出直接丢弃。- 父子事件同 phase 内的 handler 顺序:现在按数字优先级跨父子稳定归并(平局时子类型 handler 在前),数字优先级不再只在单层内生效。
Changed
- 派发热路径重构:事件对象的监听者快照从“逐个带锁二分插入内置 ListenerList”改为一次数组引用赋值;
EventId改为懒生成;事件元数据缓存改用ConcurrentDictionary。每个事件实例的构造分配显著减少。 - 删除死代码
EventCache<T>(README 此前描述的“泛型静态缓存热路径”自实例化总线改造后已不存在)。 - 恢复模块内
CodeGen/作为可选本地织入管线:命中ShrinkShared.CodeGen覆盖范围的程序集继续由共享管线优先处理,其余只引用ShrinkEventBus.Runtime的程序集改由本地EventBusILPostProcessor兜底,避免[EventBusSubscriber]自动注册失效。 GetEventSubscribers/GetAllSubscribersSnapshot/EventBase.GetSubscribers返回内部快照的拷贝,外部修改不再影响派发顺序。SetPhase/IsCanceled/Result的校验异常现在携带具体错误消息。- ILPP 的诊断列表与程序集解析器改为调用内局部状态,消除共享实例并发隐患。
[1.2.0] - 2026-05-18
Changed
MonoBehaviour自动注册/反注册的 IL 织入已并入共享ShrinkShared.CodeGen管线;当前工作区同时保留ShrinkEventBus本地CodeGen/作为可选兜底,以兼容纯ShrinkEventBus.Runtime引用程序集。- 保留现有
[EventBusSubscriber]用法与自动生命周期行为,不要求业务层改写订阅代码。
[1.1.6] - 2026-05-04
Changed
- 运行时总线升级为“默认静态门面 + 可实例化
IShrinkEventBus/Builder”双层结构,支持异常策略、事件类型校验、按 phase 分发。 - 手动注册能力从纯 delegate 扩展为
object / Type / MethodInfo三类入口,并在注册阶段严格校验签名、静态/实例模式和事件参数类型。 ListenerList改为按 phase 分桶 + 快照缓存模型,并支持父事件监听子事件。- 事件查看器不再反射私有字典,改走公开快照接口。
EventBusBenchmark扩展为覆盖实例 bus、扫描注册、继承监听、phase 分发、对象池与取消事件跳过等关键场景。
[1.1.5] - 2026-04-07
Changed
- 修正
PrepareForDispatch(),现在只重置派发期状态,不再误清业务载荷。 - 修正同步
TriggerEvent(...)遇到异步 handler 时的行为,改为向异步处理器分发脱离原对象的事件快照,避免直接复用原事件对象。 OnEventTriggered与编辑器追踪钩子改为在派发完成后触发,同时覆盖无监听者事件。ShrinkNetworkEventBusBridge的异步转发改为先克隆事件,降低桥接层状态污染风险。- 事件查看器的实时日志改为快照模型,支持关键词过滤、按“有监听者 / 无监听者”筛选、同类事件折叠聚合显示。
- 编辑器菜单迁移到
ShrinkSDK/事件总线/事件查看器。 - README 同步更新新的调试入口与同步/异步派发语义说明。