gpt4 book ai didi

Java - 如何有效地绘制图形

转载 作者:行者123 更新时间:2023-11-30 11:40:49 25 4
gpt4 key购买 nike

我在这里尝试做的是尽可能快地渲染游戏中的所有图形。该游戏是基于图 block 的,需要渲染大量图像。我遇到的问题是绘制所有图像需要很长时间。我不知道我是否应该以一种特殊的方式绘制瓷砖,但现在我正在一个接一个地渲染视口(viewport)内的所有瓷砖。

这是我的画法:

public void draw(Graphics2D g){

boolean drawn=false; // if player is drawn
int px=vpPosX, py=vpPosY; // Viewport Position

for(int y=Math.round(py/64); y<Math.round(py/64)+core.blcHeight; y++){
for(int x=Math.round(px/64); x<Math.round(px/64)+core.blcWidth; x++){
if(y<height && x<width && y>-1 && x>-1 && worldData[currentLayer][x][y] != 0){ // if tile is inside map
BufferedImage img = tileset.tiles[worldData[currentLayer][x][y]]; //tile image
if(-py+player.PosY+64-15 < (y*64)-py-(img.getHeight())+64 && drawn==false){player.draw(g);drawn=true;} // if player should be drawn
if(worldBackground[currentLayer][x][y]!=0){ // if tile has background
BufferedImage imgBack = tileset.tiles[worldBackground[currentLayer][x][y]]; // background tile
g.drawImage(imgBack, (x*64)-px-(((imgBack.getWidth())-64)/2), (y*64)-py-(imgBack.getHeight())+64, null); //draw background
}
g.drawImage(img, (x*64)-px-(((img.getWidth())-64)/2), (y*64)-py-(img.getHeight())+64, null); // draw tile
}
}
}

if(!drawn){player.draw(g);} // if drawn equals false draw player

}

所有图像都加载到 tileset 类中。
游戏 fps/ups 锁定在 60。
从具有游戏循环的核心类调用此方法。

我想知道我做错了什么?
我需要更改绘制方法吗?
我需要以特殊方式加载图像吗?
我需要改变我的绘画方式吗?

我的目标是制作一款无延迟的 2d 瓷砖游戏。

我自己注意到的事情是我的缓冲图像包含平铺图像是 RGBA 格式。但是当我把它做成 RGB 时,渲染时间就少了很多。我知道额外的信息需要更多的时间来绘制。但我不知道它到底有多少。

我设法找到了一个让性能更好的东西。
如果我加载所有图像并将它们复制到以这种方式创建的图像中:

BufferedImage bi = ImageIO.read(ims[i]);
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage b = gc.createCompatibleImage(bi.getWidth()*4, bi.getHeight()*4, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = b.createGraphics();
g.drawImage(bi, 0, 0, bi.getWidth()*4, bi.getHeight()*4, null);
tiles[id]=b;
g.dispose();

然后绘制所有图 block 所花费的时间就少了很多。但它仍然可以更好。当我要制造光引擎时(例如在地下)。然后我将不得不在瓷砖上使用透明矩形。或者,如果有人可以建议一种更好的方法,可以在不使用透明矩形的情况下使瓷砖变暗。但问题是,在尝试绘制透明矩形时也会出现滞后。我不知道我是否应该避免使用透明图像和矩形或什么。

希望有人能指出我正确的方向。

最佳答案

一些您可能会觉得有用的技巧:

  • 如果您有很多静态背景图 block ,那么不要每帧都重新绘制它们 - 只需将它们绘制一次到 BufferedImage 中并使用它来绘制整个背景一气呵成。如果其中一个图 block 发生变化或滚动屏幕等,您只需要更新此背景图像。
  • 确保您只绘制可见的图 block 。看起来您可能正在这样做,但如果 core.blcHeight 和 core.blcWidth 太大,那么您可能绘制了太多图 block 。
  • 不必担心锁定到 60FPs。对于基于图 block 的游戏,这可能不是必需的。我建议将您的游戏逻辑与帧速率分离,并让游戏以它可以处理的任何速度呈现。
  • 对于纯色背景图 block ,您不需要使用 alpha 阴影进行绘制。在某些情况下,这可以显着加快绘图速度。即您可以使用 TYPE_INT_RGB 而不是 TYPE_INT_ARGB

如果您真的想要高性能绘图/动画,那么您可能需要考虑切换到基于 OpenGL 的渲染引擎 - Slick2DLWJGL例如。

关于Java - 如何有效地绘制图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12542422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com