From ab01a1a5b4e63ab743f94e5d0a56f6fdd55d089c Mon Sep 17 00:00:00 2001 From: lumixraku Date: Mon, 1 Apr 2024 18:01:54 +0800 Subject: [PATCH] test: try to fix scaling cachecanvas --- .../src/components/sheets/spreadsheet.ts | 32 +++++++++++++------ packages/engine-render/src/layer.ts | 4 +++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/packages/engine-render/src/components/sheets/spreadsheet.ts b/packages/engine-render/src/components/sheets/spreadsheet.ts index 0f2ae4598a7..ccb5e2391ff 100644 --- a/packages/engine-render/src/components/sheets/spreadsheet.ts +++ b/packages/engine-render/src/components/sheets/spreadsheet.ts @@ -225,8 +225,14 @@ export class Spreadsheet extends SheetComponent { }; } + + isForceDirty(): boolean { + return this._forceDirty; + } + makeForceDirty(state = true) { this.makeDirty(state); + console.log('!!!_forceDirty', state); this._forceDirty = state; } @@ -321,18 +327,18 @@ export class Spreadsheet extends SheetComponent { const dh = bottom - top + columnHeaderHeight; - if (diffBounds.length === 0 || (diffX === 0 && diffY === 0) || this._forceDirty) { - if (this.isDirty() || this._forceDirty) { + if (diffBounds.length === 0 || (diffX === 0 && diffY === 0) || this.isForceDirty()) { + if (this.isDirty() || this.isForceDirty()) { this._cacheCanvas.clear(); cacheCtx.setTransform(mainCtx.getTransform()); this._draw(cacheCtx, bounds); - this._forceDirty = false; + // this._forceDirty = false; } this._applyCache(mainCtx, left, top, dw, dh, left, top, dw, dh); } else { // 一直 true 的话,会有残影出现 // if (this.isViewPortDirty(viewPortKey)) { - if (this.isDirty()) { + if (this.isViewPortDirty(viewPortKey)) { console.time('viewMainscroll'); cacheCtx.save(); @@ -388,18 +394,20 @@ export class Spreadsheet extends SheetComponent { const dw = right - left + rowHeaderWidth; const dh = bottom - top + columnHeaderHeight; - if (diffBounds.length === 0 || (diffX === 0 && diffY === 0) || this._forceDirty) { - console.time('viewMainTop_clear'); - if (this.isViewPortDirty(viewPortKey) || this._forceDirty) { + if (diffBounds.length === 0 || (diffX === 0 && diffY === 0) || this.isForceDirty()) { + console.time('!!!viewMainTop_clear'); + // if (this.isViewPortDirty(viewPortKey) || this.isForceDirty()) { + if (this.isDirty() || this._forceDirty) { this._cacheCanvasTop.clear(); cacheCtxTop.setTransform(mainCtx.getTransform()); this._draw(cacheCtxTop, bounds); + this._forceDirty = false; } this._applyCacheFreeze(mainCtx, this._cacheCanvasTop, left, top, dw, dh, left, top, dw, dh); - console.timeEnd('viewMainTop_clear'); + console.timeEnd('!!!viewMainTop_clear'); } else { - if (this.isDirty()) { + if (this.isViewPortDirty(viewPortKey)) { console.time('viewMainTop_diff') cacheCtxTop.save(); cacheCtxTop.setTransform(1, 0, 0, 1, 0, 0); @@ -594,10 +602,14 @@ export class Spreadsheet extends SheetComponent { private _addMakeDirtyToScroll() { this._hasScrollViewportOperator(this, (viewport: Viewport) => { + // 只有 viewMain 才会进入这里 + console.log('!!!!!_addMakeDirtyToScroll', viewport.viewPortKey); viewport.onScrollBeforeObserver.add((eventData) => { // this.makeDirty(true); // eventData.viewport - this.markViewPortDirty(false, eventData.viewport?.viewPortKey); + console.log('!!_hasScrollViewportOperator', eventData.viewport?.viewPortKey); + // this.markViewPortDirty(true, eventData.viewport?.viewPortKey); + this.markViewPortDirty(true); }); }); } diff --git a/packages/engine-render/src/layer.ts b/packages/engine-render/src/layer.ts index 0c37292b96a..d7ae30b78ee 100644 --- a/packages/engine-render/src/layer.ts +++ b/packages/engine-render/src/layer.ts @@ -236,6 +236,10 @@ export class Layer extends Disposable { private _draw(mainCtx: UniverRenderingContext, isMaxLayer: boolean) { this._scene.getViewports()?.forEach((vp) => vp.render(mainCtx, this.getObjectsByOrder(), isMaxLayer)); + console.log('!!!layer_forcedirty') + this.getObjectsByOrder().forEach( o => { + o.makeDirty?.(false); + }) } private _applyCache(ctx?: UniverRenderingContext) {