Java 为什么VolatileImage.getGraphics()总是创建一个新的图形实例?

Java 为什么VolatileImage.getGraphics()总是创建一个新的图形实例?,java,graphics,graphics2d,java-2d,Java,Graphics,Graphics2d,Java 2d,我有以下代码 final Graphics2D g2d1 = (Graphics2D) volatileImg.getGraphics(); final Graphics2D g2d2 = (Graphics2D) volatileImg.getGraphics(); 为什么g2d1!=g2d2 为什么volatileImg.getGraphics()在每次调用中创建一个新实例 是否有任何方法可以始终获得相同的图形2d 谢谢:)以下是我为改进JComponent视图的性能所做的工作: 1-

我有以下代码

 final Graphics2D g2d1 = (Graphics2D) volatileImg.getGraphics();
 final Graphics2D g2d2 = (Graphics2D) volatileImg.getGraphics();
为什么
g2d1!=g2d2

为什么
volatileImg.getGraphics()
在每次调用中创建一个新实例

是否有任何方法可以始终获得相同的
图形2d


谢谢:)

以下是我为改进JComponent视图的性能所做的工作: 1-使用VolatileImage而不是BuffereImage,并仅在宽度和高度相同时创建新实例

volatileImg = component.getGraphicsConfiguration().createCompatibleVolatileImage(width, heigth, Transparency.BITMASK); // I used Transparency.BITMASK for more cpu rapidity
2-我在一个字段中保留一个图形的引用,以调用Graphics#dispose


你觉得怎么样

getGraphics
是原始API的遗留,
createGraphics
是获取图像图形上下文引用的首选方法。在回答您的问题时,不,并没有办法保证您在两次调用之间获得相同的
图形
上下文,这就是重点。您不知道图像是否或何时会被硬件失效(因此它的波动性)。真正的问题是你为什么需要它?谢谢你的评论。事实上,volatileImg.getGraphics()是在我的JPanel的方法paint中调用的,因为这个方法在很短的时间内被频繁调用,所以我的堆中会有很多图形实例,这将多次调用GC,从而降低我的应用程序的性能。鉴于图像的易失性(并且在内容不丢失的情况下必须循环),通常您只会在活动绘制场景中使用
VolatileImage
(您可以控制绘制周期),所以在
JPanel
paint
方法中使用它对我来说是“错误的”。至于您的评论,如果您每次都调用
Graphics#dispose
,那么您就不应该有问题了。我是如何改进性能的:1。volatileImg=component.getGraphicsConfiguration().createCompatibleVolatileImage(宽度、高度、透明度.位掩码);//我使用了Transparency.BITMASK来提高cpu速度。我想你有麻烦了。考虑到这些年来对整个图形引擎的性能增强,我感觉对
VolitileImage
的需求已经基本消失了(我可能弄错了,但我不需要解决很多问题)
VolitileImage
有一个非常特殊的生命周期,当在Swing的被动渲染模型中使用时,实际上可能会降低性能。您可以使用它来创建一个
BuffereImage
,它对给定的
图形配置
使用兼容的颜色模型,这意味着在绘制时,它不需要转换,这对我来说已经提高了很多次性能。每当您将
图形
对象的引用保留为实例字段时,IMHO,您需要担心并且可能会感兴趣