[performance] Сократить аллокации строк в model/particle API, сохранив совместимость #30
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при проверке дополнительного ревью. Незакоммиченные изменения из чужой рабочей копии недоступны.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.
Код:
🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/ab4a789 (API уровня 11: model-id, model-generation, set-models-by-id; частицы пока по строкам). CI зелёный.