[performance] Заменить полный перебор HD lights на консервативные tile/cluster lists #10
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. Полный 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. Проверить сцены с несколькими источниками и сотнями.
Код:
🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/a806635 (запушено в main).