Java BuffereImage与VolatileImage的当前状态
在实现窗口的快速图像绘制时,当前的最佳实践是什么?我说的是一些非常简单的东西,比如一个带有2缓冲区策略的JFrame。(目前)最快的方法是什么 我到处都读到,VolatileImage是硬件加速的,而BuffereImage是管理的,除了可能不再是,因为随着每次新的更新(+Java 7的发布),情况可能不再是这样,因为Java加速了越来越多的BuffereImage,等等 那么(一般而言),您对在以下条件下实施快速图像绘制有何建议:Java BuffereImage与VolatileImage的当前状态,java,graphics,bufferedimage,Java,Graphics,Bufferedimage,在实现窗口的快速图像绘制时,当前的最佳实践是什么?我说的是一些非常简单的东西,比如一个带有2缓冲区策略的JFrame。(目前)最快的方法是什么 我到处都读到,VolatileImage是硬件加速的,而BuffereImage是管理的,除了可能不再是,因为随着每次新的更新(+Java 7的发布),情况可能不再是这样,因为Java加速了越来越多的BuffereImage,等等 那么(一般而言),您对在以下条件下实施快速图像绘制有何建议: Java 6u33+或Java 7+ 一个图像覆盖整个JFr
- Java 6u33+或Java 7+
- 一个图像覆盖整个JFrame或多个小图像
- 图像透明度可以启用,也可以不启用,但必须足够容易地支持
- 如果它有助于考虑使用活动渲染的类似游戏循环的设置
标杆管理 我决定创建一个小程序,给我一些基准测试结果来比较不同条件下的两种图像类型 程序:基准方法很简单。一个2K(2560x1440)的测试图像被缩小到HD(1280x720),然后绘制到一个BuffereImage或一个VolatileImage上(我使用BuffereImage来存储测试图像,因为测试表明它与我存储它所使用的图像类型没有区别)。然后有两种变体: 1st在同一循环运行中,当测试图像被绘制到缓冲区或VolatileImage或缓冲区,或VolatileImage被绘制到帧的JPanel时。 2nd在将测试图像绘制到JPanel之前,测试图像在Volatile或buffereImage上绘制了n次。程序记录两个测试(第一个BuffereImage,第二个VolatileImage)的执行时间,并在控制台中打印出来。我还测试了如果使用相同的测试图片和alpha通道(透明度),结果会如何,因为我经常看到有人声称VolatileImage会有问题 结果:我在Mac Minit(2012年底)上运行了该程序,该程序采用2.5Ghz的Intel i5双核。使用的Java版本是v8_112,通过Eclipse执行。以下是我的结果:
Test-methodology 1 - no transparency:
Num of Repeats: BufferedImage: VolatileImage:
200 3.280 Seconds 0.784 Seconds
500 8.230 Seconds 1.818 Seconds
1000 16.030 Seconds 3.666 Seconds
Test-methodology 1 - transparancy:
Num of Repeats: BufferedImage: VolatileImage:
200 4.166 Seconds 0.806 Seconds
500 10.636 Seconds 1.793 Seconds
1000 20.565 Seconds 3.514 Seconds
Test-methodology 2 - no transparancy:
Num of Repeats: BufferedImage: VolatileImage:
200 1.165 Seconds 0.093 Seconds
500 2.862 Seconds 0.104 Seconds
1000 5.770 Seconds 0.112 Seconds
Test-methodology 2 - transparancy:
Num of Repeats: BufferedImage: VolatileImage:
200 2.389 Seconds 0.120 Seconds
500 5.986 Seconds 0.128 Seconds
1000 11.902 Seconds 0.134 Seconds
结论 当然,有关性能的很多信息取决于映像的实现和使用方式。在我的例子中,作为缓冲区,它允许我做一些事情,比如对整个图像进行淡入淡出。但是,您仍然可以找到这两种图像类型的一些重要的向下和向上方向: 通常,在测试中,VolatileImage似乎比BuffereImage快得多(4到6倍)。在一次非合成测试中,我在一个小游戏中使用了相同的实现,得到了类似的结果。但在我的测试中,我找到了一种实现方式(遗憾的是,我无法重建它),它向我表明,VolatileImage并不是永远都可以使用的方式(是的,在这种情况下,它比它的对手慢) 从透明度上看,两种图像类型的缩放都是均匀的,但VolatileImage似乎并没有像BuffereImage那样损失太多的速度,尽管添加了alpha通道 我想说的是:在我的测试中,循环次数很少(1-10次),我发现BuffereImage在绘制单个帧时要快得多。尤其是渲染透明图像时。单帧的BuffereImage约为0.03秒,VolatileImage需要0.035秒。当使用大约3到6次循环运行时,差距变得更大。只有在超过8到10秒时,VolatileImage才占据了整个领域,并且随着循环运行量的增加而变得更好 我想用你的观点(通过测试支持)来扩展这个结论,还想知道你提出的这两个图像的哪些实现,以及它们是如何变化的 就我个人而言,我将在将来使用VolatileImage进行渲染。BuffereImage将是我的日常驱动程序,用于存储在渲染循环中绘制的图像。主要是因为我发现它们更容易处理(有一种方法可以将BIs转换为VIs,但这是另一个时代的故事)。我也期待着Java9,它已经在今年12月发布了,但似乎被推迟了,并将再次运行我的测试
来源
我上传了我的。你可以看看它,如果你想,拉它,自己试试 BuffereImage和VolatileImage之间几乎没有什么区别,正如您所说,BuffereImage现在实际上是硬件加速的。此外,我还读到一些关于VolatileImage在全屏模式下速度较慢的信息,但我猜这可能是由硬件决定的。对。是否有任何官方文件或基准有助于证明这一点?我分叉了你的基准,几乎重写了它,以反映我认为是一个更“正常”的用例。在我的用例中,在写入屏幕之前,我不会执行N次写入缓冲区的循环-我会执行N次写入缓冲区的循环,然后再写入屏幕。通过更新的测试,BuffereImage非常有用