diff --git a/blocksuite/affine/shared/src/viewport-renderer/dom-utils.ts b/blocksuite/affine/shared/src/viewport-renderer/dom-utils.ts index fb15f9fb69..8601875373 100644 --- a/blocksuite/affine/shared/src/viewport-renderer/dom-utils.ts +++ b/blocksuite/affine/shared/src/viewport-renderer/dom-utils.ts @@ -1,7 +1,4 @@ -import { - GfxControllerIdentifier, - type Viewport, -} from '@blocksuite/block-std/gfx'; +import { type Viewport } from '@blocksuite/block-std/gfx'; import { Pane } from 'tweakpane'; import { getSentenceRects, segmentSentences } from './text-utils.js'; @@ -109,22 +106,7 @@ export function initTweakpane( .on('change', ({ value }) => { renderer.state = value ? 'paused' : 'monitoring'; }); - - debugPane - .addBinding({ keepDOM: true }, 'keepDOM', { - label: 'Keep DOM', - }) - .on('change', ({ value }) => { - const container = viewportElement.querySelector('gfx-viewport')!; - (container as HTMLElement).style.display = value ? 'block' : 'none'; - }); - - debugPane.addButton({ title: 'Fit Viewport' }).on('click', () => { - const gfx = renderer.std.get(GfxControllerIdentifier); - gfx.fitToScreen(); - }); - - debugPane.addButton({ title: 'Force Refresh' }).on('click', () => { - renderer.refresh(true).catch(console.error); + debugPane.addButton({ title: 'Invalidate' }).on('click', () => { + renderer.invalidate(); }); } diff --git a/blocksuite/affine/shared/src/viewport-renderer/viewport-renderer.ts b/blocksuite/affine/shared/src/viewport-renderer/viewport-renderer.ts index 5f97e8e6e7..28eba2cdeb 100644 --- a/blocksuite/affine/shared/src/viewport-renderer/viewport-renderer.ts +++ b/blocksuite/affine/shared/src/viewport-renderer/viewport-renderer.ts @@ -67,15 +67,17 @@ export class ViewportTurboRendererExtension extends LifeCycleWatcher { }); const debounceOptions = { leading: false, trailing: true }; - const debouncedLayoutUpdate = debounce( - () => this.updateLayoutCache(), - 500, + const debouncedRefresh = debounce( + () => { + this.refresh().catch(console.error); + }, + 1000, // During this period, fallback to DOM debounceOptions ); this.disposables.add( this.std.store.slots.blockUpdated.on(() => { - this.clearTile(); - debouncedLayoutUpdate(); + this.invalidate(); + debouncedRefresh(); }) ); } @@ -103,21 +105,30 @@ export class ViewportTurboRendererExtension extends LifeCycleWatcher { } else if (this.canUseBitmapCache()) { this.drawCachedBitmap(this.layoutCache!); } else { - // Unneeded most of the time, the DOM query is debounced after block update if (!this.layoutCache) { this.updateLayoutCache(); } - - await this.paintLayout(this.layoutCache!); - this.drawCachedBitmap(this.layoutCache!); + const layout = this.layoutCache!; + await this.paintLayout(layout); + this.drawCachedBitmap(layout); } } + invalidate() { + this.clearCache(); + this.clearCanvas(); + } + private updateLayoutCache() { const layout = getViewportLayout(this.std.host, this.viewport); this.layoutCache = layout; } + private clearCache() { + this.layoutCache = null; + this.clearTile(); + } + private clearTile() { if (this.tile) { this.tile.bitmap.close(); diff --git a/blocksuite/integration-test/src/__tests__/utils/renderer-entry.ts b/blocksuite/integration-test/src/__tests__/utils/renderer-entry.ts index 13d9f0ccc5..fbee8dbded 100644 --- a/blocksuite/integration-test/src/__tests__/utils/renderer-entry.ts +++ b/blocksuite/integration-test/src/__tests__/utils/renderer-entry.ts @@ -1,4 +1,7 @@ -import { ViewportTurboRendererExtension } from '@blocksuite/affine-shared/viewport-renderer'; +import { + ViewportTurboRendererExtension, + ViewportTurboRendererIdentifier, +} from '@blocksuite/affine-shared/viewport-renderer'; import { addSampleNotes } from './doc-generator.js'; import { setupEditor } from './setup.js'; @@ -7,6 +10,9 @@ async function init() { setupEditor('edgeless', [ViewportTurboRendererExtension]); addSampleNotes(doc, 100); doc.load(); + + const renderer = editor.std.get(ViewportTurboRendererIdentifier); + window.renderer = renderer; } init(); diff --git a/blocksuite/integration-test/src/__tests__/utils/setup.ts b/blocksuite/integration-test/src/__tests__/utils/setup.ts index 504a489607..6bfd34c7ca 100644 --- a/blocksuite/integration-test/src/__tests__/utils/setup.ts +++ b/blocksuite/integration-test/src/__tests__/utils/setup.ts @@ -9,6 +9,7 @@ import { effects } from '../../effects.js'; blocksEffects(); effects(); +import type { ViewportTurboRendererExtension } from '@blocksuite/affine-shared/viewport-renderer'; import { CommunityCanvasTextFonts, type DocMode, @@ -136,5 +137,6 @@ declare global { doc: Store; job: Transformer; collection: TestWorkspace; + renderer: ViewportTurboRendererExtension; } }