From 12e8287f92c3538b237f1ba903b53bf85067e3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 24 Sep 2026 16:02:10 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=BF=E5=85=8D=E8=B6=85=E5=A4=A7=E7=BC=A9?= =?UTF-8?q?=E6=94=BE=E8=AE=A9=E7=BD=91=E6=A0=BC=E6=AD=A5=E9=95=BF=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E6=AD=BB=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit previewGrid.ts 的 resolvePreviewGridStep 在 screenSpacing 溢出成 Infinity 时直接回基础步长:原先第二个 while 里 Infinity/2 仍是 Infinity,画布会卡死 previewWorkspaceZoom.test.tsx 补 Number.MAX_VALUE 缩放的回退用例 --- .../src/view/ui-editor/components/preview/previewGrid.ts | 5 +++++ .../tests/previewWorkspaceZoom.test.tsx | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/previewGrid.ts b/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/previewGrid.ts index d2ab93f2a..db64a13e3 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/previewGrid.ts +++ b/apps/ai-game-creator-shell/src/view/ui-editor/components/preview/previewGrid.ts @@ -14,6 +14,11 @@ export function resolvePreviewGridStep(viewportScale: number): number { let step = PREVIEW_GRID_BASE_STEP; let screenSpacing = step * viewportScale; + // 极大缩放下 step * scale 会溢出成 Infinity,而 Infinity / 2 仍是 Infinity: + // 下面两个 while 会因此永不收敛,这里先退回基础步长。 + if (!Number.isFinite(screenSpacing)) { + return PREVIEW_GRID_BASE_STEP; + } while (screenSpacing < PREVIEW_GRID_MIN_SCREEN_SPACING) { step *= 2; screenSpacing *= 2; diff --git a/apps/ai-game-creator-shell/tests/previewWorkspaceZoom.test.tsx b/apps/ai-game-creator-shell/tests/previewWorkspaceZoom.test.tsx index 5ca2728b2..3fdd46a61 100644 --- a/apps/ai-game-creator-shell/tests/previewWorkspaceZoom.test.tsx +++ b/apps/ai-game-creator-shell/tests/previewWorkspaceZoom.test.tsx @@ -128,6 +128,13 @@ describe('PreviewWorkspace quick zoom', () => { } }); + it('falls back to the base step when the screen spacing overflows', () => { + // 溢出成 Infinity 时步长无法收敛:必须直接回基础步长,不能死循环。 + expect(resolvePreviewGridStep(Number.MAX_VALUE)).toBe( + PREVIEW_GRID_BASE_STEP, + ); + }); + it('applies the adaptive screen-space spacing to the preview background', () => { const rendered = render(); const preview = screen.getByRole('region', { name: 'UI 预览画布' });