我们的 Java 2D 应用程序在 Linux 上运行时会出现屏幕撕裂现象。在 Windows 上运行时,它不会出现任何撕裂。我们花了很多时间分析我们的代码,但还没有找到原因。虽然我从不认为这一定不是我的代码有错,但我也认为问题出在 Linux 上的 Java 2D 渲染管道的可能性。顺便说一句,请注意我们看到了 Java 6 和 Java 7 的撕裂。在 Java 7 上运行时,无论是否启用 XRender 管道,我们都会看到撕裂。
我们当然是通过 a 使用双缓冲BufferStrategy
。BufferStrategy
我们调用时得到的实现Frame.createBufferStrategy(2)
是一个java.awt.Component$FlipSubRegionBufferStrategy
. 此外,调用isPageFlipping()
'BufferStrategy
返回BufferCapabilities
true,调用isFullScreenRequired()
功能返回 false。我们没有在全屏独占模式下运行,尽管我们尝试过这样做,但并没有解决问题。 BufferCapabilities.getFlipContents()
返回FlipContents.UNDEFINED
(但我怀疑这不相关)。
由于据称支持页面翻转并且我们正在获得页面翻转BufferStrategy
(而不是 blitting 策略),我不认为渲染管道会导致撕裂。然而,我发现 Chet Haase 在 2006 年写的邮件列表消息解决了屏幕撕裂问题,其中指出:“您特定平台上的 Flip 策略可能实际上是在幕后进行复制,这与BltBufferStrategy,它运行到刷新工件中。”
我如何确定我们得到的翻转策略是否实际上不是页面翻转?
Chet 还表示,“使用 BufferStrategy 运行全屏是解决此问题的一种不错的方法;根据平台和情况,我们通常会为您提供 Flip 策略,该策略(通常)与显示的垂直刷新同步以避免撕裂。”
如何确定策略是否与显示的垂直刷新同步?
(有关上述来自 Chet Haase 的完整信息,请参见http://www.mail-archive.com/java2d-interest@capra.eng.sun.com/msg03743.html )