[performance] fit() многократно вызывает host text_width и пересоздаёт строки #27
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проверено на опубликованном
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 ограничено и не линейно числу удаляемых символов.
Код:
🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/67a2a52 (запушено в main).