perf(text): avoid repeated glyph outline loads during measurement
メンテナーはふだん 2 日以内に返信
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 20/100
- issue の種類
- 機能追加
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- cpp
- 領域
- frontend, performance
調査の方向性
Start from the measurement path named in the issue: InputModel::updateChangedParagraphs, measureLines, measureTextMetrics, and shapeWithFallback, then inspect where FT_Load_Glyph supplies advances. The issue reports a proposed bounded per-font cache and detailed validation results; review the original measurements and benchmark cases provided with the PR. Done means glyph measurement avoids repeated loads while preserving caret and rendering behavior across the listed cases.
索引モデルが issue の本文から書いたものです。
説明
问题
基于最新 dev ad7e9e7,中文/英文长段输入或尺寸查询仍会对每个字符重复调用 FT_Load_Glyph。同一字体、物理字号、相同字形在一个段落内重复出现也会重新加载;CFF 字体需要反复解释轮廓。已有绘制 atlas 缓存没有覆盖 advance 查询。
下游复现:Noto Sans SC 2.004、约16 KiB中英混排单段,连续输入时调用栈多次命中 InputModel::updateChangedParagraphs -> measureLines -> measureTextMetrics -> shapeWithFallback -> FT_Load_Glyph。短文本和Emoji也受同一测量路径影响。
已完成本地修复和验证
按先验证再提交反馈的顺序,已在最新 dev 上完成最小修复:每个固定字号 FontFace 增加512槽直接映射缓存,只保留原始 advance/height,字体owner销毁即释放;碰撞常数时间覆盖,不扩大为全文缓存。Tab、组合字符、彩色fallback高度钳制及绘制slot语义保留。
GCC13.3 / Release / 同机3轮交错A/B,每case预热5次、统计60次;覆盖短Latin/中英、Emoji/组合字符/Tab、8KiB长文、3000个不同汉字、普通/大字号,两种字体。典型CFF混排长文测量p50 4.962→0.183ms,短中英 0.053→0.0024ms;大量不同字形 9.874→9.791ms,没有将该场景宣传为显著加速。72组前后caret/UTF-8索引指纹完全一致,另有独立FreeType oracle。缓存每face约6KiB,峰值RSS小幅增加,有原始数据。
四种 GLFW/SDL2 × OpenGL/Vulkan 独立Release构建、测试各36/36,安装SDK消费者各1/1;下游Release/ASAN/UBSAN定向通过,四张界面截图逐字节一致。会随PR提供复现命令和原始JSONL数据。
希望上游评审该字体测量层有界缓存;不增加依赖、公共API或线程,也不改变字体资源/输入容量。下游页面仍有历史列表组合成本,本issue只处理字形测量热点。
- 主要言語
- C++
- スター
- 2k
- フォーク
- 177
- 平均マージ
- 19時間 58分
- マージ済み PR(30日)
- 9
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
sudoevolve/EUI-NEO のほかの issue
-
SDL2 Windows build fails: move/resize fallback helper is inside the X11 guard対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
sudoevolve/EUI-NEO#110 ·
メンテナーはふだん 2 日以内に返信
-
在linux上使用触摸屏没法直接滑动翻页オープン
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
sudoevolve/EUI-NEO#116 · コメント 1 件 ·
メンテナーはふだん 2 日以内に返信
-
Windows transparent margins composite as black: bundled GLFW redirection alpha is uninitialized対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 4/5 3〜5日 初心者へのやさしさ 22/100
sudoevolve/EUI-NEO#109 · コメント 1 件 ·
メンテナーはふだん 2 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 32/100
sudoevolve/EUI-NEO#106 ·
メンテナーはふだん 2 日以内に返信
-
難易度 5/5 1週間以上 初心者へのやさしさ 18/100
sudoevolve/EUI-NEO#89 · コメント 1 件 ·
メンテナーはふだん 2 日以内に返信
sudoevolve/EUI-NEO の issue をすべて見る
似ている issue
-
v9.6.0: CMake incorrectly enforces presence of libevdev対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
メンテナーはふだん 1 日以内に返信
-
Rowan (2017) electron heating gives NaN for beta > beta_max; clip() then sets electrons to kel_minオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
parthenon-hpc-lab/kharma#213 · コメント 1 件 ·
メンテナーはふだん 3 日以内に返信
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
metasequoiaime/msime#9113 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
tone-3000/tone3000-plugin#257 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
Locked plugin flip-flops position on every refresh after being disabled対応中かも @Illustar0 が今日担当しました。 オープンissue report
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
ModOrganizer2/modorganizer#2449 ·