From 70c3bb7417a347f3e5c4683cfe216fbec9b897e9 Mon Sep 17 00:00:00 2001 From: Exoridus <1218727+Exoridus@users.noreply.github.com> Date: Sun, 27 Sep 2026 02:36:06 +0200 Subject: [PATCH 1/2] fix(bench): publish the joint-chain comparison --- site/src/lib/bench-profiles.ts | 5 +---- test/site/bench-invalid-values.test.ts | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/site/src/lib/bench-profiles.ts b/site/src/lib/bench-profiles.ts index caf1d8320..d99089f23 100644 --- a/site/src/lib/bench-profiles.ts +++ b/site/src/lib/bench-profiles.ts @@ -674,10 +674,7 @@ const ARCHETYPE_TITLES: Readonly> = { * removing a losing card and quietly keeping a winning one is exactly what a * fixed headline set exists to prevent. */ -const WITHHELD_SCENARIOS: Readonly> = { - joints: - 'On the published profiles the chains had settled and every arm that sleeps was idle: Nape-JS took less than the clock resolved, and the other figures set a solver at work against one at rest. The scene now keeps the chains moving, and the comparison returns with the next reference measurement.', -}; +const WITHHELD_SCENARIOS: Readonly> = {}; /** Why a scenario publishes no cross-arm comparison, or `undefined` where it publishes one. */ export const withheldScenario = (archetype: string): string | undefined => WITHHELD_SCENARIOS[archetype]; diff --git a/test/site/bench-invalid-values.test.ts b/test/site/bench-invalid-values.test.ts index d3ce26232..d40833eb8 100644 --- a/test/site/bench-invalid-values.test.ts +++ b/test/site/bench-invalid-values.test.ts @@ -16,7 +16,16 @@ import { describe, expect, it } from 'vitest'; import { openingLoad, physicsCards, renderingCards } from '../../site/src/lib/bench-cards'; -import { benchProfiles, formatMs, isQuantitative, outcomeOf, type ProfileCell, publishedMs, type TimerCheck } from '../../site/src/lib/bench-profiles'; +import { + benchProfiles, + formatMs, + isQuantitative, + outcomeOf, + type ProfileCell, + publishedMs, + type TimerCheck, + withheldScenario, +} from '../../site/src/lib/bench-profiles'; /** A cell whose competitor arm reported `ms` under the given timer verdict. */ const cellOf = (ms: number, timer: TimerCheck, comparable = true): ProfileCell => ({ @@ -153,4 +162,8 @@ describe('every published profile', () => { expect(openingLoad(card)).toBeDefined(); } }); + + it('publishes the aligned joint-chain workload as a normal comparison', () => { + expect(withheldScenario('joints')).toBeUndefined(); + }); }); From 3d807948d87fe67f46613ecf63e7f083f2e4d2a0 Mon Sep 17 00:00:00 2001 From: Exoridus <1218727+Exoridus@users.noreply.github.com> Date: Sun, 27 Sep 2026 02:36:07 +0200 Subject: [PATCH 2/2] perf(rendering): complete persistent slot roadmap --- .../src/webgl2/WebGl2TileChunkRenderer.ts | 6 ++++-- src/rendering/plan/DerivedRootProduct.ts | 4 ++-- src/rendering/plan/DerivedSelectionState.ts | 18 +++++++++--------- src/rendering/webgl2/WebGl2Backend.ts | 5 ++++- src/rendering/webgl2/WebGl2MeshRenderer.ts | 6 ++++-- .../webgl2/WebGl2NineSliceSpriteRenderer.ts | 6 ++++-- .../webgl2/WebGl2RepeatingSpriteRenderer.ts | 6 ++++-- .../webgl2/WebGl2RetainedGroupResources.ts | 4 ++-- src/rendering/webgl2/WebGl2SpriteRenderer.ts | 6 ++++-- src/rendering/webgl2/WebGl2TextRenderer.ts | 8 +++++--- ...l2-text-retained-instruction-replay.test.ts | 4 +++- 11 files changed, 45 insertions(+), 28 deletions(-) diff --git a/packages/exojs-tilemap/src/webgl2/WebGl2TileChunkRenderer.ts b/packages/exojs-tilemap/src/webgl2/WebGl2TileChunkRenderer.ts index 07129c847..7425b94aa 100644 --- a/packages/exojs-tilemap/src/webgl2/WebGl2TileChunkRenderer.ts +++ b/packages/exojs-tilemap/src/webgl2/WebGl2TileChunkRenderer.ts @@ -408,7 +408,7 @@ export class WebGl2TileChunkRenderer extends AbstractWebGl2Renderer implements * (`drawElementsInstanced`), unlike the sprite path's `drawArraysInstanced`. * @internal */ - public replayRetainedBatch(payload: WebGl2RetainedBatchPayload): void { + public replayRetainedBatch(payload: WebGl2RetainedBatchPayload): boolean { const backend = this.getBackendOrNull(); const vao = payload.vao; const geometry = payload.geometry; @@ -779,7 +779,7 @@ export class WebGl2MeshRenderer extends AbstractWebGl2Renderer implements if (backend === null || vao === null || geometry === null || geometry === undefined || transformTexture === null || tintTexture === null) { // Defensive: a bundle in this state never validates (generation), so a // spliced replay cannot reach here; skip rather than crash mid-frame. - return; + return false; } const shader = this._defaultShader; @@ -819,6 +819,8 @@ export class WebGl2MeshRenderer extends AbstractWebGl2Renderer implements shader.sync(); backend.bindVertexArrayObject(vao); vao.drawInstanced(geometry.indexCount, 0, payload.instanceCount, RenderingPrimitives.Triangles); + + return true; } private _canBatchStatic(draw: PendingMeshDraw): boolean { diff --git a/src/rendering/webgl2/WebGl2NineSliceSpriteRenderer.ts b/src/rendering/webgl2/WebGl2NineSliceSpriteRenderer.ts index 245a8924e..19a207d3c 100644 --- a/src/rendering/webgl2/WebGl2NineSliceSpriteRenderer.ts +++ b/src/rendering/webgl2/WebGl2NineSliceSpriteRenderer.ts @@ -367,7 +367,7 @@ export class WebGl2NineSliceSpriteRenderer extends AbstractWebGl2Renderer impleme * dispatching here and bumps the stats from the instruction descriptor. * @internal */ - public replayRetainedBatch(payload: WebGl2RetainedBatchPayload): void { + public replayRetainedBatch(payload: WebGl2RetainedBatchPayload): boolean { const backend = this.getBackendOrNull(); const vao = payload.vao; const transformTexture = payload.bundle.transformTexture; @@ -558,7 +558,7 @@ export class WebGl2SpriteRenderer extends AbstractWebGl2Renderer impleme if (backend === null || vao === null || transformTexture === null || tintTexture === null) { // Defensive: a bundle in this state never validates (generation), so a // spliced replay cannot reach here; skip rather than crash mid-frame. - return; + return false; } backend.setBlendMode(payload.blendMode); @@ -614,6 +614,8 @@ export class WebGl2SpriteRenderer extends AbstractWebGl2Renderer impleme this._bindBaseTextureSamplers(backend, material, textures.length); vao.drawInstanced(4, 0, payload.instanceCount, RenderingPrimitives.TriangleStrip); this._unbindBaseTextureSamplers(backend, material, textures.length); + + return true; } private _bindBaseTextureSamplers(backend: WebGl2Backend, material: AnySpriteMaterial | null, slotCount: number): void { diff --git a/src/rendering/webgl2/WebGl2TextRenderer.ts b/src/rendering/webgl2/WebGl2TextRenderer.ts index 51c510294..36010fc63 100644 --- a/src/rendering/webgl2/WebGl2TextRenderer.ts +++ b/src/rendering/webgl2/WebGl2TextRenderer.ts @@ -726,19 +726,19 @@ export class WebGl2TextRenderer extends AbstractWebGl2Renderer