Разработчик Максим Гришутин (BarredEwe) выпустил утилиту Snowfall для macOS. Она добавляет на рабочий стол эффект снегопада. Код утилиты написан на Swift с использованием графического фреймворка Metal, а рендеринг происходит полностью на GPU.

Snowfall рисует поверх рабочего стола интерактивную анимацию снега. За расчёт движения частиц отвечает фреймворк Metal. Помимо этого реализована физика столкновения с границами открытых окон. Снежинки останавливаются у краёв, оседают небольшим слоем и со временем «тают». Частицы реагируют и на курсор мыши, а управлять скоростью их движения и траекторией можно с помощью параметра ветра.

В настройках есть предустановленные режимы: «Лёгкий снег», «Комфортный фон» и «Метель». При желании пользователи могут настроить собственный пресет, изменяя параметры скорости снежинок, размера, количества и силы ветра.

При этом всём CPU отвечает только за обновление параметров анимации, а расчёт тысяч частиц происходит полностью на GPU. Благодаря этому Snowfall получается относительно «дёшево» по ресурсам отрисовывать графику, а пользователь получает интерактивный эффект, а не заполнение экрана заранее подготовленной анимацией.

Как это работает внутри:

  • Один буфер на старте. Вместо того чтобы постоянно создавать и убивать объекты, я один раз выделяю память под массив снежинок.

  • Ресайкл. Когда снежинка улетает за нижнюю границу экрана, шейдер просто телепортирует её наверх с новыми параметрами. Никаких аллокаций памяти в рантайме.

  • Параллелизм. Тысячи ядер GPU обновляют позиции снежинок одновременно, а не по очереди, как это делал CPU.

Результат забавный: ради интереса выкрутил счётчик до миллиона снежинок. Экран стал просто белым, но 60 FPS держатся стабильно.

В коде ещё перенёс на GPU мелочи вроде огибания курсора мыши и таяния снега на границах окон.

Комментарий разработчика Максима Гришутин (источник)

Код проекта открыт и доступен на GitHub. Скачать файл приложения можно из меню релизов в репозитории или с помощью Homebrew:

brew install --cask barredewe/cask/snowfall