На днях откопал свой старый проект на Metal - снегопад для рабочего стола. Запустил, посмотрел в профайлер и схватился за голову.
Раньше я не смог освоить просчет логики на GPU 😬: вся математика считалась на CPU. Процессор в каждом кадре пересчитывал координаты тысяч частиц, удалял упавшие, создавал новые (привет, сборщик мусора) и каждый раз перегонял этот массив данных на видеокарту. Естественно, на большом количестве снежинок всё начинало захлебываться.
😊 Решил сегодня переписать.
Самое главное - убрал все просчеты с CPU. Перенес всю физику в Compute Shaders. Теперь процессор вообще не трогает частицы, он просто говорит видеокарте:
Прошло 0.016 секунды, обнови кадр
Как это работает внутри:
- Один буфер на старте. Вместо того чтобы постоянно создавать и убивать объекты, я один раз выделяю память под массив снежинок.
- Ресайкл. Когда снежинка улетает за нижнюю границу экрана, шейдер просто телепортирует её наверх с новыми параметрами. Никаких аллокаций памяти в рантайме.
- Параллелизм. Тысячи ядер GPU обновляют позиции снежинок одновременно, а не по очереди, как это делал CPU.
Результат забавный: ради интереса выкрутил счетчик до миллиона снежинок. Экран стал просто белым, но 60 FPS держатся стабильно.
В коде еще перенес на GPU мелочи вроде огибания курсора мыши и таяния снега на границах окон.
👉 Приложение open source и его код можно посмотреть в репозитории а скачать приложение прямо по ссылке
PS: Прямо сейчас приложение в ревью у Apple.