像素阵列太CPU密集

时间:2013-02-11 23:26:55

标签: java graphics 2d game-engine raster

我一直在研究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。这显然是因为我正在迭代每个更新的像素数组(76k整数)(每秒60次)。

我选择这种技术用于教育目的。这是一个个人项目,我只想深入了解Java图形。我决不与这种渲染技术结合。

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

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

1 个答案:

答案 0 :(得分:6)

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

我没有在Java中使用OpenGL的经验。但是,我知道可以使用LWJGL库以及其他库。如果要大幅提高图形性能,应该查看它。

为了回答你的第二个问题,这个应用程序中的OpenGL实际上与你的方法有很大的不同,使用与在3D中绘制纹理多边形相同的技术而不是简单的块图像传输到帧缓冲区,尽管像素数据可以进行访问和操作。

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

an example of 2D graphics using OpenGL