[performance] Отсекать невидимые эффекты до полноэкранного raymarch взрывов #11

Closed
opened 2026-10-29 11:59:06 +00:00 by chexit · 1 comment
Owner

Проверка исходников на 90379f6. Полный Horizon/GPU на Mac не запускался; оценки сложности и ресурсов ниже не являются замерами FPS.

effects.wgsl::post несколько раз обходит до 48 blasts и до 79 glow sources для каждого пикселя. Ветви включают project/screen_radius, shock wave/heat haze, ray-sphere, до 14 шагов интеграции с 3-октавным fbm, flash и glows. Даже маленький или невидимый взрыв попадает в общие полноэкранные циклы. Все 48 сфер не raymarch-ятся в каждом пикселе: ray_sphere уже отсекает непересекающиеся лучи, но предварительный перебор и часть вычислений остаются.

Предложение без сокращения эффектов: заранее вычислить frame-invariant параметры каждого эффекта (age, radius, centre, heat/fade, screen bounds); строить консервативные списки кандидатов для tiles/другую форму ограниченного экранного исполнения. Сохранять исходные world resolution, шаги интеграции, шум, число и время жизни эффектов. Переиспользовать precomputed данные между shock/volume/flash/glow стадиями.

Bounds должны учитывать не только огненный шар: дым поднимается/расширяется, shock ring растёт, heat haze и вспышка имеют иной охват. У вспышки есть глобальная засветка кадра, у glow экспоненциальные хвосты: их нельзя просто отрезать прямоугольником сферы и заявить идентичный визуал. Сохранять глобальную составляющую отдельно, а для неограниченных хвостов — исходный расчёт или явно проверенное эквивалентное суммирование. Camera-inside/near plane — fallback.

Критерий: сравнение кадров в массовом перехвате/дыму/вблизи взрыва; число кандидатов и post GPU time измерены. Координировать с исправлением порядка объёмов: списки не должны менять порядок compositing случайно.

Код:

fn post(uv: vec2<f32>, pixel: vec2<f32>) -> vec4<f32> {
,
fn shader_params(&self, out: &Out) -> Vec<f32> {
.

Проверка исходников на `90379f6`. Полный Horizon/GPU на Mac не запускался; оценки сложности и ресурсов ниже не являются замерами FPS. `effects.wgsl::post` несколько раз обходит до 48 blasts и до 79 glow sources для каждого пикселя. Ветви включают project/screen_radius, shock wave/heat haze, ray-sphere, до 14 шагов интеграции с 3-октавным fbm, flash и glows. Даже маленький или невидимый взрыв попадает в общие полноэкранные циклы. Все 48 сфер не raymarch-ятся в каждом пикселе: ray_sphere уже отсекает непересекающиеся лучи, но предварительный перебор и часть вычислений остаются. Предложение без сокращения эффектов: заранее вычислить frame-invariant параметры каждого эффекта (age, radius, centre, heat/fade, screen bounds); строить консервативные списки кандидатов для tiles/другую форму ограниченного экранного исполнения. Сохранять исходные world resolution, шаги интеграции, шум, число и время жизни эффектов. Переиспользовать precomputed данные между shock/volume/flash/glow стадиями. Bounds должны учитывать не только огненный шар: дым поднимается/расширяется, shock ring растёт, heat haze и вспышка имеют иной охват. У вспышки есть глобальная засветка кадра, у glow экспоненциальные хвосты: их нельзя просто отрезать прямоугольником сферы и заявить идентичный визуал. Сохранять глобальную составляющую отдельно, а для неограниченных хвостов — исходный расчёт или явно проверенное эквивалентное суммирование. Camera-inside/near plane — fallback. Критерий: сравнение кадров в массовом перехвате/дыму/вблизи взрыва; число кандидатов и post GPU time измерены. Координировать с исправлением порядка объёмов: списки не должны менять порядок compositing случайно. Код: https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/shaders/effects.wgsl#L75, https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/src/lib.rs#L351.
chexit added the area:renderingneeds:profilingpriority:P1type:performance labels 2026-10-29 13:09:30 +00:00
Author
Owner

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/ed2db85 (запушено в main, CI зелёный).

🤖 Agent: сделано в https://gitea.maoniao.team/chexit/airdef/commit/ed2db85 (запушено в main, CI зелёный).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#11