gpt4 book ai didi

javafx - 粒子系统的性能

转载 作者:行者123 更新时间:2023-12-04 23:44:36 26 4
gpt4 key购买 nike

情况

我使用以下技术使用 JavaFX 创建了一个粒子系统:

每个粒子都是一个 ImageView,其中包含一个具有径向渐变的 Image:

enter image description here

粒子处理循环是一个 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 个粒子:

enter image description here

我学到了什么:
  • 不使用 parallel() 会更慢
  • 使用透明的 Circle 比使用 ImageView 慢得多
  • 使用混合模式非常慢
  • 使用 PixelWriter 更改图像颜色是令人无法忍受的缓慢。问题出现了:ColorAdjust 如何改变颜色(通过 d3d 和硬件)?我还没有在 JavaFX 源代码中找到该机制。

  • 问题

    关于性能,是否有更好的方法在 JavaFX(其他节点类型、线程等)中实现粒子系统?

    如果有人想玩弄,我可以发布一些代码。

    非常感谢您的专业知识!

    编辑:既然有人问了,你可以从 this gist 获得使用节点作为带有颜色调整的粒子的完整代码.顺便说一句,即使您预渲染图像并且不使用颜色调整,性能也很低。

    然而,这个问题更像是一个理论上的问题,所以挖掘代码并不是真正必要的。

    最佳答案

    我想我可以为我自己的问题添加一个答案。但我希望有更多经验的人可以分享他们的知识,因为我想出的只是玩弄的结果:

    在 Canvas 上绘画而不是使用 JavaFX ImageView 节点令人惊讶地导致速度至少提高了 10 倍。这基本上就是我所做的:

  • 预先计算具有梯度的图像,i。 e.它们的颜色和大小取决于粒子的生命周期
  • 在动画计时器中获取预先计算的图像并将其绘制在 Canvas 上

  • 如果有人感兴趣,可以从 this gist 获取完整代码。 .只需单击“下载 Zip”并将 zip 的代码放在 JavaFX 项目的“应用程序”包中,然后启动 Main 类。问题中代码的不同之处在于 Particle.java 类。在问题中,粒子用作节点并在动画计时器中移动,但在此答案中,仅数据用于在动画计时器的 Canvas 上绘制图像,节点本身并未放置在场景中。

    您可以使用 Settings 类来指定分辨率、每帧新粒子的数量等。

    此屏幕截图显示了 3 个排斥器和 25400 全高清分辨率屏幕上的粒子,以 60fps 运行:

    enter image description here

    关于javafx - 粒子系统的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31613669/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com