javaFx中的内存使用情况

时间:2014-07-16 19:27:47

标签: java javafx

我创建了一个ScrollPane,它有一个StackPane作为一个孩子,大小为2000(2000像素)现在我用我的StackPane填充了这张图片的一些部分:

enter image description here

我使用此代码将所有图像添加到我的stackPane

 ImageView grass = new ImageView(Url.GRASS);
        double x = grass.getImage().getWidth();
        double y = grass.getImage().getHeight();
        for(int i=0 ; i < 2000/x ;i++){
            for(int j = 0;j<2000/y;j++){
                ImageView grassTemp = new ImageView(Url.GRASS);
                myStackPane.getChildren().add(grassTemp);
                grassTemp.setTranslateX(-2000/2+(x)*i);
                grassTemp.setTranslateY(-2000/2+(y)*j);

                grassTemp.setCache(true);
                grassTemp.setCacheHint(CacheHint.SPEED);
            }
        }

现在我看到我的内存使用量大约需要50到60 MB(没有setCachesetCacheHint) 我使用这些功能来获得更好的性能

    myStackPane.setCache(true);
    myStackPane.setCacheHint(CacheHint.SPEED);

所有图片

 grassTemp.setCache(true);
 grassTemp.setCacheHint(CacheHint.SPEED);

但是我看到它只减少了大约4-6 MB的内存使用量

现在您对加载大量图片有更好的性能和更好的内存使用情况有什么看法? 提前致谢

注意:我想使用这些图片为我的小游戏创建一张小地图

1 个答案:

答案 0 :(得分:1)

所有图片视图都是相同的图片。您无需加载新的图像数据,只需复制图像。

而不是:

ImageView grassTemp = new ImageView(Url.GRASS)

执行:

Image grassImage = new Image(Url.GRASS) // **outside the loops
. . .     
ImageView grassTemp = new ImageView(grassImage) // **inside the loops.

您应该只使用标准窗格或组并在图像视图上设置布局值(或使用GridPane),而不是使用带翻译的StackPane。

另外,作为替代方案,您可以使用CSS背景重复此任务。