[performance] Индексировать треки и назначения целей вместо вложенных линейных поисков #26
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при проверке дополнительного ревью. Незакоммиченные изменения из чужой рабочей копии недоступны.update_sight объединяет tracks соседних РЛС через seen.contains для каждого ID; в плотной сети верхняя оценка O(STD²). В step_sams claimed/guns_on сканируют все установки для каждого кандидата. Линейные find(id) повторяются между ракетами и дронами; seen/own клонируются на каждую установку.
Замер изолированного native release (не WASM и не Mac): 61 S400 в одной точке, 65 видимых Шахедов, 25 update_sight → около 0.995 мс/вызов на этой машине. Это специальная плотная сцена; не доказывает, что update_sight — главный bottleneck реальной игры. «15 млн операций» из чужого ревью — теоретическая оценка, не измеренное число операций CPU.
Предложение: deterministic union через bitset/epoch marks или set с отдельно сохраняемым стабильным порядком; ID→index для активных дронов/установок; один раз за тик собрать счётчики reservations/guns_on. При swap_remove обязательно обновлять индекс перемещённого объекта; не менять tie-break и результаты из-за рандомного порядка HashMap. Внешние команды/смерти тоже должны поддерживать индексы.
Критерий: тот же seed даёт тот же trace; тесты удаления/одновременного пуска/потери трека проходят; native и WASM профили показывают эффект на малых и больших сценах. Связано с #8/#9.
Код:
Дополнение: sim.lit также может содержать один ID от нескольких осветительных ракет/прожекторов; повторный contains не меняет результат, но добавляет работу. Можно включить lit в общий epoch/bitset подход после профилирования. Не выдавать наличие дубликатов или пересборку HUD каждый тик сами по себе за доказанный bottleneck.
🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/67a2a52 (запушено в main).