Skip to content

fix: bugsweep week 2026-W36 (fable redo) - #10083

Draft
decentraland-bot wants to merge 6 commits into
devfrom
fix/bugsweep-week-2026-w36-fable
Draft

decentraland-bot wants to merge 6 commits into
devfrom
fix/bugsweep-week-2026-w36-fable

Conversation

@decentraland-bot

Copy link
Copy Markdown
Contributor

Pull Request Description

What does this PR change?

Fable redo of the W36 bug sweep — an alternative to draft PR #10080, requested by the sweep owner to compare model outputs; the batch (issues opened Aug 31 – Sep 6, 2026) is identical. Merge exactly one of the two PRs and close the other: they change overlapping files, and this one is a superset (it adds the #9967 fix).

Each fix is its own commit whose body carries the issue link, Sentry link, repro and root-cause analysis. This PR is a draft: the red Lint job is intentionally left for the team's manual lint pass; full human DEV review and QA remain required before it is marked ready and merged.

Fixed (7 issues)

Not worked on (28 issues)

These were collected by the sweep but not fixed; each is reported with its reason (never silently dropped):

3 further issues from the week were out of scope by assignee (assigned to non-sweep owners) and are not listed here.

Test Instructions

Per-fix validation is via the CI gate (Unity build + tests, forced with the force-build label on this draft) plus human DEV review and QA. Each fix commit body documents the specific crash/repro it addresses. The #9967 fix (chat-bubble emoji) needs a QA visual check: send an emoji in nearby chat with bubbles enabled and confirm it renders over the avatar.

Quality Checklist

  • Reviewed by human DEV
  • QA validated (incl. chat-bubble emoji visual check)
  • Lint pass (manual, team-owned)

Code Review Reference

Automated review flow, QA/DEV approval requirements, and label meanings: see the repo Branch & PR Standards.

Requested by Alejandro Jimenez via Slack (redo on Fable; branch postfixed -fable per request).

Issue: #9916
Title: System.NullReferenceException: Object reference not set to an instance of an object.
Sentry: UNITY-EXPLORER-PW7 (https://decentraland.sentry.io/issues/7701581691/)

Repro / context: startup blocklist check with the ReportUser feature flag
enabled. Crash at BlocklistCheckStartupOperation.cs:30 reading
`banStatusData.isBanned`.

Root cause: ApplicationBlocklistGuard.IsUserBlocklistedAsync declares a
non-nullable contract (UniTask<GetBanStatusData>) and three of its four
return sites honor it by returning `new GetBanStatusData { isBanned = false }`.
The fourth return blindly forwarded `result.Value.data`, a schema-optional
wire field: when the moderation endpoint returns a successful response whose
body omits `data` (missing key / "data": null / empty envelope), Newtonsoft
leaves `data` null while `result.Success` is true, so the error guard does
not fire. The null propagates out and both consumers
(BlocklistCheckStartupOperation:30, BannedNotificationHandler:67)
dereference `.isBanned` on their non-null-typed value and crash.

Fix: normalize the nullable wire field at the single boundary that owns the
non-nullable contract, mirroring the method's three existing fallback
returns, so callers can safely trust the annotation. Guard is at the
publisher, not relocated into the two subscribers, and does not add a
defensive check against the (proven non-null) `result.Value`.
Issue: #10001
Title: DCL.Diagnostics.EcsSystemException: [MainCameraSystem]
Sentry: UNITY-EXPLORER-Q04 (https://decentraland.sentry.io/issues/7715252408/)

Repro / context: NullReferenceException wrapped as EcsSystemException from
MainCameraSystem's HandleActiveVirtualCameraLookAtChange query, on scenes
carrying a virtual camera.

Root cause: the query dereferenced
cameraData.CinemachineBrain!.ActiveVirtualCamera.VirtualCameraGameObject
unconditionally. CinemachineBrain.ActiveVirtualCamera is a transient,
genuinely nullable Cinemachine runtime property: it is null whenever the
brain has no live vcam (during scene load before the brain's first resolve,
during blends/transitions, or a frame where all vcams are momentarily
disabled). The query runs for every PBVirtualCamera entity each throttled
update, so a null ActiveVirtualCamera dereferences into an NRE.

Fix: honor the property's nullability by reading it into a local and
returning early when it is null. This is nullability-honest (Cinemachine
owns the publisher; there is no scene-side value to guard) and mirrors the
existing in-repo idiom in BillboardSystem, which already null-guards
CinemachineBrain?.ActiveVirtualCamera before touching VirtualCameraGameObject.
Semantics are preserved: with no active vcam this entity is not the active
one, so the intended skip is exactly correct. The other operands on the line
(virtualCameraInstance, CinemachineBrain) remain non-null per their contracts
and are left untouched.
Issue: #10007
Title: System.InvalidOperationException: The current SynchronizationContext may not be used as a TaskScheduler.
Sentry: UNITY-EXPLORER-Q0D (https://decentraland.sentry.io/issues/7715704900/)

Repro / context: exception thrown from ENetTransport.DisconnectAsync,
reached via the handshake-failure path
(PulseMultiplayerService.ConnectInternalAsync -> HandshakeAsync ->
PulseMultiplayerService.DisconnectAsync -> ENetTransport.DisconnectAsync).

Root cause: the public DisconnectAsync converts its inner Task with
`.AsUniTask()`, whose default `useCurrentSynchronizationContext: true`
eagerly calls TaskScheduler.FromCurrentSynchronizationContext() on the
calling thread. The ENet routing loop runs on the thread pool
(DCLTask.RunOnThreadPool(configureAwait: false)), and the handshake
completion resumes DisconnectAsync on that context-less thread-pool thread,
where SynchronizationContext.Current is null and
FromCurrentSynchronizationContext() throws.

Fix: pass `useCurrentSynchronizationContext: false` so the disconnect
continuation is not marshalled back to a sync context it does not have.
This mirrors the codebase's own documented remedy for the identical hazard
in DCLWebSocket.cs. Disconnect has no main-thread requirement and the ENet
transport is single-thread-pool by design, so no behavior changes beyond
removing the invalid marshalling.
…9937)

Issues (same root cause, one fix):
- #9922 — System.NullReferenceException (RestrictedJsApiPermissionsProvider .ctor) — Sentry UNITY-EXPLORER-PWF (https://decentraland.sentry.io/issues/7702775015/)
- #9937 — System.NullReferenceException (SmartWearableCache) — Sentry UNITY-EXPLORER-PWK (https://decentraland.sentry.io/issues/7703252679/)

Repro / context: loading a smart wearable whose scene.json omits the
optional "requiredPermissions" key. Two distinct crash sites, one cause:
 - #9922: LoadSmartWearableSceneSystem passes the field into
   new RestrictedJsApiPermissionsProvider(...), whose ctor does
   `foreach (string permission in permissions)` and dereferences null.
 - #9937: SmartWearableCache.BuildCacheItemAsync does
   `permissions.Contains(...)` on the same field after parsing metadata.

Root cause: SceneMetadata.requiredPermissions is a schema-optional wire
field declared as a non-nullable List<string>. When scene.json omits the
key, Newtonsoft leaves it null, so the non-null declaration lies and every
unguarded consumer crashes. The canonical reader SceneData.HasRequiredPermission
already null-guards it, proving the field is genuinely nullable at runtime.

Fix: guarantee the field non-null at the publisher (the DTO) by defaulting
it to an empty list. Newtonsoft keeps the initializer when the key is absent
and populates it when present, so the non-null declaration becomes honest and
all consumers are fixed at once without scattering null-checks into each
subscriber. Behaviour is unchanged: an empty permission set denies every
restricted JS API (RestrictedJsApiPermissionsProvider.CanInvoke* all return
false) and HasRequiredPermission returns false, matching the prior
null-guarded semantics. Verified all four readers (SmartWearableCache,
LoadSmartWearableSceneSystem, SmartWearableAuthorizationPopupController,
SceneData) treat an empty list identically to the previous null.
#9953)

Issue: #9953
Title: DCL.Diagnostics.EcsSystemException: [LightSourceApplyPropertiesSystem]
Sentry: UNITY-EXPLORER-PTZ (https://decentraland.sentry.io/issues/7696501391/)

Repro / context: NullReferenceException wrapped as EcsSystemException from
LightSourceApplyPropertiesSystem while a light-source entity is being torn
down.

Root cause: the UpdateLightSource and ResolveTexturePromise queries match
entities on LightSourceComponent (+PBLightSource) without filtering
[None(typeof(DeleteEntityIntention))], violating the project ECS rule
"always filter out DeleteEntityIntention". The publisher
LightSourceLifecycleSystem.ReleaseDestroyedLightSource (runs
[UpdateBefore] via [All(DeleteEntityIntention)]) returns the pooled Light to
its pool but does not remove LightSourceComponent, and DeleteEntityIntention
can defer actual destruction across frames (DeferDeletion). So the entity
keeps flowing through UpdateLightSource, which dereferences the released/
destroyed Light (lightSourceInstance.enabled = ...); under IL2CPP a destroyed
UnityEngine.Object dereference surfaces as NullReferenceException.

Fix: add [None(typeof(DeleteEntityIntention))] to both queries so an entity
marked for deletion is skipped once its Light has been released, mirroring
the established idiom in sibling systems (e.g.
PropagateAvatarLocomotionOverridesSystem, UpdateMediaPlayerSystem). This is a
structural ECS filter at the correct layer, not a subscriber null-check.
Issue: #9967
Title: Emojis not visible in chat bubble - missing emoji font asset

Repro: send a chat message containing an emoji with chat bubbles enabled;
the emoji renders in the chat window but is broken/invisible in the
over-avatar bubble, and Player.log repeats "No suitable font asset found
for emoji support in the provided text." Reproducible 10/10 on Windows
and Mac (v0.175.0-alpha-main).

Root cause: chat bubbles and the chat window are two different text
pipelines. The window is TextMeshPro and gets its emoji fallback fonts at
runtime (FallbackFontsProvider -> TMP_Settings). The bubble is a UI Toolkit
Label on NametagElement, whose panel (DCLNametagsPanelSettings) is the only
panel overriding textSettings, pointing at DCLTextSettings
(a PanelTextSettings). That asset already wires the UITK emoji sprite atlas
(emojis32_uitk in m_EmojiFallbackTextAssets and m_DefaultSpriteAsset) but
has the master toggle m_EnableEmojiSupport set to 0, so TextCore never
substitutes emoji glyphs and raw codepoints render as missing.

Fix: flip m_EnableEmojiSupport from 0 to 1 in DCLTextSettings.asset (a
text-serialized YAML ScriptableObject; a one-field change). The atlas
wiring already present becomes effective. DCLTextSettings is referenced
only by DCLNametagsPanelSettings, so the change is scoped to the nametag/
chat-bubble panel. Needs a QA visual check: emoji in nearby chat renders
in the over-avatar bubble.
@decentraland-bot decentraland-bot added the force-build Used to trigger a build on draft PR label Sep 13, 2026
@github-actions

github-actions Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor

🚦 CI Status

Build

Windows and Mac built successfully in Unity Cloud.

Name Links & timing
Build 0559f43 · Logs · built 2026-09-13T23:58:25Z
Windows GitHub job · Unity Cloud #1 · Unity log · ⏱ 59m 2s build + 9m 7s queue · Download .zip · .zip via S3
Mac GitHub job · Unity Cloud #1 · Unity log · ⏱ 1h 27m build + 6m 3s queue · Download .zip · .zip via S3

Lint

Warnings not reduced: 12025 => 12027 — remove at least 3 warnings to merge.

Warnings/errors in files changed by this PR (43)
Assets/DCL/SDKComponents/LightSource/Systems/LightSourceApplyPropertiesSystem.cs:211  CSharpWarnings::CS8603  Possible null reference return
Assets/DCL/SDKComponents/LightSource/Systems/LightSourceApplyPropertiesSystem.cs:192  CSharpWarnings::CS8604  Possible null reference argument for parameter 'source' in 'DCL.SDKComponents.LightSource.Systems.LightSourceApplyPropertiesSystem.MakeCookieCubemap'
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:17  CSharpWarnings::CS8618  Non-nullable field 'allowedMediaHostnames' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:13  CSharpWarnings::CS8618  Non-nullable field 'main' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:15  CSharpWarnings::CS8618  Non-nullable field 'runtimeVersion' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:14  CSharpWarnings::CS8618  Non-nullable field 'scene' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:16  CSharpWarnings::CS8618  Non-nullable field 'sdkVersion' is uninitialized. Consider adding the 'required' modifier or declaring the field as nullable.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:73  CSharpWarnings::CS8618  Non-nullable property 'OriginalJson' is uninitialized. Consider adding the 'required' modifier or declaring the property as nullable.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:69  InconsistentNaming  Name 'BACKWARD' does not match rule 'Enum member'. Suggested name is 'Backward'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:68  InconsistentNaming  Name 'FORWARD' does not match rule 'Enum member'. Suggested name is 'Forward'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:17  InconsistentNaming  Name 'allowedMediaHostnames' does not match rule 'members_should_be_pascal_case'. Suggested name is 'AllowedMediaHostnames'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:25  InconsistentNaming  Name 'authoritativeMultiplayer' does not match rule 'members_should_be_pascal_case'. Suggested name is 'AuthoritativeMultiplayer'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:83  InconsistentNaming  Name 'cameraTarget' does not match rule 'members_should_be_pascal_case'. Suggested name is 'CameraTarget'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:27  InconsistentNaming  Name 'creator' does not match rule 'members_should_be_pascal_case'. Suggested name is 'Creator'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:80  InconsistentNaming  Name 'default' does not match rule 'members_should_be_pascal_case'. Suggested name is 'Default'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:26  InconsistentNaming  Name 'featureToggles' does not match rule 'members_should_be_pascal_case'. Suggested name is 'FeatureToggles'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:59  InconsistentNaming  Name 'fixedTime' does not match rule 'members_should_be_pascal_case'. Suggested name is 'FixedTime'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:20  InconsistentNaming  Name 'isPortableExperience' does not match rule 'members_should_be_pascal_case'. Suggested name is 'IsPortableExperience'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:23  InconsistentNaming  Name 'landscapeTerrain' does not match rule 'members_should_be_pascal_case'. Suggested name is 'LandscapeTerrain'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:13  InconsistentNaming  Name 'main' does not match rule 'members_should_be_pascal_case'. Suggested name is 'Main'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:78  InconsistentNaming  Name 'name' does not match rule 'members_should_be_pascal_case'. Suggested name is 'Name'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:82  InconsistentNaming  Name 'position' does not match rule 'members_should_be_pascal_case'. Suggested name is 'Position'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:18  InconsistentNaming  Name 'requiredPermissions' does not match rule 'members_should_be_pascal_case'. Suggested name is 'RequiredPermissions'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:15  InconsistentNaming  Name 'runtimeVersion' does not match rule 'members_should_be_pascal_case'. Suggested name is 'RuntimeVersion'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:14  InconsistentNaming  Name 'scene' does not match rule 'members_should_be_pascal_case'. Suggested name is 'Scene'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:16  InconsistentNaming  Name 'sdkVersion' does not match rule 'members_should_be_pascal_case'. Suggested name is 'SDKVersion'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:22  InconsistentNaming  Name 'skyboxConfig' does not match rule 'members_should_be_pascal_case'. Suggested name is 'SkyboxConfig'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:19  InconsistentNaming  Name 'spawnPoints' does not match rule 'members_should_be_pascal_case'. Suggested name is 'SpawnPoints'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:63  InconsistentNaming  Name 'transitionMode' does not match rule 'members_should_be_pascal_case'. Suggested name is 'TransitionMode'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:21  InconsistentNaming  Name 'worldConfiguration' does not match rule 'members_should_be_pascal_case'. Suggested name is 'WorldConfiguration'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:88  InconsistentNaming  Name 'x' does not match rule 'members_should_be_pascal_case'. Suggested name is 'X'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:89  InconsistentNaming  Name 'y' does not match rule 'members_should_be_pascal_case'. Suggested name is 'Y'.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:90  InconsistentNaming  Name 'z' does not match rule 'members_should_be_pascal_case'. Suggested name is 'Z'.
Assets/DCL/ApplicationGuards/ApplicationBlocklistGuard/ApplicationBlocklistGuard.cs:29  NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract  '??' left operand is never null according to nullable reference types' annotations
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:83  UAC1001  Field 'cameraTarget' type 'DCL.Ipfs.SceneMetadata.SpawnPoint.Position?' is skipped by serialization (missing the [Serializable] attribute). Refer to the Serialization rules analyzer reference.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:59  UAC1001  Field 'fixedTime' type 'float?' is skipped by serialization (missing the [Serializable] attribute). Refer to the Serialization rules analyzer reference.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:23  UAC1001  Field 'landscapeTerrain' type 'bool?' is skipped by serialization (missing the [Serializable] attribute). Refer to the Serialization rules analyzer reference.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:22  UAC1001  Field 'skyboxConfig' type 'DCL.Ipfs.SceneMetadata.SkyboxConfigData?' is skipped by serialization (missing the [Serializable] attribute). Refer to the Serialization rules analyzer reference.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:21  UAC1001  Field 'worldConfiguration' type 'DCL.Ipfs.SceneMetadata.WorldConfiguration?' is skipped by serialization (missing the [Serializable] attribute). Refer to the Serialization rules analyzer reference.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:88  UAC1001  Field 'x' type 'DCL.Ipfs.SceneMetadata.SpawnPoint.Coordinate' is skipped by serialization (missing the [Serializable] attribute). Refer to the Serialization rules analyzer reference.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:89  UAC1001  Field 'y' type 'DCL.Ipfs.SceneMetadata.SpawnPoint.Coordinate' is skipped by serialization (missing the [Serializable] attribute). Refer to the Serialization rules analyzer reference.
Assets/DCL/NetworkDefinitions/SceneMetadata.cs:90  UAC1001  Field 'z' type 'DCL.Ipfs.SceneMetadata.SpawnPoint.Coordinate' is skipped by serialization (missing the [Serializable] attribute). Refer to the Serialization rules analyzer reference.
Assets/DCL/SDKComponents/LightSource/Systems/LightSourceApplyPropertiesSystem.cs:114  UnusedParameter.Local  Parameter 'pbLightSource' is never used

Lint run · took 26m 36s

Tests

All Unity tests passed ✅

TESTS SUITE Result Passed Failed Skipped Tests time Job time
EditMode ✅ Passed 25859 0 13 4m 30s 15m 18s
PlayMode ✅ Passed 248 0 37 39s 9m 22s

Tests time sums the test cases; Job time is the job's wall clock including checkout, licensing and asset import.

Slowest tests
  • [editmode] 16.5s DCL.AuthenticationScreenFlow.Tests.ProfileFetchingAuthStateShould.CancelStalledFetchOnTimeout
  • [editmode] 15.2s DCL.Tests.Editor.ValidationTests.CheckForDebugUsage
  • [editmode] 11.6s DCL.Tests.Editor.ValidationTests.CheckUnityObjectsForMissingReferences
  • [editmode] 10.0s DCL.Notifications.Tests.NotificationsRequestControllerShould.ReuseSingleListInstanceAcrossPollIterations
  • [editmode] 5.1s DCL.AvatarRendering.AvatarShape.Tests.FinishAvatarMatricesCalculationSystemShould.NotCullAnInWorldAvatarInFrontOfTheCamera
  • [editmode] 5.0s DCL.Friends.Tests.FriendsConnectivityStatusTrackerShould.RaiseOnlineEventWhenSameStatusIsRebroadcastAfterReset
  • [editmode] 5.0s CrdtEcsBridge.WorldSynchronizer.Tests.CrdtWorldSynchronizerShould.ThrowIfSyncBufferIsAlreadyRented
  • [editmode] 5.0s DCL.AvatarRendering.AvatarShape.Tests.FinishAvatarMatricesCalculationSystemShould.PlaceTheAvatarBoundsInTheWorldTheSameWayTheReferenceFormDoes
  • [editmode] 4.4s DCL.AvatarRendering.AvatarShape.Tests.FinishAvatarMatricesCalculationSystemShould.KeepThePreviewAvatarLiveWhereverThePlayerCameraLooks
  • [editmode] 4.4s DCL.Tests.Editor.ValidationTests.SettingsAreValid
  • [playmode] 4.0s Global.Tests.PlayMode.CubeWaveSceneShould.EmitECSComponents
  • [playmode] 2.8s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.ContinuousTweensRunIndefinitelyWhenDurationIsZero
  • [playmode] 2.3s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TextureMoveSequenceUpdatesMaterial
  • [playmode] 2.1s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.MoveContinuousMovesAndCompletesAfterDuration
  • [playmode] 2.0s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceWithoutLoopCompletesOnce
  • [playmode] 1.9s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.TextureMoveContinuousOffsetCompletesAndUpdatesMaterial
  • [playmode] 1.9s DCL.SDKComponents.Tween.Tests.TweenUpdaterSystemShould.RotateContinuousCompletesAfterDuration
  • [playmode] 1.5s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceWithMoveRotateScaleWithOmittedScale_ResolvesScaleFromCurrentTransform
  • [playmode] 1.4s DCL.SDKComponents.Tween.Tests.TweenSequenceSystemShould.TweenSequenceCompletesAllTweens
  • [playmode] 1.4s DCL.AvatarRendering.AvatarShape.Tests.AvatarBaseLegacyAnimationPlayModeShould.ReplaceEmoteAnimation_DoesNotEnableAnimator_WhileLegacyAnimationIsPlaying

Full report: run summary · results + editor logs: editmode · playmode

Performance

🏁 Bare-metal benchmark finished — run #34791230804.

Full report

PR #10083, run #34791230804

Overall: ✅ no significant changes

Builds: Windows change, Windows baseline, macOS change, macOS baseline

How to read this table
  • Each build is measured 3 times, interleaved with the other build (change, baseline, change, baseline, ...) in the same session, so both see the same world content and machine state. The values are the median, and (min–max) is the lowest and highest of those runs.
  • Δ is Change minus Baseline (a negative Δ means Change is faster).
  • 🟢 faster / 🔴 slower — a difference that passed every check: the runs are fully separated (every run of one build faster than every run of the other), and the median difference is at least 3% and at least 0.5 ms.
  • ⚪ within noise — the builds' runs overlap, or the difference is tiny; it cannot be told apart from random variation. Treat it as no change.
  • — informational — the 0.1% worst metrics average only the few worst frames of a run, so a single OS hiccup swings them by a lot; they are shown for context and never earn a verdict.
  • ⚠️ no verdict — the two builds' sessions were not comparable (very different sample counts, or too few usable runs), so no conclusion is drawn from them.
  • Exceptions per run — the average number of exceptions in a run's log, not counting teardown ones logged while the app quits. Flagged only on a difference of at least 2 per run and 1.5× the other build; exception kinds the baseline never threw are called out under the table. The Exception breakdown groups all of them by the explorer's report category and exception type (as totals across the runs).
  • A run that logged unusually many exceptions (at least 10 and 5× the median of its build's runs — e.g. a service was down during it) is excluded from all numbers and called out under the table.
  • The Overall line at the top only reacts to a metric that moved on two or more machines, or by 10% or more on one — a single modest 🟢/🔴 cell can still be a statistical fluke.

Apple M1

Metric Baseline Change Δ Result
Samples 4061 (×3) 3885 (×3)
CPU average 22.0 ms (21.8–22.2) 23.0 ms (22.0–23.1) 1.0 ms ⚪ within noise
CPU 1% worst 219.8 ms (218.6–220.8) 219.1 ms (218.2–219.4) -0.8 ms ⚪ within noise
CPU 0.1% worst 227.0 ms (222.1–227.8) 225.3 ms (221.7–227.2) -1.8 ms — informational
GPU average 34.4 ms (34.3–34.5) 34.9 ms (34.1–36.9) 0.5 ms ⚪ within noise
GPU 1% worst 43.9 ms (43.8–44.4) 46.2 ms (43.6–46.7) 2.3 ms ⚪ within noise
GPU 0.1% worst 44.9 ms (44.8–45.3) 47.3 ms (44.4–47.3) 2.4 ms — informational
Exceptions per run 0 0 0 ⚪ no significant change

Intel Core i5

Metric Baseline Change Δ Result
Samples 4470 (×3) 4801 (×3)
CPU average 19.9 ms (17.7–20.3) 18.7 ms (16.0–20.1) -1.2 ms ⚪ within noise
CPU 1% worst 382.8 ms (315.9–403.4) 338.3 ms (249.7–398.6) -44.5 ms ⚪ within noise
CPU 0.1% worst 434.6 ms (401.9–469.9) 408.5 ms (284.0–474.2) -26.1 ms — informational
GPU average 12.1 ms (11.2–12.6) 11.3 ms (9.1–12.4) -0.8 ms ⚪ within noise
GPU 1% worst 182.1 ms (171.5–254.6) 172.3 ms (109.5–217.6) -9.7 ms ⚪ within noise
GPU 0.1% worst 437.9 ms (401.9–467.8) 405.1 ms (277.7–445.1) -32.8 ms — informational
Exceptions per run 0 0 0 ⚪ no significant change

Automation

On demand — comment /visual-tests on this PR to run the visual regression suite against its build.

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