java 图片显示方式_在Java中显示数百万张图片的最佳方式是什么?

有关Swing优化和实现的信息,请参阅其他答案,因为我的答案是JavaFX具体的。

如果你坚持使用JavaFX实现,这里有几件事要试试:

>使用node.setCache(true)打开节点缓存。

>使用node.setCacheHint(CacheHint.SPEED)启用高速节点转换。

>提供没有效果的实现,另一个具有效果,看看没有效果的效果是否明显更好。 (如果是这样,您可能需要使用更有效的效果链或完全放弃某些效果)。

>检查JavaFX system requirements,以确保您的设置符合硬件/操作系统/驱动程序组合的硬件加速的最低要求。

>如果您正在使用Regions和基于css的处理,请注意,css system不会导致太多开销(例如,具有不使用css并且比较其性能的代码版本)。

>如果需要,实现一个细节缩放级别(例如缩小时,为整个房屋提供单个图像,而不是每个房屋砖块的单独图像)。

>确保您只加载一个给定的Image一次,并在多个ImageViews重复使用。

>使用分析器来识别瓶颈。

>更改测试cpu或显卡,看看其中任何一个是瓶颈。

>尝试一个Java 8 preview,它具有许多用于JavaFX的内部performance optimizations。

>如果您正在加载大量图像,请在加载图像时使用background loading并在前面播放动画或进度条。

>如果您正在加载大量图像,scale them upfront in the Image constructor,以便它们不占用太多内存,或者需要(潜在地)额外的像素的额外处理能力(只有当您使用大量不同的高分辨率纹理 – 你似乎不在做)

例如:

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);

}

曼特里的建议很有趣。我相信,使用JavaFX,您不需要自己实现一个脏矩形算法(因为底层平台能够为您处理脏区域处理)。可能是因为它是一个通用的机制,它并没有提供你特定情况所需的优化级别,在这种情况下,你需要自己处理脏处理(例如,从场景图中删除节点并重新添加他们酌情)。

另外,预先计算图像上的模糊/亮度/等可以通过在JavaFX中定义效果,将效果应用于屏幕外的ImageView节点,然后将屏幕ImageView节点的taking a snapshot应用到预先计算的图像上。这种技术将允许您重用现有的JavaFX效果管道,而无需使用ConvolveOp机制重新实现它。也许您可以通过将缓存设置为true并将cacheHint设置为在ImageView节点上加速来获得相同的性能水平,因为我相信这会在场景后面做类似的事情(即以增加内存使用为代价增加速度)。

JavaFX场景图相当高效,可以处理数千个节点。但是,您的应用程序可能不止于此。如果上述优化点不能帮助您,您可能需要计算您的节点数,并将您的问题(或许有些来源)引用到了知道JavaFX应用程序优化细节的JavaFX开发人员的open-jfx mailing list。

JavaFX 8比JavaFX 2.2中的(主要是无用的)3D场景更加支持3D scenegraphs。您现在的应用程序似乎是psuedo-3d,您可以在其中转换2D对象,单独应用照明效果并调整每个图块的亮度以获得3D外观。如果是这样,使用完全硬件加速的3D场景图与统一的3D照明模型可能会最终表现更好,看起来更好,更容易使用 – 您必须在应用程序的上下文中评估它,看是否是值得将您的应用程序从2D JavaFX场景切换到3D JavaFX场景,或从JavaFX切换到Swing或其他像libgdx这样的技术。

附录

一些Mizur的附加问题的答案:

So why are they so power-consuming?

从我的答案可以看出,有许多方面要表现,所以挑出一个特别的原因,为什么某些东西是耗电的有时是困难的,往往是不可能的。有时它是有助于绩效问题的事情的组合。最大的胜利通常来自优化内部循环中执行的内容,也可以通过改变解决问题的策略来实现。

If they need so much, please let me move tiles, or please just be displayed, no?

在仅仅为您移动的东西消耗资源方面,JavaFX场景图具有一些优化,像cachehints这样的事情可以进一步提高性能。也许它们不足以满足您的特定用例或使用系统的方式。您可能需要更改算法以减少系统负载。

Is there a way to generate images of each building with this technique of Imageview, then to integrate these images of buildings in the final scene?

是的 – 您可以使用许多图像和节点,snapshot the offscreen scene将建筑物渲染到屏幕外场景,以创建单个图像,然后将该图像叠加在最终场景中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值