https://github.com/rmn20/particlesystem
https://github.com/rmn20/particlesystem
Last synced: 11 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/rmn20/particlesystem
- Owner: rmn20
- Created: 2025-06-03T16:33:40.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2025-06-03T23:30:29.000Z (about 1 year ago)
- Last Synced: 2025-06-04T07:11:54.960Z (about 1 year ago)
- Language: C
- Size: 222 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
Для асинхронной обработки и рендера частиц без блокировки потоков используется тройная буферизация.
Обработка частиц происходит в нескольких потоках, актуальный буфер формируется на основе предыдущего. В буфере имеется пул эффектов, каждому потоку выделяется своя часть пула, за счёт чего достигается добавление и удаление эффектов без блокировки потоков. После обновления всех эффектов один из потоков производит равномерное распределение эффектов между потоками, если имеется дисбаланс числа эффектов, и смену буферов, объединённую с добавление эффектов по нажатию кнопки мыши.
Минус такой системы заключается в том, что часть пула одного из потоков может заполниться, ограничив добавление новых эффектов, даже если в общем пуле ещё присутствуют свободные эффекты. Кроме того, при заполнении пула потока, новые эффекты начинают перезаписывать старые в произвольном порядке, хотя это можно исправить, ограничив добавление новых эффектов при помощи дополнительной логики.
Блокировка потоков может произойти только в случае, если смена буферов совпадёт с получением буфера с актуальными данными для рендера частиц, или с запросом на добавление эффекта по нажатию кнопки мыши.
Я рассматривал использование SoA и SIMD для ускорения обработки частиц внутри эффектов, но логика удаления частиц за пределами экрана приводит к изменению порядка частиц, усложняя векторизацию, поэтому я решил не использовать SIMD.