在Linux上翻转Java 2D页面

时间:2011-09-20 18:10:55

标签: java linux java-2d tearing double-buffering

我们的Java 2D应用程序在Linux上运行时会出现屏幕撕裂现象。在Windows上运行时不会出现任何撕裂现象。我们花了大量时间分析我们的代码,但还没有找到原因。虽然我从来没有人决定它不能成为我的错误代码,但我也很有可能认为这个问题与Linux上的Java 2D渲染管道有关。顺便提一下,请注意我们看到Java 6和Java 7的撕裂。在Java 7上运行时,无论是否启用XRender管道,我们都会看到撕裂。

我们当然通过BufferStrategy使用双缓冲。我们致电BufferStrategy时获得的Frame.createBufferStrategy(2)实施是java.awt.Component$FlipSubRegionBufferStrategy。此外,在isPageFlipping()的{​​{1}}上调用BufferStrategy会返回true,并且在函数上调用BufferCapabilities会返回false。我们没有以全屏独占模式运行,尽管我们尝试过这样做并且它没有解决问题。 isFullScreenRequired()返回BufferCapabilities.getFlipContents()(但我怀疑这不相关)。

由于支持页面翻转,我们正在翻页FlipContents.UNDEFINED(而不是blitting策略),我不希望渲染管道导致撕裂。然而,我发现了Chet Haase在2006年写的一个邮件列表消息,解决了一个屏幕撕裂问题,该问题表明,“你的特定平台上的翻转策略实际上是在幕后进行复制,这可能与BltBufferStrategy,它运行刷新工件。“

如何确定我们获得的翻转策略是否实际上不是页面翻转?

Chet还说,“使用BufferStrategy全屏运行是解决这个问题的一个不错的方法;根据平台和情况,我们通常会给你一个Flip策略,它通常与垂直刷新同步显示屏以避免撕裂。“

如何确定策略是否与显示器的垂直刷新同步?

(请参阅http://www.mail-archive.com/java2d-interest@capra.eng.sun.com/msg03743.html以获取上文引用的Chet Haase的完整信息)

2 个答案:

答案 0 :(得分:0)

根据发行版的不同,许多Linux系统现在都在发送默认情况下为3d渲染的桌面。如果您的其中一个显卡使用开源驱动程序的3D加速很差(或缺失),您可能需要安装专有的3D驱动程序才能使桌面渲染符合正常桌面使用的接受容差范围。

请记住,如果您的代码在其他平台上看起来正确,并且在那里表现令人钦佩;可能性在Linux上是正确的。只是考虑到X的历史和设计目标,Linux有更多的“渲染架构”差异。有可能是您的图形信息及时发送,但配置管道无法跟上(因此它会下降一点,导致撕裂)。

现在针对具体问题

如何确定我们获得的翻转策略是否实际上不是页面翻转?

通过调用已经调用过的方法。

如何确定策略是否与显示器的垂直刷新同步?

很难说,因为策略的重点是隐藏API用户的讨厌细节。我不是在这些封面下潜水的合适人选;但是,我对X方面的事情有很好的看法。

我向你提问,“除了你自己以外的任何其他应用程序,这个撕裂展览会不会出现?”

答案 1 :(得分:0)

您是否认为问题可能是在Windows上使用oracle jdk而在linux上使用open jdk?

很容易找到答案。在你的linux机器上安装oracle jdk并运行oracle jre。

有关如何安装here

的说明

有关如何在已安装的jre here

版本之间切换的详细信息