用Java显示数百万图像的最佳方式是什么?
你看到了吗 每栋房子的每一块砖都是16x16像素的图像 在这里,您可以看到一个基于简单JavaFX的版本,其中一些用Java显示数百万图像的最佳方式是什么?,java,swing,imageview,javafx,Java,Swing,Imageview,Javafx,你看到了吗 每栋房子的每一块砖都是16x16像素的图像 在这里,您可以看到一个基于简单JavaFX的版本,其中一些Imageview在X和Y上移动,以产生“构造”的效果 我只是使用paintComponent将其调整为Swing 问题是: -使用JavaFX:我的计算机有问题。你在图片上看到的东西需要2秒钟才能加载,然后它移动得非常缓慢和急促。 -使用Swing:我不知道如何根据亮度、阴影等调整每个块。。看起来是这样的: 我应该选择什么方法?两者都有很大的缺点。我本来希望保留JavaFX方法
Imageview
在X和Y上移动,以产生“构造”的效果
我只是使用paintComponent
将其调整为Swing
问题是:
-使用JavaFX:我的计算机有问题。你在图片上看到的东西需要2秒钟才能加载,然后它移动得非常缓慢和急促。
-使用Swing
:我不知道如何根据亮度、阴影等调整每个块。。看起来是这样的:
我应该选择什么方法?两者都有很大的缺点。我本来希望保留JavaFX方法,但也希望找到除Imageview
之外的其他方法。这不应该是个好主意
在绘制图像之前修改图像的模糊/亮度等
我自己没有使用过它,但这里有一个提示-使用Swing/AWT内核+卷积机制:
通过3x3矩阵(数据)定义操作。您可以搜索亮度、模糊等示例
图片加载花了2秒钟,但在加载后移动非常缓慢和急促
使用脏矩形算法:有关Swing优化和实现的信息,请参阅其他答案,因为我的答案特定于JavaFX 如果您坚持使用JavaFX实现,以下是一些可以尝试的方法:
Image tile = new Image("tile.png");
Group house = new Group();
house.setCache(true);
house.setCacheHint(CacheHint.SPEED);
Effect lighting = new Lighting();
for (int i = 0; i < houseWidth; i++) {
// here is the critical part => don't do new ImageView(new Image("tile.png"))
ImageView tileView = new ImageView(tile));
tileView.setEffect(lighting);
tileView.setCache(true);
tileView.setCacheHint(CacheHint.SPEED);
house.add(tileView);
}
Image tile=新图像(“tile.png”);
组屋=新组();
setCache(真);
house.setCacheHint(CacheHint.SPEED);
效果照明=新照明();
for(int i=0;i不要新建ImageView(新建图像(“tile.png”))
ImageView tileView=新的ImageView(平铺));
tileView.setEffect(灯光);
tileView.setCache(true);
tileView.setCacheHint(CacheHint.SPEED);
添加(tileView);
}
曼特里德的建议很有趣。我相信,使用JavaFX,您不需要自己实现脏矩形算法(因为底层平台能够为您处理脏区域)。可能是因为它是一种通用机制,因此无法提供特定情况下所需的优化级别,在这种情况下,您需要自己处理脏处理(例如,从场景图中删除节点,然后根据需要重新添加节点) 此外,可以通过在JavaFX中定义效果来预计算图像上的模糊/亮度/etc,将效果应用于屏幕外的ImageView节点,然后应用于屏幕外的ImageView节点以获得预计算的图像。这种技术允许您重用现有的JavaFXEffects管道,而无需使用ConvolveOp机制重新实现它。也许您可以通过在ImageView节点上将cache设置为true并将cacheHint设置为speed来获得相同的性能级别,因为我相信这在幕后也会做类似的事情(即以增加内存使用为代价提高速度)
JavaFX场景图非常高效,可以处理数千个节点。但是,您的应用程序中可能有更多内容。如果上述优化点对您没有帮助,您可能需要计算节点数,并将您的问题(可能还有一些来源)的参考发布到了解JavaFX应用程序优化细节的JavaFX开发人员所在的位置 JavaFX8对in的支持比JavaFX2.2中的3D场景图(大部分是无用的)要好得多。您当前的应用程序似乎是psuedo-3d,您可以在其中变换2D对象、单独应用照明效果并调整每个瓷砖的亮度以获得3d外观。如果是这样的话,使用具有统一3D照明模型的全硬件加速3D scenegraph可能最终表现更好,外观更好,更易于使用-您必须在应用程序的上下文中对其进行评估,以确定是否值得将应用程序从2D JavaFX场景切换到3D JavaFX场景,或从JavaFX切换到Swing或其他类似技术 附录 对Mizur的一些附加问题的回答: 那么为什么它们如此耗电呢 从我的回答中可以看出,有许多方面会影响性能,因此,请选择
Image tile = new Image("tile.png");
Group house = new Group();
house.setCache(true);
house.setCacheHint(CacheHint.SPEED);
Effect lighting = new Lighting();
for (int i = 0; i < houseWidth; i++) {
// here is the critical part => don't do new ImageView(new Image("tile.png"))
ImageView tileView = new ImageView(tile));
tileView.setEffect(lighting);
tileView.setCache(true);
tileView.setCacheHint(CacheHint.SPEED);
house.add(tileView);
}