[performance] Заменить полный перебор HD lights на консервативные tile/cluster lists #10

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

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

В итоговом gfx/hd.rs::fs_light каждый пиксель поверхности перебирает весь count для точечного освещения. Затем каждый пиксель, включая небо, снова перебирает весь count для ореолов в воздухе. Список может содержать сотни lights, включая каждый трассер. Отсев по радиусу уже внутри pixel loop, поэтому не отменяет чтение и проверку всех источников.

Пример масштаба, не benchmark: 2560×1600 и 200 lights дают до 1,638,400,000 итераций двух списков за кадр, если весь экран проходит ветку surface. Для 4K — до 3,317,760,000. SIMD/early exits и реальное покрытие поверхностей влияют на время; миллиарды итераций не означают такое же число GPU-инструкций или обещанный прирост FPS.

Предложение: tiled/clustered списки источников для поверхностей (начать с tiles 16×16), построенные CPU или compute с последующим измерением. Радиусы и интенсивности, лимиты эффектов и разрешение сохранить. Для halos нужны отдельные консервативные bounds по view ray: нельзя использовать surface depth cluster или обычный frustum culling так, чтобы исчезали ореолы. Near-plane/camera-inside/overflow cases должны иметь безопасный fallback без потери источников. Можно также делать squared-distance reject до sqrt внутри оставшегося короткого списка.

Критерий: изображения эквивалентны baseline в пределах float tolerance, без пропаданий на границах tiles/near plane; fallback при переполнении списка; GPU/CPU time и средняя длина tile lists измерены по #9. Проверить сцены с несколькими источниками и сотнями.

Код:

и .

Проверка исходников на `90379f6`. Полный Horizon/GPU на Mac не запускался; оценки сложности и ресурсов ниже не являются замерами FPS. В итоговом `gfx/hd.rs::fs_light` каждый пиксель поверхности перебирает весь `count` для точечного освещения. Затем каждый пиксель, включая небо, снова перебирает весь `count` для ореолов в воздухе. Список может содержать сотни lights, включая каждый трассер. Отсев по радиусу уже внутри pixel loop, поэтому не отменяет чтение и проверку всех источников. Пример масштаба, не benchmark: 2560×1600 и 200 lights дают до 1,638,400,000 итераций двух списков за кадр, если весь экран проходит ветку surface. Для 4K — до 3,317,760,000. SIMD/early exits и реальное покрытие поверхностей влияют на время; миллиарды итераций не означают такое же число GPU-инструкций или обещанный прирост FPS. Предложение: tiled/clustered списки источников для поверхностей (начать с tiles 16×16), построенные CPU или compute с последующим измерением. Радиусы и интенсивности, лимиты эффектов и разрешение сохранить. Для halos нужны отдельные консервативные bounds по view ray: нельзя использовать surface depth cluster или обычный frustum culling так, чтобы исчезали ореолы. Near-plane/camera-inside/overflow cases должны иметь безопасный fallback без потери источников. Можно также делать squared-distance reject до sqrt внутри оставшегося короткого списка. Критерий: изображения эквивалентны baseline в пределах float tolerance, без пропаданий на границах tiles/near plane; fallback при переполнении списка; GPU/CPU time и средняя длина tile lists измерены по #9. Проверить сцены с несколькими источниками и сотнями. Код: https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/horizon-patches/0012-HD-lighting-stage-2-sun-and-moon-shadow-cascades-the.patch#L788 и https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/horizon-patches/0012-HD-lighting-stage-2-sun-and-moon-shadow-cascades-the.patch#L822.
chexit added the area:renderingneeds:profilingpriority:P1type:performance labels 2026-10-29 13:09:26 +00:00
Author
Owner

🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/a806635 (запушено в main).

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

No dependencies set.

Reference: chexit/airdef#10