From cfa375f34a493756877e47c6fd03d26d0a8943e7 Mon Sep 17 00:00:00 2001 From: RainbowBird Date: Sun, 1 Feb 2026 22:19:59 +0800 Subject: [PATCH] feat(stage-*): support max fps --- packages/i18n/src/locales/en/settings.yaml | 5 +++++ .../src/components/scenes/Live2D.vue | 3 +++ .../src/components/scenes/live2d/Canvas.vue | 14 ++++++++++++ .../settings/model-settings/index.vue | 2 ++ .../settings/model-settings/live2d.vue | 22 +++++++++++++++++-- .../stage-ui/src/components/scenes/Stage.vue | 2 ++ .../stage-ui/src/stores/settings/index.ts | 1 + .../stage-ui/src/stores/settings/live2d.ts | 3 +++ 8 files changed, 50 insertions(+), 2 deletions(-) diff --git a/packages/i18n/src/locales/en/settings.yaml b/packages/i18n/src/locales/en/settings.yaml index f69309b8d..e755dd2b3 100644 --- a/packages/i18n/src/locales/en/settings.yaml +++ b/packages/i18n/src/locales/en/settings.yaml @@ -74,6 +74,11 @@ live2d: title: Disable model mouse tracking button-disable: title: Disable + fps: + title: FPS + description: Limit rendering frame rate + options: + unlimited: No Limit microphone: Microphone models: Model pages: diff --git a/packages/stage-ui-live2d/src/components/scenes/Live2D.vue b/packages/stage-ui-live2d/src/components/scenes/Live2D.vue index 02c24dd68..4d7d9c6a6 100644 --- a/packages/stage-ui-live2d/src/components/scenes/Live2D.vue +++ b/packages/stage-ui-live2d/src/components/scenes/Live2D.vue @@ -26,6 +26,7 @@ withDefaults(defineProps<{ live2dAutoBlinkEnabled?: boolean live2dForceAutoBlinkEnabled?: boolean live2dShadowEnabled?: boolean + live2dMaxFps?: number }>(), { paused: false, focusAt: () => ({ x: 0, y: 0 }), @@ -37,6 +38,7 @@ withDefaults(defineProps<{ live2dAutoBlinkEnabled: true, live2dForceAutoBlinkEnabled: false, live2dShadowEnabled: true, + live2dMaxFps: 0, }) const componentState = defineModel<'pending' | 'loading' | 'mounted'>('state', { default: 'pending' }) @@ -70,6 +72,7 @@ defineExpose({ :width="width" :height="height" :resolution="2" + :max-fps="live2dMaxFps" max-h="100dvh" > (), { resolution: 2, + maxFps: 0, }) const componentState = defineModel<'pending' | 'loading' | 'mounted'>('state', { default: 'pending' }) @@ -20,6 +22,13 @@ const isPixiCanvasReady = ref(false) const pixiApp = ref() const pixiAppCanvas = ref() +function resolveMaxFps(limit?: number) { + if (!limit || limit <= 0) + return 0 + + return Math.max(1, Math.round(limit)) +} + function installRenderGuard(app: Application) { const guardedRender = () => { try { @@ -33,6 +42,7 @@ function installRenderGuard(app: Application) { app.ticker.remove(app.render, app) app.ticker.add(guardedRender) + app.ticker.maxFPS = resolveMaxFps(props.maxFps) } async function initLive2DPixiStage(parent: HTMLDivElement) { @@ -82,6 +92,10 @@ function handleResize() { } watch([() => props.width, () => props.height, () => props.resolution], handleResize) +watch(() => props.maxFps, (limit) => { + if (pixiApp.value) + pixiApp.value.ticker.maxFPS = resolveMaxFps(limit) +}) onMounted(async () => containerRef.value && await initLive2DPixiStage(containerRef.value)) onUnmounted(() => pixiApp.value?.destroy()) diff --git a/packages/stage-ui/src/components/scenarios/settings/model-settings/index.vue b/packages/stage-ui/src/components/scenarios/settings/model-settings/index.vue index 36f337419..16832fa2b 100644 --- a/packages/stage-ui/src/components/scenarios/settings/model-settings/index.vue +++ b/packages/stage-ui/src/components/scenarios/settings/model-settings/index.vue @@ -42,6 +42,7 @@ const { live2dAutoBlinkEnabled, live2dForceAutoBlinkEnabled, live2dShadowEnabled, + live2dMaxFps, } = storeToRefs(settingsStore) watch(selectedModel, async () => { @@ -110,6 +111,7 @@ watch(selectedModel, async () => { :live2d-auto-blink-enabled="live2dAutoBlinkEnabled" :live2d-force-auto-blink-enabled="live2dForceAutoBlinkEnabled" :live2d-shadow-enabled="live2dShadowEnabled" + :live2d-max-fps="live2dMaxFps" /> diff --git a/packages/stage-ui/src/components/scenarios/settings/model-settings/live2d.vue b/packages/stage-ui/src/components/scenarios/settings/model-settings/live2d.vue index 5fc576e31..a2e39e5e1 100644 --- a/packages/stage-ui/src/components/scenarios/settings/model-settings/live2d.vue +++ b/packages/stage-ui/src/components/scenarios/settings/model-settings/live2d.vue @@ -1,8 +1,8 @@