Skip to content

ADR-035: 设置面板功能缺口评估

日期: 2026-07-05 状态: 已完成 (Completed) — Phase A / B / C 全部落地(含 i18n 语言切换、自动更新开关、默认模型 auto-center),所有设置缺口均已补齐,见下方「实施进度」


背景

2026-07-05 代码质量重构(config.ts/ui-helpers/scene-render-levels 拆分 + slideRow/tryCatchStatus 去重)基本收官后,对现有设置面板进行了功能完整性评估。

当前设置面板结构

现有 6 个子面板:

面板文件功能
外观settings-appearance.ts主题/背景色/面板透明度/字体大小/语言
文件名settings-filename.ts文件名/目录名显示格式、开头字母、分隔符
性能settings-performance.ts渲染质量滑块(低-中-高-最高)、SHADOW_QUALITY/PARTICLE_LIMIT 关联
路径settings-paths.ts各资源目录(model/motion/outfit/backdrop/prop/screenshot)浏览设置
软件settings-software.ts版本号、更新频道、关于信息
settings.ts(入口)settings.ts左侧导航栏 + 各面板组合

设置通过 SettingsState(config.ts 分裂后移入 state.ts)驱动:settingsState.showFilenameFormat 等 5 个布尔值。

评估方法

docs/competitive-analysis.md 中 DanceXR (WebXR Viewer) 的 20+ 竞品对标,提取桌面 3D 查看器通用设置清单,逐项标记 MikuMikuAR 现状。


设置缺口清单

P0 — 直接影响可用性

设置项DanceXRMikuMikuAR缺口影响
音频/音量控制主音量 + BGM/SFX 分离❌ 无 UI(audio.ts 有 AudioContext 但无设置入口)用户无法调节 BGM/SFX 比例
语言切换多语言✅ 已实现(i18n 框架 + 语言设置面板,见「实施进度」)非中文用户可切换界面语言
截图/导出截图格式/质量/路径❌ 无截图功能入口用户想截图需 OS 级截屏
快捷键/键位映射可配置❌ 固定硬编码部分快捷键可能与其他软件冲突不可改

P1 — 显著影响体验

设置项DanceXRMikuMikuAR缺口影响
渲染独立开关阴影/抗锯齿/后处理独立⚠️ Lite/Medium/High/Ultra 捆绑想关 BLoom 保留阴影做不到
垂直同步开关❌ 无撕裂/功耗不可控
FPS 上限30/60/120/无限制❌ 无高刷屏无谓发热
渲染分辨率缩放50%-200%❌ 无4K 屏性能不达标时无法降低渲染负载
默认模型行为加载缩放/自动居中✅ 已实现(auto-scale + auto-center,性能页开关控制)大模型加载后自动归一化并居中取景
鼠标/触控灵敏度可调❌ 无不同 DPI 鼠标体验差异大
默认物理开关Physics.enabled❌ 无低配机不支持物理但每次需手动关
反 Y 轴开关❌ 无部分用户习惯反转 Y

P2 — 锦上添花

设置项描述优先级评估
重置所有设置一键恢复默认低(目前可删除 localStorage)
设置导入/导出JSON 配置文件低(用户量级暂不需)
UI 缩放独立于系统 DPI中(高 DPI 屏有需求)
模型缓存清理显式清除缓存的材质/纹理
自动更新开关检查更新频率✅ 已实现(关于页开关,见「实施进度」)

实施建议

架构影响

音频设置接入现有 audio.ts(已有 BGM.srcsfxVolume),只需写 UI 层。不需要新引擎功能。

画质独立开关涉及 render/performance.ts 降级逻辑。当前 QualityPreset(Lite/Medium/High/Ultra)是整体降级,需拆到单个 toggle 可覆盖的粒度。建议保持 preset 为默认,加 "Custom" 模式,单独 toggle 时自动切到 Custom。

推荐分期

Phase A(P0,建议 2-3 天):
  1. 音频设置: 主音量滑块 + BGM/SFX 独立滑块
  2. 截图功能: 格式(PNG/WebP) + 质量 + 自动保存目录
  3. 快捷键映射: 读取 → 显示 → 允许修改

Phase B(P1,建议 3-5 天):
  4. 画质独立开关: 重构 performance.ts 为 preset + override 模式
  5. FPS 上限 + 垂直同步: 接入 requestAnimationFrame 限帧
  6. 默认模型行为: model-loader.ts 加载后应用默认设定

Phase C(P2,后续):
  7. 语言切换框架(i18n)
  8. 模型缓存清理 UI
  9. UI 缩放

不 scope

  • 音频可视化效果器 — 不在 MV 查看器核心职责内
  • 性能监控面板(FPS 显示/GPU 温度) — 暂由浏览器 DevTools 覆盖
  • VR/AR 设备设置 — 当前无 VR 模式计划

实施进度 (v1.1.4 起)

缺口项优先级状态
音频/音量控制P0✅ 已完成(设置页音量/静音/偏移/BPM量化/伴音自动加载)
截图/导出P0✅ 已完成(格式+质量+Go SaveScreenshot)
快捷键/键位映射P0✅ 已完成(shortcut-registry + 设置页重绑)
语言切换 (i18n)P0✅ 已完成(core/i18n 框架 + 5 套 locale bundle + settings-language 面板 + 运行时 setLang 热切换)
帧率上限P1✅ 已完成(0–144 滑块)
渲染独立开关 (Custom)P1✅ 已完成
垂直同步P1✅ 已完成(applyFrameControl():vsync 关→engine.maxFPS=0 解除限帧;浏览器 RAF 天然同步,已注明限制)
渲染分辨率缩放P1✅ 已完成(engine.setHardwareScalingLevel + 性能页滑块 0.5–2x)
默认模型行为P1✅ 已完成(auto-scale + auto-center 均已实现;auto-center 由性能页「默认模型自动居中」开关控制,uiState.autoCenterModelfocus(id, frameCamera) 联动,arrange() 多模型排布不受影响)
鼠标/触控灵敏度P1✅ 已完成(ArcRotate/Universal 灵敏度倍率 + 性能页滑块,实时生效)
默认物理开关P1✅ 已完成(uiState.defaultPhysicsEnabled + 性能页开关 + model-loader 默认读取)
反 Y 轴P1✅ 已完成(InvertableArcRotateCameraPointersInput 子类,取反 onTouch/_computeMultiTouchPanning 的 Y 偏移)
UI 缩放P2✅ 已完成
模型缓存清理P2✅ 已完成
重置所有设置P2✅ 已完成(关于页「恢复默认设置」清空 uiState 并重新应用默认值)
设置导入/导出P2✅ 已完成(关于页导出/导入全量 uiState JSON;外观/性能模式持久化到 Go,其余会话级生效)
自动更新开关P2✅ 已完成(关于页开关 → SetUIAutoUpdateuiState.autoUpdateEnabled 持久化,main.ts 启动检查)