Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

perf(text): avoid repeated glyph outline loads during measurement

オープン
#113 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 2 日以内に返信

@Linductor-alkaid がすでに取り組んでいます。

2026年10月17日 から。

  • #114 @Linductor-alkaid による — オープン

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
20/100
issue の種類
機能追加
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
cpp

調査の方向性

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 を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

sudoevolve/EUI-NEO のほかの issue

sudoevolve/EUI-NEO の issue をすべて見る

似ている issue

C++ の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。