0

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

我们当然是通过 a 使用双缓冲BufferStrategyBufferStrategy我们调用时得到的实现Frame.createBufferStrategy(2)是一个java.awt.Component$FlipSubRegionBufferStrategy. 此外,调用isPageFlipping()'BufferStrategy返回BufferCapabilitiestrue,调用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 )

4

2 回答 2

0

根据发行版的不同,许多 Linux 系统现在都提供默认 3d 渲染的桌面。如果您的显卡使用开源驱动程序的 3d 加速效果不佳(或缺失),您可能需要安装专有的 3d 驱动程序,以使桌面渲染在正常桌面使用的可接受容差范围内。

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

现在针对具体问题

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

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

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

很难说,因为该策略的全部目的是向 API 用户隐藏令人讨厌的细节。我不是在这些掩护下潜水的合适人选;但是,我确实对 X 方面的事情有很好的看法。

我问你的问题,“除了你自己的应用程序之外,这种撕裂是否会出现在任何其他应用程序中?”

于 2011-09-20T19:27:16.883 回答
0

您是否考虑过问题可能是在 Windows 上您使用的是 oracle jdk 而在 linux 上您使用的是 open jdk?

它很容易找出来。在您的 linux 机器上安装 oracle jdk 并针对 oracle jre 运行。

关于如何安装的说明在这里

有关如何在已安装的 jre 版本之间切换的详细信息,请点击此处

于 2014-05-22T10:27:42.320 回答