Положениепроизводительность для системы частиц
Я создал систему частиц с JavaFX, используя следующую методику:
Каждая частица является ImageView, который содержит изображение с радиальным градиентом:
Цикл обработки частиц - это AnimationTimer, в котором список частиц обрабатывается через метод stream(). List(), он фактически дает вся система повышает. Что-то вроде этого:
loop = new AnimationTimer() {
@Override
public void handle(long now) {
addParticle();
// apply force: gravity
allParticles.stream().parallel().forEach(Particle::applyForceGravity);
// move particle
allParticles.stream().parallel().forEach(Particle::move);
// update position in fx scene
allParticles.forEach(Particle::display);
// remove all particles that aren't visible anymore
removeDeadParticles();
}
};
Цвет частицы изменяется через ColorAdjust на протяжении всего жизненного цикла. Я использовал огневые цвета для тестирования, что-то вроде этого, который содержит 1700 частиц:
Что я узнал:
- не используя параллельно() является медленнее
- , используя круг с прозрачностью медленнее, чем при использовании ImageView
- с использованием режима наложения очень медленно
- с использованием PixelWriter для изменения цвета изображения небезопасен он медленный. Возникает вопрос: как ColorAdjust меняет цвет (через аппаратное обеспечение d3d &)? Я не нашел механизм в исходном коде JavaFX.
Вопрос
Есть ли лучший способ реализации системы частиц в JavaFX (другие типы узлов, тема и т.д.) в отношении производительности?
Я могу опубликовать код, если кто-то хочет поиграть.
Большое спасибо за экспертизу!
Edit: Так как был задан вопрос, вы можете получить полный код, который использует узлы в виде частиц с coloradjust от this gist. Кстати, даже если вы предварительно визуализируете изображения и не используете coloradjust, производительность низкая.
Однако вопрос скорее теоретический, поэтому копать через код на самом деле не нужно.
Можете ли вы изложить методы частиц? Возможно, вы видели эту статью об AnimationTimer? http://blog.netopyr.com/2012/06/14/using-the-javafx-animationtimer/ – NwDev
В приведенной здесь «KineticModel» [здесь] (http://stackoverflow.com/a/7425460/230513) также используется пользовательский, полупрозрачный 'RadialGradientPaint', но он предварительно вычисляет требуемые изображения; вы могли бы создать подходящую гамму, используя 'javafx.scene.paint.Color.hsb()'. – trashgod
@NwDX: да, я знаю эту страницу, спасибо. Это более или менее, как я это сделал. Завтра отправлю код, сначала я должен свести его к минимуму. – Roland