[performance] Сократить аллокации строк в model/particle API, сохранив совместимость #30

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

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

emit() каждый тик строит новый Vec/ParticleSpawn и делает m.name.to_string()/p.kind.to_string() на каждый объект. Повторяющиеся имена моделей/частиц кодируются в owned Strings и передаются через WIT снова и снова.

Важно: HashMap<&str,String> с последующим String::clone() НЕ устраняет аллокацию на объект. Предложение из чужого ревью «просто кэшировать String по static str» в таком виде недостаточно.

Сначала измерить allocation/boundary cost в #9. Возможные этапы: переиспользование буферов и строк с capacity на стороне мода; для существенного устранения повторной передачи — версионированный API регистрации имён/моделей один раз и обновлений экземпляров с числовыми handles. Старый string API оставить совместимым. Handles инвалидировать при reload ресурсов/смене registry; интернирование должно быть ограничено реестром, а не накапливать произвольные динамические строки.

Критерий: счётчики аллокаций/переданных байт падают при массовом бое без потери моделей, света, частиц и hot reload. Native время не выдавать за фактический выигрыш FPS Mac.

Код:

fn emit(&mut self, out: Out) {
.

Проверено на опубликованном `90379f6` при проверке дополнительного ревью. Незакоммиченные изменения из чужой рабочей копии недоступны. emit() каждый тик строит новый Vec<ModelInstance>/ParticleSpawn и делает m.name.to_string()/p.kind.to_string() на каждый объект. Повторяющиеся имена моделей/частиц кодируются в owned Strings и передаются через WIT снова и снова. Важно: HashMap<&str,String> с последующим String::clone() НЕ устраняет аллокацию на объект. Предложение из чужого ревью «просто кэшировать String по static str» в таком виде недостаточно. Сначала измерить allocation/boundary cost в #9. Возможные этапы: переиспользование буферов и строк с capacity на стороне мода; для существенного устранения повторной передачи — версионированный API регистрации имён/моделей один раз и обновлений экземпляров с числовыми handles. Старый string API оставить совместимым. Handles инвалидировать при reload ресурсов/смене registry; интернирование должно быть ограничено реестром, а не накапливать произвольные динамические строки. Критерий: счётчики аллокаций/переданных байт падают при массовом бое без потери моделей, света, частиц и hot reload. Native время не выдавать за фактический выигрыш FPS Mac. Код: https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/src/lib.rs#L387.
chexit added the area:renderingneeds:profilingpriority:P3type:performance labels 2026-10-29 13:11:15 +00:00
Author
Owner

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/ab4a789 (API уровня 11: model-id, model-generation, set-models-by-id; частицы пока по строкам). CI зелёный.

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/ab4a789 (API уровня 11: model-id, model-generation, set-models-by-id; частицы пока по строкам). CI зелёный.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#30