Skip to content

release: v3.3.0 - #425

Merged
Eli Pinkerton (wallstop) merged 1 commit into
masterfrom
release/v3.3.0
Aug 16, 2026
Merged

release: v3.3.0#425
Eli Pinkerton (wallstop) merged 1 commit into
masterfrom
release/v3.3.0

Conversation

@bot-auto-commit

Copy link
Copy Markdown
Contributor

Automated release preparation for v3.3.0 (run: https://github.com/Ambiguous-Interactive/DxMessaging/actions/runs/31923135430).

Release checklist

  • package.json version is 3.3.0 and CHANGELOG.md has the ## [3.3.0] section below.
  • The changelog excerpt reads as release notes (user-facing wording, no leftover Unreleased churn).
  • Squash-merge with the default release: v3.3.0 title (release-tag.yml matches that subject on master).

Changelog for 3.3.0

Added

  • Add ready-to-run scenes to the Mini Combat and UI Buttons + Inspector samples, so neither needs
    Inspector wiring (#372).
  • Add a guided tour to the Diagnostics Tooling Exerciser sample that emits traffic and opens Message
    Monitor and Flow Graph (#346).
  • Add the standard .NET constructors to MessageRegistrationBuildException
    (#367).
  • Show the installed version's release notes in the Unity Package Manager Version History tab
    (#362).

Changed

  • Use a collision-driven first-message guide and remove maintainer details from user docs
    (#404,
    #411).
  • Color Untargeted routes blue, Targeted purple, and Broadcast green in the editor and the docs; red
    now marks problems (#353).
  • Shrink the package download by using Unity's Roslyn assemblies instead of bundling private copies
    (#371).
  • Allocate less when registering many message types that have not emitted yet
    (#374).
  • Deregister in linear instead of quadratic time when one token owns many same-priority handlers for
    one message type (#374).
  • Stop generated code from suppressing compiler warnings, so it follows your project's warning
    policy (#367).
  • Point the Package Manager Changelog link at the rendered changelog instead of raw Markdown
    (#362).
  • Dispatch faster when a message type has interceptors or post-processors: interceptors are
    resolved once when registrations change instead of being re-collected on every emission, and
    emissions no longer repeat handler and post-processor lookups the bus already resolved. One
    interceptor costs roughly half what it did, and four cost roughly a quarter
    (#408).

Fixed

  • Fix active MessageRegistrationToken registrations with null callbacks leaving partial token or
    bus state behind after throwing (#414).
  • Make initially empty and interceptor-rewritten post routes obey frozen snapshots: additions wait
    until the next emission, while removals finish the current post phase
    (#413).
  • Fix an interceptor registered or removed at a different priority than the running interceptor
    taking effect during that same emission; interceptor changes now wait for the next emission, as
    the snapshot semantics documentation already described
    (#408).
  • Fix DxMessagingStaticState.Reset() from inside an interceptor so it stops the rest of the
    dispatch instead of invoking callbacks against reset bus state
    (#395).
  • Fix Flow Graph so route and component details select and ping the object they name
    (#345).
  • Fix Message Monitor resizing so one divider controls the log detail area and wrapped stack frames
    keep their height (#344).
  • Fix disposing nested runtime-settings override tokens out of order restoring ended settings
    (#384).
  • Fix copied GlobalMessageBusScope and RegistrationDisposable values restoring or removing newer
    state, and remove the 1,024 nested-scope cap
    (#375).
  • Fix the Reflex integration and DI sample for Reflex 14 while keeping earlier Reflex releases
    working (#367).
  • Fix editor tooling failing to compile on Unity 6000.5 after Unity changed its object-discovery and
    object-lookup APIs (#365,
    #367).

What happens after merge

  1. release-tag.yml sees the release: v3.3.0 commit on master and pushes the annotated tag v3.3.0.
  2. Select the exact v3.3.0 ref and manually dispatch release.yml: validate (pack + attest), the trusted Unity editmode check, the .unitypackage export,
    npm publish (Trusted Publishing), then the GitHub Release with the .tgz, .sha256, and .unitypackage assets
    plus the asset-store-submission artifact.
  3. The Unity Asset Store upload stays MANUAL: download the asset-store-submission artifact and follow docs/runbooks/asset-store-publishing.md.

@github-actions

Copy link
Copy Markdown
Contributor

Performance Numbers

Measured commit: 3b94caa
Trusted reporting code (PR base): 4d35e6e
Measured historical baseline: 8ac1992
Workflow run: 31923209223 attempt 1

Benchmark methodology is unchanged; the historical Standalone comparison is diagnostic regression smoke.

Historical Standalone delta

Delta direction: + is better; - is worse.

Scenario Baseline Current Delta
Empty Bus Dispatch 46.46 M emits/sec 47.28 M emits/sec +1.76%
Untargeted Flood (One Handler) 30.03 M emits/sec 28.82 M emits/sec -4.02%
Untargeted Flood (One Direct Handler) 30.28 M emits/sec 32.05 M emits/sec +5.84%
Untargeted Flood (Two Handlers, One Priority) 28.23 M emits/sec 29.37 M emits/sec +4.07%
Untargeted Flood (Three Handlers, One Priority) 25.87 M emits/sec 24.77 M emits/sec -4.26%
Untargeted Flood (Four Handlers, One Priority) 24.88 M emits/sec 24.41 M emits/sec -1.90%
Untargeted Flood (Four Handlers, Four Priorities) 26.25 M emits/sec 22.43 M emits/sec -14.56%
Untargeted Flood (Sixteen Handlers, One Priority) 16.22 M emits/sec 13.67 M emits/sec -15.72%
Untargeted Flood (One Inactive Handler) 33.73 M emits/sec 31.15 M emits/sec -7.64%
Untargeted First Dispatch (Cold, Distinct Types) 0.187 ms 0.189 ms -1.07%
Targeted Flood (No Matching Target) 14.00 M emits/sec 12.90 M emits/sec -7.85%
Targeted Flood (One Listener) 10.82 M emits/sec 11.03 M emits/sec +1.94%
Targeted Flood (Sixteen Listeners) 7.87 M emits/sec 7.51 M emits/sec -4.64%
Targeted First Dispatch (Cold, Distinct Types) 0.186 ms 0.205 ms -10.22%
Broadcast Flood (One Handler) 24.92 M emits/sec 24.12 M emits/sec -3.23%
Broadcast First Dispatch (Cold, Distinct Types) 0.206 ms 0.193 ms +6.31%
Targeted Post Route (Stable) 17.80 M emits/sec 18.29 M emits/sec +2.72%
Targeted Post Route (Rewritten, Empty Final Route) 17.69 M emits/sec 18.37 M emits/sec +3.86%
Targeted Post Route (Rewritten, Populated Final Route) 12.90 M emits/sec 15.27 M emits/sec +18.34%
Broadcast Post Route (Stable) 21.71 M emits/sec 20.27 M emits/sec -6.61%
Broadcast Post Route (Rewritten, Empty Final Route) 17.70 M emits/sec 18.36 M emits/sec +3.72%
Broadcast Post Route (Rewritten, Populated Final Route) 13.48 M emits/sec 12.21 M emits/sec -9.40%
Interceptor Heavy (Four Interceptors) 25.33 M emits/sec 22.72 M emits/sec -10.30%
Post-Processing Heavy (Four Post-Processors) 20.59 M emits/sec 18.97 M emits/sec -7.86%
Message Bus Construction (1000) 17.885 ms 19.418 ms -8.57%
Registration Token Construction (1000, Prebuilt Handler + Bus) 0.049 ms 0.052 ms -6.12%
Registration Flood (1000 Types, Cold Bus) 528.032 ms 549.039 ms -3.98%
Registration Flood (1000 Types, Warm JIT) 2.756 ms 2.786 ms -1.09%
Untargeted Registration (Marginal, 1000 Same-Type) 0.374 ms 0.385 ms -2.94%
Targeted Registration (Marginal, 1000 Same-Type) 0.438 ms 0.423 ms +3.42%
Broadcast Registration (Marginal, 1000 Same-Type) 0.441 ms 0.443 ms -0.45%
Deregistration Flood (1000 Types, Cold) 1.783 ms 1.874 ms -5.10%
Deregistration Flood (1000 Types, Warm JIT) 1.024 ms 1.276 ms -24.61%
Registration Attribution (Direct Bus, 131072) 54.870 ms 54.227 ms +1.17%
Registration Attribution (Direct Handler, 131072) 89.994 ms 98.588 ms -9.55%
Registration Attribution (Token Stage, 131072) 11.396 ms 11.357 ms +0.34%
Registration Attribution (Token Active, 131072) 120.955 ms 115.943 ms +4.14%
Deregistration Attribution (Direct Bus, 131072) 7.077 ms 7.616 ms -7.62%
Deregistration Attribution (Direct Handler, 131072) 26.398 ms 27.518 ms -4.24%
Deregistration Attribution (Token Remove, 131072) 34.170 ms 31.064 ms +9.09%
Deregistration Attribution (Token Disable, 131072) 33.885 ms 51.068 ms -50.71%
Global -> 1 subscriber 38.62 M emits/sec 34.80 M emits/sec -9.88%
Global -> 16 subscribers 14.62 M emits/sec 14.18 M emits/sec -2.99%
Keyed/targeted -> 1 of many 10.01 M emits/sec 11.16 M emits/sec +11.47%
Priority-ordered dispatch 24.15 M emits/sec 22.31 M emits/sec -7.63%
Filtered/intercepted dispatch 22.91 M emits/sec 23.24 M emits/sec +1.45%
Post-processing dispatch 20.33 M emits/sec 22.27 M emits/sec +9.53%
Subscribe/unsubscribe churn 0.97 M emits/sec 0.98 M emits/sec +0.88%
Struct message (no boxing) 29.08 M emits/sec 29.87 M emits/sec +2.71%

Current TargetMap evidence

These raw rows are current-run diagnostics. Use fresh bracketed controls before accepting a micro-optimization.

[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_16_Churn keyCount=16 operation=Churn totalOperations=2150000 operationsPerSecond=428485.928 wallClockMs=5017.668 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=16 targetMapCapacity=32 observedInvocations=2170000
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_16_Hit keyCount=16 operation=Hit totalOperations=68590000 operationsPerSecond=13717395.337 wallClockMs=5000.220 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=16 targetMapCapacity=32 observedInvocations=68610000
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_16_Miss keyCount=16 operation=Miss totalOperations=71470000 operationsPerSecond=14293323.068 wallClockMs=5000.237 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=16 targetMapCapacity=32 observedInvocations=0
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_1_Churn keyCount=1 operation=Churn totalOperations=2060000 operationsPerSecond=411167.616 wallClockMs=5010.122 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=1 targetMapCapacity=4 observedInvocations=2080000
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_1_Hit keyCount=1 operation=Hit totalOperations=49730000 operationsPerSecond=9945758.716 wallClockMs=5000.121 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=1 targetMapCapacity=4 observedInvocations=49750000
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_1_Miss keyCount=1 operation=Miss totalOperations=64180000 operationsPerSecond=12835086.399 wallClockMs=5000.356 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=1 targetMapCapacity=4 observedInvocations=0
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_256_Churn keyCount=256 operation=Churn totalOperations=1940000 operationsPerSecond=387246.967 wallClockMs=5009.723 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=256 targetMapCapacity=512 observedInvocations=1960000
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_256_Hit keyCount=256 operation=Hit totalOperations=55860000 operationsPerSecond=11171272.303 wallClockMs=5000.326 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=256 targetMapCapacity=512 observedInvocations=55880000
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_256_Miss keyCount=256 operation=Miss totalOperations=76660000 operationsPerSecond=15330474.618 wallClockMs=5000.498 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=256 targetMapCapacity=512 observedInvocations=0
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_4096_Churn keyCount=4096 operation=Churn totalOperations=1610000 operationsPerSecond=320043.345 wallClockMs=5030.569 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=4096 targetMapCapacity=8192 observedInvocations=1630000
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_4096_Hit keyCount=4096 operation=Hit totalOperations=58730000 operationsPerSecond=11743693.773 wallClockMs=5000.982 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=4096 targetMapCapacity=8192 observedInvocations=58750000
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_4096_Miss keyCount=4096 operation=Miss totalOperations=73840000 operationsPerSecond=14766739.806 wallClockMs=5000.427 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=4096 targetMapCapacity=8192 observedInvocations=0
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_4_Churn keyCount=4 operation=Churn totalOperations=1940000 operationsPerSecond=386489.352 wallClockMs=5019.543 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=4 targetMapCapacity=8 observedInvocations=1960000
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_4_Hit keyCount=4 operation=Hit totalOperations=50580000 operationsPerSecond=10113824.719 wallClockMs=5001.075 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=4 targetMapCapacity=8 observedInvocations=50600000
[Standalone] DXM_TARGET_MAP_BENCHMARK scenario=TargetMap_4_Miss keyCount=4 operation=Miss totalOperations=59090000 operationsPerSecond=11817797.207 wallClockMs=5000.086 gcAllocations=-1 gcAllocatedBytes=-1 targetMapEntries=4 targetMapCapacity=8 observedInvocations=0
[Standalone] DXM_TARGET_MAP_CONSTRUCTION keyCount=1 wallClockMs=0.000104 operationsPerSecond=9652509.653 gcAllocations=-1 gcAllocatedBytes=-1 targetMapCapacity=4
[Standalone] DXM_TARGET_MAP_CONSTRUCTION keyCount=16 wallClockMs=0.000625 operationsPerSecond=1600000.000 gcAllocations=-1 gcAllocatedBytes=-1 targetMapCapacity=32
[Standalone] DXM_TARGET_MAP_CONSTRUCTION keyCount=256 wallClockMs=0.008150 operationsPerSecond=122699.387 gcAllocations=-1 gcAllocatedBytes=-1 targetMapCapacity=512
[Standalone] DXM_TARGET_MAP_CONSTRUCTION keyCount=4 wallClockMs=0.000222 operationsPerSecond=4512635.379 gcAllocations=-1 gcAllocatedBytes=-1 targetMapCapacity=8
[Standalone] DXM_TARGET_MAP_CONSTRUCTION keyCount=4096 wallClockMs=0.124000 operationsPerSecond=8064.516 gcAllocations=-1 gcAllocatedBytes=-1 targetMapCapacity=8192

@wallstop
Eli Pinkerton (wallstop) merged commit 8fcab51 into master Aug 16, 2026
41 checks passed
@wallstop
Eli Pinkerton (wallstop) deleted the release/v3.3.0 branch August 16, 2026 03:50
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.

1 participant