Ситуация
Я создал систему частиц с помощью JavaFX, используя следующую технику:
Каждая частица представляет собой ImageView, который содержит изображение с радиальным градиентом:
Цикл обработки частиц представляет собой AnimationTimer, в котором список частиц обрабатывается с помощью метода списка stream().parallel(), что на самом деле дает ускорение всей системе. Что-то вроде этого:
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 частиц:
Что я узнал:
- без использования parallel() медленнее
- использование Circle с прозрачностью намного медленнее, чем использование ImageView
- использование режима наложения очень медленное
- использование PixelWriter для изменения цвета изображения невыносимо медленно. Возникает вопрос: как ColorAdjust меняет цвет (через d3d & hardware)? Я не нашел механизм в исходном коде JavaFX.
Вопрос
Есть ли лучший способ реализовать систему частиц в JavaFX (другие типы узлов, потоки и т. д.) в отношении производительности?
Я могу опубликовать код, если кто-то хочет поиграть.
Большое спасибо за экспертизу!
Редактировать: так как вас спросили, вы можете получить полный код, который использует узлы в качестве частиц с настройкой цвета, из этот смысл< /а>. Кстати, даже если вы предварительно визуализируете изображения и не используете настройку цвета, производительность будет низкой.
Однако вопрос носит скорее теоретический характер, поэтому копаться в коде на самом деле не нужно.
KineticModel
также используется пользовательский полупрозрачныйRadialGradientPaint
, но он предварительно вычисляет необходимые изображения; возможно, вы сможете создать подходящую гамму, используяjavafx.scene.paint.Color.hsb()
. - person trashgod   schedule 24.07.2015