有关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将建筑物渲染到屏幕外场景,以创建单个图像,然后将该图像叠加在最终场景中。