【问题标题】:Lag when displaying many images in JavaFX GridPane在 JavaFX GridPane 中显示许多图像时出现延迟
【发布时间】:2021-04-03 18:02:03
【问题描述】:

我正在尝试使用约束在 GridPane 中使用 JavaFX 显示一堆图像,而我的代码确实完美地显示了它们。但是,由于某种原因,尽管我的代码可以正常工作,但图像会导致我的舞台滞后。有没有办法解决这个问题?

就上下文而言,“arr”是我制作的具有字符串的 2d ArrayList,而 checkBoxList 包含一些复选框,这些复选框以大约 40 列的形式排列,它们之间的间距为 2。

public void setUpTypeImages()
{
  for (int p = 0; p < arr.size(); p++)
  {
     typesList.add(new ArrayList<ImageView>());
     for (int y = 0; y < arr.get(p).size(); y++)
     {  
        ImageView type = new ImageView("Types\\" + arr.get(p).get(y) + ".png");
        typesList.get(p).add(type);
        typesList.get(p).get(y).setFitWidth(30);
        typesList.get(p).get(y).setFitHeight(30);     
        GridPane.setConstraints(typesList.get(p).get(y), GridPane.getColumnIndex(checkBoxList.get(p)) + y + 1, GridPane.getRowIndex(checkBoxList.get(p))); 
        choiceLayout.getChildren().add(typesList.get(p).get(y));
     }
  }
}

【问题讨论】:

  • 嗨,图像加载调用发生在哪里?我的意思是,打印东西的方法。是choiceLayout.getChildren().add(typesList.get(p).get(y));触发图像更新的那个?
  • @aran 是的,你提到的那一行是触发每个图像显示的那一行。它的功能是完美的,但问题在于它导致的滞后。
  • 加载时会发生延迟,还是加载后发生?我的意思是,即使所有图像都已加载,它会冻结吗?
  • 最后一个问题,这是可选视图吗?我的意思是,如果你选择加载面板(然后你调用 setUpTypeImages),或者自动显示?
  • 加载时和加载后。在将它们初始化为新的 GridPane() 后,我将它们添加到choiceLayout,因此这可能是加载时延迟的根源。不完全确定加载后为什么会发生这种情况。它会在用户开始运行代码时自动显示。我可以把它评论出来,但这不是重点

标签: java user-interface javafx


【解决方案1】:

既然提到了滞后,我假设这个 GridPane 中会有很多项目。

1 - 虚拟化列表

仅当图像设置为出现在客户端的视口中时(当它们滚动时)才会呈现图像。这也意味着如果之前渲染过图像并且不再需要它,那么最好尽可能从内存中卸载它(但这会增加其他复杂性)。这只有在用户可以在一个通常是垂直滚动的轴上滚动时才有意义。这不是一项微不足道的任务,您应该在尝试自己执行此操作之前寻找一个为您执行此操作的库。 This 旧答案讨论 JavaFX 中的虚拟化。

2 - 缩略图

我认为没有提到元素是否具有固定大小,尽管网格显示通常是这种情况。减少加载时间的一个好方法是将原始图像的副本保存在您计划显示它的尺寸的某个地方,这样您就不必加载大量图像来显着缩小它。这也意味着它不必为每个图像运行调整大小算法来显示它。

【讨论】:

  • 删除了我的答案,因为这个世界的机制真的不一样,避免可能的混淆。这就是答案
  • 非常感谢!考虑到用户如何水平和垂直滚动,虚拟化并不容易,但调整 PNG 图像本身的大小就可以了。直到现在,我才知道调整图像大小会占用如此多的处理能力
  • 说实话,并不是 100% 确定虚拟列表有 2 个滚动轴。如果你不需要它很好。如果没有,我会做一些研究。但是从经验来看(除非你找到了一个很棒的库),如果有两个滚动轴,它会导致很多边缘情况,并且可能会导致更多的计算复杂性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 2016-08-07
  • 2013-03-21
  • 2021-11-14
相关资源
最近更新 更多