繁体   English   中英

Java 2D绘图最佳性能

[英]Java 2D Drawing Optimal Performance

我正在编写Java 2D游戏。 我正在使用内置的Java 2D绘图库,绘制了一个Graphics2D,我从一个来自Canvas in JFrame的BufferStrategy中获取(有时是完全筛选的)。 BufferStrategy是双缓冲的。 重绘是通过计时器主动完成的。 我遇到了一些性能问题,特别是在Linux上。

Java2D有很多方法可以创建图形缓冲区和绘制图形,我只是不知道我做的是否正确。 我一直在尝试使用graphics2d.getDeviceConfiguration()。createCompatibleVolatileImage,看起来很有前景,但我没有真正的证据,如果我将绘图代码切换到那个,它会更快。

根据您的经验,在Java 1.5+中将2D图形渲染到屏幕上的最快方法是什么? 请注意,游戏相当遥远,因此我不想切换到完全不同的绘图方法,如OpenGL或游戏引擎。 我基本上想知道如何使用Graphics2D对象以最快的方式将内容绘制到屏幕上。

这篇文章的答案, Consty的答案以及我自己的研究的综合:

什么有效:

  • 使用GraphicsConfiguration.createCompatibleImage创建与您正在绘制的图像兼容的图像。 这绝对必要!
  • 通过Canvas.createBufferStrategy使用双缓冲绘图。
  • 使用-Dsun.java2d.opengl=True可用于加速绘图。
  • 避免使用变换进行缩放。 相反,缓存您要使用的图像的缩放版本。
  • 避免半透明图像! 位掩码图像很好,但Java2D中的半透明度非常昂贵。

在我的测试中,使用这些方法,我的速度提高了10倍到15倍,使得适当的Java 2D图形成为可能。

我遇到了和你想象的一样的问题。 看看我的帖子:

Java2D性能问题

它显示了性能下降的原因以及如何解决它。 但并不能保证在所有平台上都能正常运行。 你会在帖子中看到原因。

这是我头顶的一些提示。 如果你更具体,你想要做什么,我可以提供更多帮助。 听起来像游戏,但我不想假设。

只绘制你需要的东西! 不要盲目地一直调用repaint(),尝试一些像重绘(Rect)或重绘(x,y,w,h)的兄弟姐妹。

对alpha混合要非常小心,因为混合图像/基元可能是一项昂贵的操作。

尝试尽可能多地预渲染/缓存。 如果你发现自己以同样的方式画一个圆圈,一遍又一遍,考虑插入BufferedImage,然后绘制BufferedImage。 你为了速度而牺牲内存(典型的游戏/高性能图形)

考虑使用OpenGL,使用LWJGL的JOGL。 JOGL更像Java,而LWJGL在OpenGL访问之上提供更多游戏功能。 OpenGL可以绘制数量级(使用适当的硬件和驱动程序),而不是Swing。

我认为还有一个尚未提及的重要内容:缓存一切可能的图像。 如果您有一个在屏幕上移动的对象,并且它的外观没有太大变化,请将其绘制到图像,然后在每个帧的新位置将图像渲染到屏幕。 即使对象是一个非常简单的对象,这样做 - 你可能会惊讶于你节省了多少时间。 渲染位图比渲染基元快得多。

您可能还希望明确设置渲染提示,并在质量考虑允许的情况下关闭抗锯齿等功能。

我已经使用Java完成了一些基本的绘图应用程序。 我没有处理任何过于图形密集的事情,但我建议你对所有'重绘'调用都有一个很好的处理。 父容器上的额外重绘调用可能会使渲染量增加一倍。

我一直在看这个问题,希望有人能给你一个比我更好的答案。

与此同时,我发现了以下Sun白皮书 ,该白皮书是在jdk 1.4测试版发布后编写的。 这里有一些关于微调的有趣建议,包括运行时标志(在文章的底部):

Solaris和Linux的运行时标志

从版本1.4的Beta 3版本开始,无论您是在本地还是远程显示环境中工作,当DGA不可用时,Java 2D默认以pixmaps格式存储图像。 您可以使用pmoffscreen标志覆盖此行为:

-Dsun.java2d.pmoffscreen =真/假

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

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

您需要记住几件事

1)刷新此链接显示如何使用swingtimers,这可能是调用重绘的一个很好的选择。 重新弄清楚(正如以前的海报所说的那样重要,所以你没有做太多的工作)。

2)确保你只是在一个线程中绘图。 从多个线程更新UI可能会导致令人讨厌的事情。

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

如果您不想使用纯Java 2D,另一种选择是使用GTGE或JGame等游戏库(在Google上搜索它们),然后提供对图形的轻松访问,并提供双缓冲和更简单的绘图命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM