有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java像素阵列过于CPU密集

我已经为一款Java2D游戏工作了一段时间。它是一个具有像素阵列(整数)的光栅图形系统

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. 有没有一种方法可以在不使用外部工具的情况下优化此技术,或者根本不值得

共 (1) 个答案

  1. # 1 楼答案

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

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

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

    这里有一个使用OpenGL和C的2D图形的例子,来自一个我从未完成的游戏项目,但可以作为我所说的一个很好的视觉例子。在本例中,我没有使用正交投影,而是使用透视矩阵,通过在三维空间中不同深度绘制不同的层来获得视差效果

    an example of 2D graphics using OpenGL