Java的2D绘图性能优化(Java 2D Drawing Optimal Performance)

2019-07-19 19:41发布

我在写一个Java 2D游戏的过程。 我使用的是内置的Java 2D绘图库,画上一个Graphics2D我从BufferStrategy中获得从一个JFrame画布(这有时是全屏蔽)。 该BufferStrategy中的双缓冲。 重绘正在积极进行,通过一个定时器。 我有一些性能问题,虽然,特别是在Linux上。

和Java2D的具有创建图形缓冲区和绘制图形,我只是不知道如果我做了正确的事情,这样很多种方式。 我一直在尝试与graphics2d.getDeviceConfiguration()。createCompatibleVolatileImage,这看起来很有希望,但我没有真正证明它这将是任何更快,如果我的绘制代码切换到。

在你的经验,什么是渲染2D图形上使用Java 1.5+屏幕的最快方法? 请注意,游戏是相当遥遥领先,所以我不想切换到绘图的一个完全不同的方法,如OpenGL或游戏引擎。 我基本上想知道如何使用Graphics2D对象绘制的东西到屏幕的最快方式。

Answer 1:

我有同样的问题,因为你是我的想法。 点击这里,查看我的帖子:

Java2D的性能问题

它显示了性能下降,以及如何解决它的原因。 它不能保证所有平台上,虽然很好地工作。 你就会明白为什么在后。



Answer 2:

在回答这个帖子,回答的合成Consty的 ,和我自己的研究:

什么工作:

  • 使用GraphicsConfiguration.createCompatibleImage来创建你画什么兼容的影像。 这是绝对必要的!
  • 通过使用双缓冲绘图Canvas.createBufferStrategy
  • 使用-Dsun.java2d.opengl=True如果可以加快绘图。
  • 避免使用变换缩放。 相反,高速缓存缩放你要使用的图像的版本。
  • 避免半透明图像! Bitmasked图像都很好,但半透明在的Java2D非常昂贵。

在我的测试中,使用这些方法,我得到了10倍的速度增长 - 15倍,使正确的Java 2D图形的可能性。



Answer 3:

这里是把我的头顶部的一些技巧。 如果你是更具体和你试图做我也许能帮助更多。 听起来像一个游戏,但我不想承担。

只画你需要什么! 不要盲目地调用repaint()所有的时间,尝试一些兄弟姐妹像重绘(矩形)或重绘(X,Y,W,H)。

要非常小心,alpha混合,因为它可以是一个昂贵的操作,以混合图像/图元。

尝试预渲染/缓存尽可能。 如果你发现自己画一个圆圈以同样的方式,一遍又一遍,考虑在绘制成一个BufferedImage,然后就应用BufferedImage。 你牺牲速度的内存(典型的游戏/高PERF图形)

考虑使用OpenGL,使用LWJGL的JOGL。 JOGL是更多的Java类,而LWJGL提供的OpenGL的访问顶端更多游戏功能。 OpenGL的可以得出几个数量级(与适当的硬件和驱动程序),比摆动即可。



Answer 4:

还有哪些尚未提及的重要一员,我想:尽你所能的缓存图片。 如果您有在屏幕上移动的物体,它的外观上并没有太多的新位置每一帧改变,它画到图像,然后渲染图像到屏幕上。 做到这一点,即使对象是一个非常简单的 - 你可能在你节省多少时间感到惊讶。 渲染位图是不是渲染图元快得多。

你可能也想看看在明确设置呈现提示,并关闭之类的东西,如果抗锯齿质量考虑允许。



Answer 5:

我用Java做了一些基本的绘图应用程序。 我还没有制定任何东西太多图形密集的,但我会建议你对所有的“重绘”调用一个很好的处理。 父容器上的额外重绘通话可能会增加一倍渲染你这样做的量。



Answer 6:

我一直在看这个问题,希望有人能为您提供更好的答案比我的。

在此期间,我发现下面的太阳白皮书这是JDK 1.4的测试版后写的。 这里有上微调了一些有趣的建议,其中包括运行时的标志(在文章底部):

运行时标志Solaris和Linux

随着Beta 3的发布的SDK,版本1.4开始,Java的2D默认存储在像素图图像时DGA不可用,无论你是在本地或远程显示环境中工作。 您可以覆盖与pmoffscreen标志这种行为:

-Dsun.java2d.pmoffscreen =真/假

如果此标志设置为true,屏幕外的像素映射支持启用即使DGA是可用的。 如果将此标志设置为false,屏幕外的像素映射支持被禁用。 禁用屏幕外的像素映射支持,可以解决一些渲染的问题。



Answer 7:

确保你使用双缓冲,先画到内存中的一个大缓冲区,你当所有的绘制完成,然后刷新到屏幕上。



Answer 8:

有几件事情你需要牢记

1)刷新此链接显示了如何使用这可能是调用重绘一个不错的选择swingtimers。 获取重绘想通了(如上海报说是重要的,所以你没有做太多的工作)。

2)确保你只是在做一个线拉拽。 从多张线程更新UI可导致讨厌的东西。

3)双缓冲。 这使得渲染平滑。 这个网站有你一些好的信息



Answer 9:

如果你不想去的纯Java 2D另一种方法是使用一个游戏库如GTGE或JGame(寻找他们在谷歌),然后提供方便地访问图形和还提供双缓冲和更简单的绘画命令。



文章来源: Java 2D Drawing Optimal Performance