Skip to content

优化 WeaselUI:预热并复用候选窗 DirectWrite 资源#1886

Open
dragonknightk wants to merge 1 commit into
rime:masterfrom
dragonknightk:perf/candidate-ui-prewarm
Open

优化 WeaselUI:预热并复用候选窗 DirectWrite 资源#1886
dragonknightk wants to merge 1 commit into
rime:masterfrom
dragonknightk:perf/candidate-ui-prewarm

Conversation

@dragonknightk

@dragonknightk dragonknightk commented Jun 29, 2026

Copy link
Copy Markdown

摘要

  • 新增 UI::Prewarm(),在首次候选窗渲染前初始化 DirectWriteResources
  • 执行一次很小的离屏 DirectWrite 绘制,让首次可见绘制少承担初始化成本。
  • WeaselPanel 复用 UI 持有的 PDWR,避免预热资源和真实候选窗资源分离。
  • 在服务/状态同步后,以及文本服务获得焦点时触发预热。

背景

本地排查发现,首次显示候选窗时,Direct2D 的 DC render target 创建可能落在按键同步路径里。代表样本如下:

  • 桌面应用输入框:tsf.on_key_down 总耗时 280.56ms,其中 ID2D1Factory::CreateDCRenderTarget 耗时 247.77ms
  • 微信输入框:tsf.on_test_key_down 总耗时 192.03ms,其中 ID2D1Factory::CreateDCRenderTarget 耗时 166.99ms

这段耗时发生在候选 UI 启动期间,用户体感上就是首次候选窗出现时输入卡顿。本 PR 将这部分资源准备尽量提前,并让真实候选面板复用预热后的资源,避免首次可见候选窗渲染在同一个按键同步路径上承担完整初始化成本。

改动边界

  • 不改变候选内容、候选排序、分页和选择逻辑。
  • 不改变候选窗布局算法。
  • 不改变候选窗创建/销毁语义。
  • 不改变 IPC 消息协议。
  • 只调整候选窗渲染资源的准备和复用方式。

与已有 PR 的关系

#1839 都涉及候选面板生命周期,但本 PR 不改变 UI::Create() 的幂等行为,也不改变面板销毁语义。

#1869 都属于候选窗性能方向,但处理点不同:#1869 更关注候选窗重复显示和定位,本 PR 关注 DirectWrite/Direct2D 渲染资源的预热与复用。

测试

  • 已对修改文件运行 clang-format --style=file --Werror --dry-run
  • 已本地运行 xmake f -a x64 -m release && xmake
  • 已验证 WeaselUIWeaselTSF 相关代码路径可编译。

@dragonknightk dragonknightk marked this pull request as ready for review June 29, 2026 06:39
@dragonknightk dragonknightk changed the title perf(WeaselUI): prewarm candidate DirectWrite resources 优化 WeaselUI:预热并复用候选窗 DirectWrite 资源 Jun 29, 2026
@fxliang

fxliang commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

关于ui,我有重构一版在我的仓库的pb分支,拆完了,可能再等等看?

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.

2 participants