Skip to content

Repository files navigation

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

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

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

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

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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages