javafx每帧更新像素

时间:2017-04-22 03:30:02

标签: java javafx graphics

对于我正在进行的项目,我需要通过盐度色彩图为海洋制作动画。基本上,我有n个时间步长的盐度数据,我需要更新像素颜色以匹配当前的盐度值。

现在我正在浏览嵌套for循环中画布上的每个像素,对于每个像素,计算该像素的当前盐度值并更新像素的颜色以匹配盐度值。

我使用AnimationTimer对象跟踪帧。问题是我得到大约20 fps,应用程序滞后于调整窗口大小等事件。

private void drawHeatMap(int depth, float t) {
  float meanSalt = model.getMeanSalinity(depth);
  float stdSalt = model.getSalinityStdDev(depth);
  Colorbar colorbar = new Colorbar(SALINITY_COLORMAP);
  colorbar.setValueRange(meanSalt - stdSalt, meanSalt + (stdSalt / 2));
  GraphicsContext graphicsContext = canvas.getGraphicsContext2D();
  graphicsContext.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
  PixelWriter pixelWriter = graphicsContext.getPixelWriter();
  for (int x = 0; x < canvas.getWidth(); ++x) {
    for (int y = 0; y < canvas.getHeight(); ++y) {
      GeoCoordinate coordinate = getMapCoordinates(x, y);
      if (model.isOverWater(coordinate)) {
        float salt = model.computeSalinity(coordinate, depth, t);
        pixelWriter.setColor(x, y, colorbar.getColor(salt));
      }
    }
  }
}

这是每帧运行的代码,但即使是更简单的版本,仍然以30 fps的速度运行。

private void drawHeatMapBenchmark(int depth, float t) {
  GraphicsContext graphicsContext = canvas.getGraphicsContext2D();
  graphicsContext.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
  PixelWriter pixelWriter = graphicsContext.getPixelWriter();
  for (int x = 0; x < canvas.getWidth(); ++x) {
    for (int y = 0; y < canvas.getHeight(); ++y) {
      pixelWriter.setColor(x, y, Color.gray(Math.random()));
    }
  }
}

任何人都知道更好的方法吗?我不熟悉计算机图形学,谢谢。

1 个答案:

答案 0 :(得分:0)

您正在(单个)JavaFX应用程序线程上执行所有这些操作。如果你首先将热图渲染成一个然后绘制到画布上的图像可能会有所帮助,因为对于你的特定情况,在并行线程上进行所有图像渲染似乎非常简单,这应该加快整个过程。