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 预览画布' });