java - 像素阵列过于占用 CPU

标签 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。我的 Activity 监视器显示应用程序使用了超过 100% 的 CPU。这显然是因为我在每次更新(每秒 60 次)时迭代像素数组(76k 整数)。

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

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

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

最佳答案

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

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

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

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

an example of 2D graphics using OpenGL

关于java - 像素阵列过于占用 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14822867/

相关文章:

java - 无法在Intellij Ultimate Edition 2017中创建新的Gradle项目

java - 从图像中剪切形状

c++ - GetPath() 是否返回三次或二次贝塞尔曲线控制点?

c++ - 我无法让我的简单程序将二维数组传递给函数

c - 如何修改传递给函数的二维数组?

algorithm - 将 XY 平面实体转换为任意平面

java - 空白的最终变量用于创建不可变对象(immutable对象)

java - 正则表达式排除特殊字符Java

java - Camel 处理器不 Autowiring Spring bean

multithreading - 使用 Haskell Graphics.Gloss 时出现 GLUT fatal error