【问题标题】:Slow Java2D Drawing on Integrated Graphics集成图形上的慢速 Java2D 绘图
【发布时间】:2013-10-29 11:15:49
【问题描述】:

我正在开发一个简单的 2D 游戏,通过 Java2D API 进行渲染。我注意到,当我尝试在集成显卡上绘图时,性能会崩溃。

我已经在我的主设备上使用较新的 ATI Radeon 和我的 5 年前的笔记本电脑测试了这款游戏,该笔记本电脑也有一个(令人难以置信的过时的)Radeon。在这两种情况下,我的 FPS 都不错,但是当我尝试使用 Intel i5 的板载 HD 4000 显卡时,它会以 20 FPS 左右的速度爬行。

我正在使用全屏独占模式。

在任何特定时刻,我都会一次渲染大约 1000 张图像。

令人讨厌的是,当我尝试 getAvailableAcceleratedMemory() 时,它只会为这张卡返回 -1,而且它似乎拒绝加速任何图像。

有没有人知道如何解决这个问题?

渲染代码:

    Graphics g = bufferStrategy.getDrawGraphics();
    g.drawImage(img, x, y, img.getWidth(), img.getHeight(), null)
    g.dispose();
    bufferStrategy.show();

图片加载代码:

    BufferedImage I = null;
    I = ImageIO.read(new File(currentFolder+imgPath));
    imgMap.put(imgIdentifier, I);

图像存储在由字符串标识的 BufferedImages 的哈希图中,因此当实体需要绘制和图像时,它只需将其从哈希图中取出并进行绘制。在当前情况下,实体主要是地砖和墙砖,因此它们永远不会改变(因此除了第一次外,不必从哈希图中获取图像)。

编辑 - 我采用了 MadProgrammer 的方法,但它并没有改变我的 FPS。

【问题讨论】:

  • 您可以尝试使用GraphicsConfiguration#createCompatiableImage 并绘制您已加载的图像。这将节省每次即时转换图像的时间......
  • 我看过一些关于这个的帖子,我对它进行了一些修改,它只画了我的 3 张图像,其余时间什么也没画。我假设我做错了什么。您能否详细说明我提供的 sn-ps 中的下落?
  • 我已经添加了我使用的代码。希望它有所帮助......我用它来制作多张图像的多层透明动画,它对我的​​ Mac 笔记本电脑产生了巨大的影响
  • 谢谢!我只是试了一下(没有 g2d.drawimage 的东西),但它并没有真正帮助。它确实渲染正确,但并没有改变我的 FPS。编辑:在 g2d.drawImage 东西中添加,没有变化。
  • JRE 使用的是什么版本的操作系统?它们是相同的位深度(32 位还是 64 位)?可能是驱动不兼容

标签: java performance java-2d 2d-games


【解决方案1】:

这是将图像转换为兼容图像的示例...本身并不是答案

这是我使用的一些库代码...

public static BufferedImage createCompatibleImage(BufferedImage image) {
    BufferedImage target = createCompatibleImage(image, image.getWidth(), image.getHeight());
    Graphics2D g2d = target.createGraphics();
    g2d.drawImage(image, 0, 0, null);
    g2d.dispose();
    return target;
}

public static BufferedImage createCompatibleImage(BufferedImage image,
        int width, int height) {
    return getGraphicsConfiguration().createCompatibleImage(width, height, image.getTransparency());
}

public static GraphicsConfiguration getGraphicsConfiguration() {
    return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
}

我会做类似...

I = createCompatibleImage(ImageIO.read(new File(currentFolder+imgPath)));
imgMap.put(imgIdentifier, I);

【讨论】:

  • 我正要试一试,但是创建 Graphics2D 对象并绘制它的线条究竟有什么好处?或者您在代码中的使用方式略有不同?
  • 我很确定我已经读过硬件加速在集成显卡上很挑剔。无论哪种方式,我已经注意到使用 createCompatibleImage 对 HD 3000 的改进,无论如何你都应该这样做。也许也可以看看:stackoverflow.com/questions/14635377/…
  • @BattleBarnes 您创建了一个(希望)格式与显示设备更兼容的图像,并将您从文件加载的图像绘制到它上面。然后使用兼容的图像而不是文件中的图像对图像执行任何操作。
  • 按照我的理解,g2d 和 g2d.drawImage 并不是让它更有能力的原因。我认为操作代码是 createCompatibleImage 的东西,不是吗?
  • @BattleBarnes 基本上代码试图生成一个图像,其数据结构和颜色模型与底层GraphicsConfiguration兼容,因此在绘制时不需要转换图像在飞行中,每次。基本上,将原始图像绘制到“兼容”图像上的行为为我们完成了一次对话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 2015-01-05
相关资源
最近更新 更多