Revert "perf(canvas): defer backing rebuilds while zooming"
This reverts commit 21a79d4cd5.
This commit is contained in:
parent
21a79d4cd5
commit
762c86e094
|
|
@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
|
|
|
|||
Loading…
Reference in a new issue