gpt4 book ai didi

Java2D 性能问题

转载 作者:IT老高 更新时间:2023-10-28 20:32:41 24 4
gpt4 key购买 nike

我在使用 Java2D 时遇到了性能异常。我知道 sun.java2d.opengl VM 参数可以为 2D 启用 3D 加速,但即使使用它也有一些奇怪的问题。

这是我运行的测试结果:

在 JComponent 上使用 32x32 像素的瓦片绘制 25x18 的 map
图片 1 = .bmp 格式,图片 2 = .png 格式

没有-Dsun.java2d.opengl=true

120 FPS 使用 .BMP 图像 1
13 FPS 使用 .PNG 图像 2

使用 -Dsun.java2d.opengl=true

12 FPS 使用 .BMP 图像 1
700 FPS 使用 .PNG 图像 2

如果没有加速,我假设我在软件中执行的每个 drawImage() 都会发生某种转换,并且在 .PNG 的情况下会显着降低 FPS。但是,为什么随着加速,结果会发生变化(而且 PNG 实际上执行得更快)?!疯了!

.BMP Image 1 被转换为 TYPE_INT_RGB 的图像类型。 .PNG 图像 2 被转换为 TYPE_CUSTOM 的图像类型。为了在使用和不使用 opengl 加速的情况下获得一致的速度,我必须创建一个图像类型为 TYPE_INT_ARGB 的新 BufferedImage,并将图像 1 或图像 2 绘制到这个新图像上。

以下是运行结果:

没有-Dsun.java2d.opengl=true

120 FPS 使用 .BMP 图像 1
120 FPS 使用 .PNG 图像 2

使用 -Dsun.java2d.opengl=true

700 FPS 使用 .BMP 图像 1
700 FPS 使用 .PNG 图像 2

我真正的问题是,我可以假设 TYPE_INT_ARGB 将是所有系统和平台的 native 图像类型吗?我假设这个值可能不同。有没有办法让我获得 native 值,以便我总是可以创建新的 BufferedImages 以获得最佳性能?

提前谢谢...

最佳答案

我想我通过研究和整理来自太多 Google 搜索的点点滴滴找到了解决方案。

这里是,评论和所有:

private BufferedImage toCompatibleImage(BufferedImage image)
{
// obtain the current system graphical settings
GraphicsConfiguration gfxConfig = GraphicsEnvironment.
getLocalGraphicsEnvironment().getDefaultScreenDevice().
getDefaultConfiguration();

/*
* if image is already compatible and optimized for current system
* settings, simply return it
*/
if (image.getColorModel().equals(gfxConfig.getColorModel()))
return image;

// image is not optimized, so create a new image that is
BufferedImage newImage = gfxConfig.createCompatibleImage(
image.getWidth(), image.getHeight(), image.getTransparency());

// get the graphics context of the new image to draw the old image on
Graphics2D g2d = newImage.createGraphics();

// actually draw the image and dispose of context no longer needed
g2d.drawImage(image, 0, 0, null);
g2d.dispose();

// return the new optimized image
return newImage;
}

在我之前的帖子中,GraphicsConfiguration 包含在系统上创建优化图像所需的信息。它似乎工作得很好,但我原以为 Java 会自动为你做这件事。显然你不能对 Java 感到太舒服。 :) 我想我最终回答了我自己的问题。哦,好吧,希望它对我看到尝试将 Java 用于 2D 游戏的一些人有所帮助。

关于Java2D 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/196890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com