Skip to content

Fix/dfm optimize@9#758

Merged
MCDFsteve merged 17 commits into
AimesSoft:mainfrom
makabaka11:fix/dfm-optimize@9
Jul 19, 2026
Merged

Fix/dfm optimize@9#758
MCDFsteve merged 17 commits into
AimesSoft:mainfrom
makabaka11:fix/dfm-optimize@9

Conversation

@makabaka11

@makabaka11 makabaka11 commented Jul 18, 2026

Copy link
Copy Markdown
Member

Summary

  • 本条PR旨在彻底解决DFM+弹幕引擎的掉帧与卡顿现象(主要是安卓平台)
  • 修复了安卓端文件夹导入失效的问题:优先使用真实路径(外接存储使用自动挂载在 /storage 下的UUID目录),SAF机制作为失效回退

Test

  • iPad Pro 启用ProMotion后:稳定120±5FPS
  • Xiaomi 15:
    • 弹幕:目前稳定60±5FPS,但观感明显提升,弹幕移动流畅,无卡顿抽动
    • 本地媒体库管理:本机目录和外接 U 盘均正常

Related Issues

Issue Analysis

DFM+ 弹幕引擎(Rust 计算 + GPU 渲染 + Dart overlay)存在偶发跳帧(弹幕"一瞬间卡一下"),iPad Pro 100-120fps 不稳,Android 40-60fps 且掉帧感明显。

根因:新字符 MSDF 光栅化在渲染线程同步阻塞(entry_for cache miss -> rasterize_and_upload -> 等 worker,单 worker 串行 5-50ms/字符),新弹幕含未见字符时整条管线停顿。

核心方案:异步预热 + 同步兜底

思路:在字符进入屏幕前就异步光栅化好填入 atlas;显示时 entry_for 命中 cache,不阻塞。极端情况(预热未覆盖)保留同步兜底(阻塞等但字符照常显示,不返回 None、不跳过字符,避免闪烁)。

What Changed

Rust 侧

rust/src/next2_engine/engine/rendering.rs

  • MsdfWorkerPool 重构为 4 worker(每个持有 Arc<Vec>,全程算 shape+MSDF)
  • 新增 rasterize_sync(同步兜底)/ submit_async(预热 fire-and-forget)/ try_drain(drain 结果)
  • glyph_msdf_from_face -> rasterize_glyph_on_face(直接算 MSDF,去掉 pool 往返)
  • rasterize_and_upload 拆出 upload_glyph(复用上传逻辑)
  • Atlas 加 pending 字段、fonts 改 Arc;新增 request_rasterize + drain_prefetch

rust/src/next2_engine/engine/runtime.rs

  • BASE_ATLAS_SIZE 4096 -> 8192(降长视频驱逐频率)
  • run_engine_loop 顶部加 renderer.drain_prefetch()(每轮 drain 预热结果)

rust/src/next2_engine/engine/renderer_core.rs

  • 新增 drain_prefetch 转发方法
  • update_frame 末尾解析 prefetch_chars,批量调 request_rasterize

rust/src/next2_engine/engine/frame.rs

  • FramePayload 加 prefetch_chars: Option 字段

Dart 侧

lib/danmaku_next/next2_emoji_pipeline.dart

  • Next2PreparedFramePayload 加 prefetchChars + toJson 带 prefetch_chars
  • buildPayload 加 prefetchChars 参数透传

lib/danmaku_dfm/dfm_plus_layout_bridge.dart

  • _prefetched 集合(增量去重)
  • prefetchChars(currentTime, lookahead) 方法(二分查找未来窗口弹幕字符)
  • resetPrefetch + configure/dispose 清理

lib/danmaku_dfm/dfm_plus_overlay.dart

  • 常量 _prefetchLookaheadSec=3.0(滚动预热)/ _initialPrefetchLookaheadSec=15.0(首播预热)
  • _initialPrefetchDone 标志 + configure 后重置
  • _runUpdateLoop 每帧调 prefetchChars 传给 setFrame
  • _tryUpdateTexture 加 prefetchChars 参数

Android 原生

android/app/src/main/kotlin/com/aimessoft/nipaplay/MainActivity.kt

  • onCreate 请求最高刷新率(preferredDisplayModeId),让 app UI 能 120fps

Copilot AI review requested due to automatic review settings July 18, 2026 12:38
@makabaka11
makabaka11 requested a review from a team as a code owner July 18, 2026 12:38

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@makabaka11
makabaka11 marked this pull request as draft July 18, 2026 15:14
@makabaka11
makabaka11 marked this pull request as ready for review July 18, 2026 17:03
@MCDFsteve
MCDFsteve merged commit 40eeeba into AimesSoft:main Jul 19, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] 视频无法加载本地媒体库 [Bug] MIUI14 安卓12 无法加载本地媒体库 [Bug] Android媒体库无法添加读取本地文件夹

3 participants