An open API service indexing awesome lists of open source software.

https://github.com/rmn20/particlesystem


https://github.com/rmn20/particlesystem

Last synced: 11 months ago
JSON representation

Awesome Lists containing this project

README

          

Для асинхронной обработки и рендера частиц без блокировки потоков используется тройная буферизация.

Обработка частиц происходит в нескольких потоках, актуальный буфер формируется на основе предыдущего. В буфере имеется пул эффектов, каждому потоку выделяется своя часть пула, за счёт чего достигается добавление и удаление эффектов без блокировки потоков. После обновления всех эффектов один из потоков производит равномерное распределение эффектов между потоками, если имеется дисбаланс числа эффектов, и смену буферов, объединённую с добавление эффектов по нажатию кнопки мыши.

Минус такой системы заключается в том, что часть пула одного из потоков может заполниться, ограничив добавление новых эффектов, даже если в общем пуле ещё присутствуют свободные эффекты. Кроме того, при заполнении пула потока, новые эффекты начинают перезаписывать старые в произвольном порядке, хотя это можно исправить, ограничив добавление новых эффектов при помощи дополнительной логики.

Блокировка потоков может произойти только в случае, если смена буферов совпадёт с получением буфера с актуальными данными для рендера частиц, или с запросом на добавление эффекта по нажатию кнопки мыши.

Я рассматривал использование SoA и SIMD для ускорения обработки частиц внутри эффектов, но логика удаления частиц за пределами экрана приводит к изменению порядка частиц, усложняя векторизацию, поэтому я решил не использовать SIMD.