2011-08-28 54 views
4

我有一个JFrame,我使用Graphics2D来使用this教程绘制VolatileImage。我主要复制代码以查看它的工作原理,但稍微修改了我的游戏。我用两个屏幕运行我的电脑。多个屏幕上的VolatileImage JFrame

当我将游戏的窗口拖到窗口最初没有出现的另一个屏幕上时,问题就出现了。窗口变成灰色,屏幕上不显示任何图形,即使是我用Graphics2D绘制的简单矩形。这只发生在我调用教程中显示的volatileimage的绘制方法时。

我认为它可能有一些做这个...

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

...但我不知道。

任何帮助,将不胜感激:)这也将是有趣的,知道的VolatileImage是我应该去为我的比赛,或者如果BufferedImage的方式或别的东西,是性能和帧速率更好的方法:)

回答

4

是的,你是对的。 VolatileImage是设备特定的。从"The VolatileImage API User Guide"你可以阅读:

的VolatileImage是特定于设备:当你创建一个 的GraphicsDevice的VolatileImage,你可能不能够说的VolatileImage复制到另一个 的GraphicsDevice。出于这个原因,您需要在尝试复制 VolatileImage之前调用验证。

如果代码是IMAGE_INCOMPATIBLE那么VolatileImage不 与当前GraphicsConfiguration兼容。如果图像是使用一个 GraphicsConfiguration创建的,然后再绘制到另一个图像中,则可能会发生此 不兼容问题。 例如,在多监视器情况下, ,VolatileImage存在是 与特定的GraphicsConfiguration相关联。将该 图像复制到不同的GraphicsConfiguration可能会导致 不可预知的结果。要解决此问题,你需要创建一个 新VolatileImage是与当前 GraphicsConfiguration

当拖动框架,你需要从你的VolatileImage.validate(gc)方法检查结果并重新创建另一个屏幕设备兼容图像到新设备。请注意,有些情况下您无法创建VolatileImage,在这种情况下,您需要回退BufferedImage之类的其他Image实施。

+0

VolatileImage是值得大惊小怪,然后通过BufferedImage? :) – Humphrey

+0

@Humphrey:他们快得多。但在你的情况下,这可能是一个不成熟的优化,我会建议先尝试'BufferedImage'。 :) – dacwe