画图或画圆圈?

时间:2010-09-28 15:18:51

标签: java swing java-2d

我们有一个旧的Java Swing应用程序。我们需要根据实际数据在画布上显示数千,数十万个小圆点。现在我们有一个小圆点的图像文件。当我们需要它时,我们将该图像绘制到画布上,成千上万次。

现在我认为每次只绘制一个填充的圆圈而不是加载图像并绘制它可能会更好(更好的性能和内存使用)。

你的意见怎么样?

感谢,

6 个答案:

答案 0 :(得分:1)

您只需加载模板图像一次并将其保存在内存中,然后根据需要使用Graphics2D drawImage函数将其复制到画布。由于调用Flood-fill / Scan-fill算法以及Bresenham来绘制圆圈,因此绘制多个实心圆可能会变得昂贵。要优化渲染,您还可以decimate渲染结果或执行clustering,因为无论如何用户都不会真正欣赏密集的重叠圆圈。

要减少渲染调用,请测试模板所在的像素,如果渲染已经着色,则传递渲染。

这是一个不错的benchmarking applet

答案 1 :(得分:1)

几乎可以肯定,保持单个图像并绘制它几次比打一个填充圆圈的呼叫要快得多。这是最近关于该主题的演示,表明绘制图像比甚至简单的水平十字架更快。 http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-4170&yr=2009&track=javase

答案 2 :(得分:1)

为您的代码安排时间

绘制图像绝对比绘制圆圈或字符串很多次更快,而且很容易测试。在paintComponent()方法的开头添加以下行:

paintComponent(){
   long start = System.currentTimeMillis();

   ...
   // draw 100,000 circles as images or circles
   ...


   System.out.println("Rendering time: " + 
             (start - System.currentTimeMillis()) + " ms");
}

如果时间总是变为零,则可以改为使用System.nanoTime()。

绘制到缓存图像

您可以做的另一件事是将这些圆圈绘制到图像上,并仅在内容更改时重新创建图像。如果没有任何改变,只需将该图像绘制到Graphics2D对象上,而不是重绘所有圆圈。这通常称为双缓冲。您还可以使用Volatile Images来利用硬件加速。

创建兼容图片

您还应确保使用createCompatibleImage()来使用与用户监视器兼容的图像,如下所示:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();

// Create an image that does not support transparency
BufferedImage bimage = gc.createCompatibleImage(width, height, Transparency.OPAQUE);

// Create an image that supports transparent pixels
bimage = gc.createCompatibleImage(width, height, Transparency.BITMASK);

// Create an image that supports arbitrary levels of transparency
bimage = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);

更多提示

我推荐这本书Filthy Rich Clients。它有很多加速挥杆的好方法。特别是关于图像和性能的第4章和第5章。

答案 3 :(得分:0)

我现在不知道如果这会有所帮助,但您可以通过测试最坏情况来测试哪一个适合您。但我认为填充圆圈是最好的。

答案 4 :(得分:0)

第三种方法是使用unicode char填充圆圈,●,因为您可以打赌渲染数千个字符(如:一段文字)对于任何图形来说都是最正常的发动机。

答案 5 :(得分:-1)

很难预测哪个更快,因为某些情况下的某些操作会被视频卡的GPU硬件加速。 如果GPU用于制作圆圈,那么这将比将缓冲圆圈的像素复制为图像的cpu快得多。

还有VolatileImage。也许有可能使图像变暗,以便最终加速。 找出答案的唯一方法是自己进行基准测试。