在Java中进行2D游戏开发时,大多数教程都会创建一个缓冲策略来渲染。这非常合理。 但是,人们似乎倾向于将实际图形绘制到缓冲区的方法。Java缓冲策略图形或整型数组
一些教程创建了一个缓冲图像,然后创建一个整数数组来表示各个像素的颜色。
private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
Graphics g = bs.getDrawGraphics();
g.setColor(new Color(0x556B2F));
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
然而,一些其他教程不创建缓冲图像,绘图的像素为int阵列,而是使用BufferStrategy中的图形部件直接绘制它们的图像的缓冲器。
Graphics g = bs.getDrawGraphics();
g.setColor(new Color(0x556B2F));
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(testImage.image, x*128, y*128, 128, 128, null);
我只是想知道,为什么要创建整个int数组,然后绘制它。这需要在实现矩形,拉伸,透明度等方面做更多的工作。缓冲策略的图形组件已经具有可以很容易地调用的方法。 使用int数组会有一些巨大的性能提升吗?
我已经看了几个小时,所有我见过的网站只是解释他们在做什么,而不是他们为什么选择这样做。
我不是100%确定,但我会出现一些人认为它更快地更新int /像素数组,然后使用图形API。这可能是真实的,人们也可能不知道如何创建兼容的图形对象。使用缓冲策略应该提供几乎直接访问硬件层(如果可用),所以我不明白为什么你需要明白为什么你需要使用一个int数组,我只是这样,而我懒得那样;) – MadProgrammer
是的,我正在用这两种方法进行测试。使用int数组,我可以在我的fps开始减少到120以下之前改变大约27648000像素。使用图形对象,我可以渲染透明图像,放大到几千倍的缩放矩形,这几乎与int数组相等。 使用图形对象似乎更有用。 – Kabistarz
前段时间,我做了一个比较简单的例子,只用了一些JPanel和一些自定义绘画作为主要对象。然后我得到了4500个这些物体都朝不同的方向移动,包括主要物体的旋转,因此它指向它的运动方向。不确定帧速率是多少,但是我以25fps的速度刷新了它,并且它的表现非常出色。我认为在渲染管道中有很多优化,可以使用DirectX或OpenGL,但需要进行实验;) – MadProgrammer