Java 绘制图像还是绘制填充圆?

Java 绘制图像还是绘制填充圆?,java,swing,java-2d,Java,Swing,Java 2d,我们有一个旧的JavaSwing应用程序。我们需要根据真实数据在画布上显示成千上万个小圆点。现在我们有一个小圆点的图像文件。当我们需要它的时候,我们会在画布上画上成千上万次 现在我认为每次只画一个填充的圆圈可能会更好(性能和内存使用更好),而不是加载图像并绘制它 你的意见如何 谢谢,我现在不知道这是否有帮助,但您可以通过测试最坏的情况来测试哪种方法对您有效。但我认为填充圆最好。您只需加载模板图像一次,并将其保存在内存中,然后根据需要使用Graphics2D drawImage功能将其复制到画布上

我们有一个旧的JavaSwing应用程序。我们需要根据真实数据在画布上显示成千上万个小圆点。现在我们有一个小圆点的图像文件。当我们需要它的时候,我们会在画布上画上成千上万次

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

你的意见如何


谢谢,

我现在不知道这是否有帮助,但您可以通过测试最坏的情况来测试哪种方法对您有效。但我认为填充圆最好。

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

若要减少渲染调用,请测试模板所在的像素,如果已着色,则通过渲染


这是一个很好的方法。

第三种方法是使用for filled circle,●,因为你可以打赌渲染数千个字符(如:一段文本)对于任何图形引擎来说都是最正常的事情。

保存一个图像并多次绘制它肯定比调用绘制一个filled circle要快得多。这是一个关于这个主题的最新演示,它显示了绘制图像比简单的水平十字画还要快

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

还有年龄。也许有可能使图像闪烁,使它们最终被加速。
找到答案的唯一方法是自己对其进行基准测试。

为代码计时。

与多次绘制圆或字符串相比,多次绘制图像肯定要快得多,而且很容易测试。在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对象上绘制该图像,而不是重新绘制所有圆。这通常称为双缓冲。您还可以使用来利用硬件加速

创建兼容的图像

还应确保使用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);
更多提示


我推荐这本书。它有很多加速挥杆的妙招。特别是关于图像和性能的第4章和第5章。

您对每个实现都进行了分析吗?意见有什么关系?尝试这两种方法,看看哪一种对性能和内存更有利。观点是不相关的。我不认为圆或任何其他规则的几何对象是使用泛洪填充算法填充的。我相信它们使用扫描填充。阅读java本机代码会很方便。