我正在开发游戏,没什么大不了的,只是为了好玩。
我写了一个“ ImageBuilder”类来帮助创建一些图像。
一切正常,除了一件事。
我这样初始化变量:
// other stuff
m_tile = new ImageBuilder(TILE_SIZE, TILE_SIZE, BufferedImage.TYPE_INT_RGB).paint(0xff069dee).paintBorder(0xff4c4a4a, 1).build();
// other stuff
然后,在渲染方法中,我有:
for (int x = 0; x < 16; x++) {
for (int y = 0; y < 16; y++) {
g.drawImage(m_tile, x * (TILE_SIZE + m_padding.x) + m_margin.x, y * (TILE_SIZE + m_padding.y) + m_margin.y, null);
}
}
注意:m_padding和m_margin只是两个Vector2i
这会在屏幕上使用该图像绘制一个简单的16x16表格,但是游戏几乎停滞了,我无法获得超过10 FPS的数据。
我试图通过不这样做创建图像(TILE_SIZE = 32):
m_tile = new BufferedImage(TILE_SIZE, TILE_SIZE, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < TILE_SIZE; x++) {
for (int y = 0; y < TILE_SIZE; y++) {
if (x == 0 || y == 0 || x + 1 == TILE_SIZE || y + 1 == TILE_SIZE)
m_tile.setRGB(x, y, 0x4c4a4a);
else
m_tile.setRGB(x, y, 0x069dee);
}
}
这次,我得到60 FPS。 我不知道有什么区别,我曾经使用'ImageBuilder'创建图像,一切都很好,但是这次不行。
ImageBuilder类:
// Constructor
public ImageBuilder(int width, int height, int imageType) {
this.m_width = width;
this.m_height = height;
this.m_image = new BufferedImage(m_width, m_height, imageType);
this.m_pixels = ((DataBufferInt) m_image.getRaster().getDataBuffer()).getData();
this.m_image_type = imageType;
}
public ImageBuilder paint(int color) {
for (int i = 0; i < m_pixels.length; i++) m_pixels[i] = color;
return this;
}
public ImageBuilder paintBorder(int color, int stroke) {
for (int x = 0; x < m_width; x++) {
for (int y = 0; y < m_height; y++) {
if (x < stroke || y < stroke || x + stroke >= m_width || y + stroke >= m_height) {
m_pixels[x + y * m_width] = color;
}
}
}
return this;
}
public BufferedImage build() {
return m_image;
}
还有其他方法,但是我不叫它们,所以我认为没有必要写它们
我在做什么错了?
答案 0 :(得分:0)
我的猜测是问题在于您ImageBuilder
访问数据缓冲区的后备数据数组:
this.m_pixels = ((DataBufferInt) m_image.getRaster().getDataBuffer()).getData();
这样做,可能(会)破坏此图像被硬件加速的机会。 getData()
API doc记录了这种行为:
请注意,调用此方法可能导致此
DataBuffer
对象与某些实现所使用的性能优化(例如,将关联的图像缓存在视频内存中)不兼容。
通过在帐单中使用临时图像,然后从build()
方法返回尚未被篡改的临时图像的副本,您可能很容易解决此问题。
为获得最佳性能,始终使用兼容的图像(如createCompatibleImage()
,在注释中由@VGR提及)也是一个好主意。这应该确保您拥有最快的硬件故障。