diff --git a/src/composables/useBackgroundImage.ts b/src/composables/useBackgroundImage.ts index fb54363..9dad461 100644 --- a/src/composables/useBackgroundImage.ts +++ b/src/composables/useBackgroundImage.ts @@ -20,7 +20,9 @@ export type KenBurnsType = const CONFIG = { MAX_CACHE_SIZE: 10000, // 最大缓存 10000 张图片 CLEANUP_BATCH_SIZE: 2000, // 每次清理 2000 张 - FETCH_INTERVAL: 5000, // 5秒获取一次 + FETCH_INTERVAL: 5000, // 5秒获取一次(未达到缓存阈值时) + FETCH_INTERVAL_SLOW: 30000, // 30秒获取一次(图片缓存充足时) + CACHE_THRESHOLD: 30, // 缓存阈值,达到后切换到慢速获取 DISPLAY_INTERVAL: 10000, // 10秒切换一次 MAX_BLOB_URLS: 20, // 最大同时保持的 Blob URL 数量 PRELOAD_COUNT: 10, // 预加载图片数量 @@ -162,6 +164,11 @@ export function useBackgroundImage() { // 限制缓存大小 await cleanupCacheIfNeeded() + // 如果刚好达到阈值,重启获取定时器以切换到慢速模式 + if (newCache.length === CONFIG.CACHE_THRESHOLD) { + startFetchInterval() + } + // 如果队列为空,重新洗牌 if (shuffledQueue.value.length === 0) { reshuffleQueue() @@ -298,9 +305,14 @@ export function useBackgroundImage() { void fetchAndCacheImage() + // 根据缓存数量决定获取间隔 + const interval = imageCache.value.length >= CONFIG.CACHE_THRESHOLD + ? CONFIG.FETCH_INTERVAL_SLOW + : CONFIG.FETCH_INTERVAL + fetchInterval = window.setInterval(() => { void fetchAndCacheImage() - }, CONFIG.FETCH_INTERVAL) + }, interval) } // 启动图片显示定时器 diff --git a/src/main.ts b/src/main.ts index 3b91a67..86e1611 100644 --- a/src/main.ts +++ b/src/main.ts @@ -11,6 +11,7 @@ import { } from './stores/plugins' import { useUIStore } from './stores/ui' import { useStatsStore } from './stores/stats' +import { useSettingsStore, DEFAULT_API_CONFIG } from './stores/settings' // Noto Sans SC 字体(本地安装) import '@fontsource/noto-sans-sc/300.css' @@ -27,10 +28,6 @@ import './styles/theme.css' // 苹果同款液态玻璃效果 import './styles/glassmorphism.css' -// 预加载随机图片 API -const preloadImage = new Image() -preloadImage.src = `https://api.illlights.com/v1/img?t=${Date.now()}` - // 自定义进度条(使用 anime.js) import { createProgressFetch } from './composables/useProgress' @@ -66,6 +63,12 @@ app.use(pinia) // 配置 fetch 进度条(拦截所有 fetch 请求) createProgressFetch() +// 预加载随机图片 API(需在 Pinia 初始化后调用) +const settingsStore = useSettingsStore() +const preloadImage = new Image() +const backgroundImageApiUrl = settingsStore.settings.backgroundImageApiUrl || DEFAULT_API_CONFIG.backgroundImageApiUrl +preloadImage.src = `${backgroundImageApiUrl}?t=${Date.now()}` + app.mount('#app') // ============================================