Image 优化占用大量内存和CPU的javafx代码

Image 优化占用大量内存和CPU的javafx代码,image,split,grid,javafx,imageview,Image,Split,Grid,Javafx,Imageview,下面的代码用于购买土地的筹款晚宴,目的是显示购买土地的平方米(约2976平方米)的进度。每次购买一平方米,应用程序都会添加一个对应于实际1m2的图像块。最终,这些瓦片(约2976块)像网格一样填满,一旦全部购买完毕,就可以完成整个土地 每个磁贴的大小约为320字节,总共有2976个磁贴 我还在下面展示了一个图像示例 这段代码(在javafx中)让我抓狂的是,它消耗了我1个处理器的90%到100%,内存使用量随着分片的增加而不断增加,直到代码缓冲区内存耗尽,程序在一段时间后崩溃。这在筹款晚宴上是

下面的代码用于购买土地的筹款晚宴,目的是显示购买土地的平方米(约2976平方米)的进度。每次购买一平方米,应用程序都会添加一个对应于实际1m2的图像块。最终,这些瓦片(约2976块)像网格一样填满,一旦全部购买完毕,就可以完成整个土地

每个磁贴的大小约为320字节,总共有2976个磁贴

我还在下面展示了一个图像示例

这段代码(在javafx中)让我抓狂的是,它消耗了我1个处理器的90%到100%,内存使用量随着分片的增加而不断增加,直到代码缓冲区内存耗尽,程序在一段时间后崩溃。这在筹款晚宴上是不可取的

完整代码可在以下位置进行测试: 您需要将布尔分割更改为true-false,这将为您分割图像(大约3000个图像)

使用所有内存和CPU的罪魁祸首是下面显示的AnimationTimer()函数,我想知道是否有人可以帮助我减少代码中的内存和CPU使用

为了简要说明下面的代码是如何使用的,土地分为两个窗格,当第一个窗格1填充时,第二个窗格网格2开始填充。 此外,闪烁的互动程序用于显示当前进度

我正在使用total_Donation++;测试代码,但通常会使用mysql来提取findraising晚餐期间产生的新值

AnimationTimer()代码:

translate\u timer=new AnimationTimer(){
@重写公共无效句柄(现在很长){
如果(现在>翻译\u lastTimerCall+10000\u 000\u 000l)
{
旧的总穿着=总穿着;
尝试
{
//c=DBConnect.connect();
//SQL=“从捐赠中选择*”;
//rs=c.createStatement().executeQuery(SQL);
//while(rs.next())
//{total_donation=rs.getInt(“total_donation”);}
//c.关闭();
总剂量++;
如果(总穿着量!=旧的总穿着量)
{
System.out.format(“捐赠总额:%s\n”,捐赠总额);
旧的总穿着=总穿着;
如果(!窗格1_已满)
{
grid_pane1.getChildren().clear();
grid_pane1.getChildren().removeAll(imageview_tile1,hBox_outter_last);
}
grid_pane2.getChildren().clear();
grid_pane2.getChildren().removeAll(imageview_tile2,hBox_outter_last);
对于(i=0;i
  • 首先也是最重要的一点是,您创建了大量永不停止的不确定的
    FadeTransitions
    。随着时间的推移,这些不确定的
    FadeTransitions会累积起来,并导致内存和CPU泄漏。您应该
    stop()
    在开始新的转换之前先进行转换。或者,您只需要一个转换来插值
    DoubleProperty
    的值,然后将节点的不透明度绑定到此属性:

    DoubleProperty opacity = new SimpleDoubleProperty();
    Transition opacityTransition = new Transition() {
        protected void interpolate(double frac) {
            opacity.set(frac);
        }
    };
    
    // elsewhere
    hBox_outter_last.opacityProperty().bind(opacity);
    
  • 您可能希望预先预加载所有图像块,以避免在循环中读取磁盘

  • 在每个周期中,您都会不必要地破坏和重新创建场景的大部分。您应该修改代码,只添加新的分幅,而不是全部删除并从头开始重新创建

  • 最后,当您实际查询数据库时,您应该从不同的线程而不是JavaFX应用程序线程进行查询,因为您的UI在查询时将没有响应(例如,不设置淡入淡出过渡动画)

  • 我有一个建议:

    • 不要使用两个面板分割图像。一个用于显示整个图像。第二个面板将是与第一个窗格重叠的网格窗格。因此,当购买平方米时,相应网格单元的背景将变得透明

    谢谢Tomas。知道如何停止淡入淡出过渡吗?我试过了。停下来,但什么也没做。可能我没有把它放在正确的位置。我使用了一种机制,只有新的瓷砖是绿洲。但它也使用了高CPU和内存。尝试放置
    if(ft!=null){ft.stop();}
    就在
    ft=new FadeTransition(…)之前
    ft1
    也一样。另外,您使用的是什么JavaFX版本?我认为以前有一个错误,没有发布动画,现在应该得到修复。或者,您只需要一个动画,为
    双属性
    制作动画,然后将节点的不透明度绑定到这个属性。谢谢。您的发言已经超过了我的级别l重新绑定。欢迎一个例子。CPU使用率的罪魁祸首是淡入过渡,如果我删除它,CPU使用率将下降到6%!!非常感谢您的帮助,顺便说一句,如果(ft!=null){ft.stop();}没有做任何我想做的事情。将尝试一下。我只剩下1天:)
    DoubleProperty opacity = new SimpleDoubleProperty();
    Transition opacityTransition = new Transition() {
        protected void interpolate(double frac) {
            opacity.set(frac);
        }
    };
    
    // elsewhere
    hBox_outter_last.opacityProperty().bind(opacity);