[performance] fit() многократно вызывает host text_width и пересоздаёт строки #27

Closed
opened 2026-10-29 12:24:35 +00:00 by chexit · 1 comment
Owner

Проверено на опубликованном 90379f6 при проверке дополнительного ревью. Незакоммиченные изменения из чужой рабочей копии недоступны.

monitor::fit отрезает по одному символу и вызывает render::text_width на каждом новом префиксе с многоточием. Это многократная передача строки через WIT/host для одной подписи, включая повторные измерения всей строки.

Вызов оригинальной функции в изолированном тесте с text_width fixture=6 GUI pixels/символ: 100 кириллических символов → ширина 60 → 93 вызова text_width. Тест запускался отдельно, чтобы счётчик не искажался параллельными UI-тестами. Это измерение количества host-вызовов, а не их длительности в игре.

Предложение: host API fit_text(text,max_width,suffix) за один проход с настоящим шрифтом, либо ограниченный поиск/кэш измерений с учётом Unicode boundaries и особенностей шрифта. Кэш должен инвалидироваться при смене ресурсов/шрифта и иметь лимит: динамические строки не должны создавать новую утечку.

Критерий: та же подпись помещается, корректны кириллица/emoji/очень узкое поле; количество boundary calls ограничено и не линейно числу удаляемых символов.

Код:

fn fit(t: String, w: f32) -> String {
.

Проверено на опубликованном `90379f6` при проверке дополнительного ревью. Незакоммиченные изменения из чужой рабочей копии недоступны. monitor::fit отрезает по одному символу и вызывает render::text_width на каждом новом префиксе с многоточием. Это многократная передача строки через WIT/host для одной подписи, включая повторные измерения всей строки. Вызов оригинальной функции в изолированном тесте с text_width fixture=6 GUI pixels/символ: 100 кириллических символов → ширина 60 → 93 вызова text_width. Тест запускался отдельно, чтобы счётчик не искажался параллельными UI-тестами. Это измерение количества host-вызовов, а не их длительности в игре. Предложение: host API fit_text(text,max_width,suffix) за один проход с настоящим шрифтом, либо ограниченный поиск/кэш измерений с учётом Unicode boundaries и особенностей шрифта. Кэш должен инвалидироваться при смене ресурсов/шрифта и иметь лимит: динамические строки не должны создавать новую утечку. Критерий: та же подпись помещается, корректны кириллица/emoji/очень узкое поле; количество boundary calls ограничено и не линейно числу удаляемых символов. Код: https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/src/monitor.rs#L24.
chexit added the area:uineeds:profilingpriority:P2type:performance labels 2026-10-29 13:10:58 +00:00
Author
Owner

🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/67a2a52 (запушено в main).

🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/67a2a52 (запушено в main).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#27