feat: build procedural lifecycle-safe drive scene
This commit is contained in:
29
src/scene/render-quality.ts
Normal file
29
src/scene/render-quality.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import type { LiveQualityTier } from '@/scene/types';
|
||||
|
||||
export interface RenderQualitySettings {
|
||||
pixelRatio: number;
|
||||
terrainSegments: number;
|
||||
particleCount: number;
|
||||
postEffects: boolean;
|
||||
}
|
||||
|
||||
const settings: Readonly<Record<LiveQualityTier, Omit<RenderQualitySettings, 'pixelRatio'> & { dprCap: number }>> = {
|
||||
high: { dprCap: 2, terrainSegments: 96, particleCount: 384, postEffects: true },
|
||||
medium: { dprCap: 1.5, terrainSegments: 64, particleCount: 192, postEffects: true },
|
||||
low: { dprCap: 1.25, terrainSegments: 32, particleCount: 64, postEffects: false },
|
||||
};
|
||||
|
||||
export function renderQualityFor(
|
||||
tier: LiveQualityTier,
|
||||
devicePixelRatio: number,
|
||||
mobileOrTablet: boolean,
|
||||
): RenderQualitySettings {
|
||||
const selected = settings[tier];
|
||||
const finiteDpr = Number.isFinite(devicePixelRatio) ? Math.max(1, devicePixelRatio) : 1;
|
||||
return {
|
||||
pixelRatio: Math.min(finiteDpr, selected.dprCap, mobileOrTablet ? 1.5 : 2),
|
||||
terrainSegments: selected.terrainSegments,
|
||||
particleCount: selected.particleCount,
|
||||
postEffects: selected.postEffects,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user