【问题标题】:Pixels Array Too CPU Intensive像素阵列过于 CPU 密集型
【发布时间】:2013-02-11 23:26:54
【问题描述】:

我从事 Java 2D 游戏已经有一段时间了。它是一个带有像素(整数)数组的光栅图形系统。

private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

然后我分别创建一个整数数组,使用屏幕对象(从外部图像文件,如 .png 渲染)对其进行操作,然后将该数组复制到我的主数组中,该数组投影在屏幕上。我发现在迭代中使用数组复制方法没有性能差异(并且真的没想到)。无论如何,图形渲染良好,游戏进展顺利。

但是,我发现这非常占用 CPU。我的活动监视器说应用程序正在使用超过 100% 的 CPU。这显然是因为我每次更新(每秒 60 次)都遍历一个像素数组(76k 整数)。

我选择这种技术是出于教育目的。这是一个个人项目,我只是想深入了解 Java 图形。我绝不会嫁给这种渲染技术。

我的问题分为三个相关的部分...

  1. 显然有更好的方法来做到这一点。哪些库/框架会做得更好?
  2. 这些库本质上会不会做同样的事情(循环遍历像素),只是以更有效的方式?
  3. 有没有一种方法可以在不使用外部工具的情况下优化这项技术,还是不值得?

【问题讨论】:

  • 你考虑过使用 OpenGL 吗?如果你想做一些像素方面的事情,你可以渲染成一个纹理,但这只会做一次,你可以在每隔一帧重用这个纹理。
  • 我对 OpenGL 没有任何经验,主要是因为我的印象是它与我的系统配合得不太好(二维和从外部图像文件渲染)。我将研究 OpenGL 纹理。
  • 嗯,这实际上取决于您如何处理图像加载,但是一旦将其放入类似 RGB 的数组中,您就可以在纹理上使用它。您也可以使用基于 OpenGL 构建的众多库之一,这些库能够自行加载图像。

标签: java graphics 2d game-engine raster


【解决方案1】:

OpenGL 最常与 3D 图形应用程序相关联,但它也可用于 2D 应用程序。使用正交投影和带纹理的四边形来代替精灵和背景图像,您可以构建完全没有 3D 元素的游戏的图形和界面,尽管事实上绘图是在某种意义上完成的3D。

我没有在 Java 中使用 OpenGL 的经验。但是,我知道可以使用 LWJGL 库和可能的其他库。如果您想大幅提高图形性能,您应该检查一下。

要回答您的第二个问题,此应用程序中的 OpenGL 实际上与您的方法非常不同,它使用与在 3D 中绘制纹理多边形相同的技术,而不是将简单的块图像传输到帧缓冲区中,尽管像素数据 可以访问和操作。

这是一个使用 OpenGL 和 C 的 2D 图形示例,来自一个我从未完成的游戏项目,但仍然可以作为我正在谈论的内容的一个很好的视觉示例。在这种情况下,我没有使用正交投影,而是使用透视矩阵通过在 3D 空间中绘制不同深度的各个层来获得视差效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2011-04-11
    • 2017-01-25
    相关资源
    最近更新 更多