From 762c86e09419299b68b194b93eb272d3b20628c7 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Sat, 23 May 2026 01:17:48 +0300 Subject: [PATCH] Revert "perf(canvas): defer backing rebuilds while zooming" This reverts commit 21a79d4cd562ae61e5aaeb0083e482e55bc21a7b. --- .../src/canvas/renderer/retained-backing.ts | 43 ++++++------------- .../render/canvas/retained-backing.test.ts | 34 --------------- 2 files changed, 12 insertions(+), 65 deletions(-) diff --git a/packages/core/src/canvas/renderer/retained-backing.ts b/packages/core/src/canvas/renderer/retained-backing.ts index 4f1d7970e..3d25bfe82 100644 --- a/packages/core/src/canvas/renderer/retained-backing.ts +++ b/packages/core/src/canvas/renderer/retained-backing.ts @@ -45,7 +45,10 @@ export function updateSceneBackingPreviewState(r: SkiaRenderer, layer: RenderLay if (layer !== 'scene') return const previous = r.lastSceneViewport const viewportChanged = - !previous || previous.panX !== r.panX || previous.panY !== r.panY || previous.zoom !== r.zoom + !previous || + previous.panX !== r.panX || + previous.panY !== r.panY || + previous.zoom !== r.zoom if (viewportChanged) { const timestamp = now() if (r.sceneBackingLastViewportEventAt > 0) { @@ -76,31 +79,13 @@ function backingMetadataMatches( ) } -function scenePictureMetadataMatches( - r: SkiaRenderer, - sceneVersion: number, - positionPreviewVersion: number -): boolean { - return !!( - r.scenePicture && - r.scenePicturePageId === r.pageId && - r.scenePictureVersion === sceneVersion && - r.scenePicturePositionPreviewVersion === positionPreviewVersion - ) -} - function backingScreenCoverageContainsViewport(r: SkiaRenderer): boolean { const backing = r.sceneBacking if (!backing) return false const scale = r.zoom / backing.zoom const x = r.panX - backing.panX * scale const y = r.panY - backing.panY * scale - return ( - x <= 0 && - y <= 0 && - x + backing.width * scale >= r.viewportWidth && - y + backing.height * scale >= r.viewportHeight - ) + return x <= 0 && y <= 0 && x + backing.width * scale >= r.viewportWidth && y + backing.height * scale >= r.viewportHeight } function backingWorldCoverageContainsLiveViewport(r: SkiaRenderer): boolean { @@ -144,7 +129,12 @@ function drawSceneBacking( const backing = r.sceneBacking if ( !backing || - !backingCoverageContainsLiveViewport(r, sceneVersion, allowStaleZoom, positionPreviewVersion) + !backingCoverageContainsLiveViewport( + r, + sceneVersion, + allowStaleZoom, + positionPreviewVersion + ) ) { return false } @@ -449,16 +439,6 @@ export function renderSceneBacking( positionPreviewVersion ) if (!hasCoverage) { - const canDeferBackingRecordDuringViewportPreview = - allowStaleZoom && - backingMetadataMatches(r, sceneVersion, positionPreviewVersion) && - scenePictureMetadataMatches(r, sceneVersion, positionPreviewVersion) - if (canDeferBackingRecordDuringViewportPreview) { - cancelSceneBackingBuild(r) - r.sceneBackingNeedsCrispRender = true - return false - } - if ( !r.sceneBacking || !backingMetadataMatches(r, sceneVersion, positionPreviewVersion) || @@ -484,3 +464,4 @@ export function renderSceneBacking( positionPreviewVersion ) } + diff --git a/tests/engine/render/canvas/retained-backing.test.ts b/tests/engine/render/canvas/retained-backing.test.ts index 5f1194d50..7a6a44606 100644 --- a/tests/engine/render/canvas/retained-backing.test.ts +++ b/tests/engine/render/canvas/retained-backing.test.ts @@ -1,5 +1,4 @@ import { expect, mock, test } from 'bun:test' - import type { Canvas, Image as CKImage, Surface } from 'canvaskit-wasm' import type { SkiaRenderer } from '#core/canvas/renderer' @@ -148,39 +147,6 @@ test('retained scene backing allows same-zoom previews while panning', () => { expect(canvas.drawImageRectOptions).toHaveBeenCalled() }) -test('retained scene backing defers coverage-miss rebuilds during active viewport previews', () => { - const r = createRenderer(() => null) - r.zoom = 0.5 - r.sceneBackingPreviewUntil = Number.POSITIVE_INFINITY - r.scenePicture = {} as SkiaRenderer['scenePicture'] - r.scenePictureVersion = 1 - r.scenePicturePositionPreviewVersion = 0 - r.scenePicturePageId = 'page' - r.sceneBacking = { - image: { delete: mock() } as CKImage, - pageId: 'page', - sceneVersion: 1, - positionPreviewVersion: 0, - panX: 0, - panY: 0, - zoom: 1, - width: 100, - height: 100, - dpr: 1, - worldX: 0, - worldY: 0, - worldWidth: 100, - worldHeight: 100 - } as NonNullable - const canvas = createCanvas() - const graph = createGraph() - - expect(renderSceneBacking(r, canvas, graph, 1)).toBe(false) - expect(r.surface.makeSurface).not.toHaveBeenCalled() - expect(canvas.drawImageRectOptions).not.toHaveBeenCalled() - expect(r.sceneBackingNeedsCrispRender).toBe(true) -}) - test('retained scene backing invalidates stale position-preview metadata', () => { const r = createRenderer(() => null) r.sceneBacking = {