Revert "perf(canvas): defer backing rebuilds while zooming"

This reverts commit 21a79d4cd5.
This commit is contained in:
Danila Poyarkov 2026-05-23 01:17:48 +03:00
parent 21a79d4cd5
commit 762c86e094
2 changed files with 12 additions and 65 deletions

View file

@ -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
)
}

View file

@ -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<SkiaRenderer['sceneBacking']>
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 = {