使用大图像的Slick2D图形性能问题

时间:2014-11-09 11:08:34

标签: java performance opengl slick2d

我正在用Java编写2D月球登陆式游戏,并使用Slick2D库来处理图形。我在处理背景图像时遇到问题。

这是我的问题: 我在飞船背后的背景上绘制了3层细节(星星,山脉和陆地,包括着陆点)。当船(屏幕中心)四处移动时,这些都会重新绘制每个循环。

这些图层的图像宽4500像素,高1440像素。这主要是为了创造一些变化感(星星)并且足够宽以容纳所产生的山脉和陆地(土地包括着陆点)。每回合产生山脉和陆地,并将多边形绘制成保持图像。

Slick2d(或opengl)抱怨它无法处理这种大小的图像 - 它说它只能在我的开发PC上处理512 x 512的纹理。所以...如果我一直在探索不同的方法来解决这个问题,包括:

一个。在每个循环中进行多边形裁剪以将我的多边形(山脉和陆地)缩小到可显示的屏幕尺寸(640 x 480),但这似乎在数学上具有挑战性,或者

湾将我的图层图像分割成512x512个图块,然后用图块更新屏幕,这是我已经做过的扩展(包裹图层以创建一个无限的世界)所以看起来更有可能给我的能力。

我的第一个问题(或感觉检查,真的)是我错过了什么?我的图像虽然很大,但在内容方面却很小,例如黑色背景上有几行。有没有办法在Slick2D / opengl中压缩这些或者我错过了与设置有关的事情,这意味着我可以让我的卡处理更大的图像? (我假设没有,基于我所读到的,但希望永恒。)

所以,假设我没有错过任何明显的事情,那么第2部分......

作为一个快速的"我可能会逃避这个"解决方法,我已经恢复使用BufferedImages来保存图层,然后将这些图层中的部分提取到Slick2D图像中,并在每个渲染循环中在屏幕上绘制这些图像。这样做我得到大约3 FPS,这对于实时游戏来说显然有点慢。

创建我正在使用的BufferedImages:

   BufferedImage im_stars = new BufferedImage(bWIDTH, bHEIGHT, BufferedImage.TYPE_INT_ARGB);
   Graphics2D gr_stars = im_stars.createGraphics();

......然后我把我的内容画上了它们(星星等)

在我的渲染循环中,做一些数学计算我需要显示哪些图像块(以应对包装/提供无限的体验),然后提取相关的部分对Slick2D图像的BufferedImage如下:

Image i1_star = Tools.getImage(stars.getStarImg().getSubimage((int) x1, (int) y1, width, height));
g.drawImage(i1_star, 0, 0);

我编写了一个静态帮助器方法,将我的BufferedImage块转换为Slick2D Image,如下所示:

   protected static Image getImage(BufferedImage bi) {
     Image im = null;
     try {
       im = new Image(BufferedImageUtil.getTexture("", bi));
     } catch (IOException ex) {
       Logger.getLogger(Tools.class.getName()).log(Level.SEVERE, null, ex);
     }
     return im;
   }

我猜这是基于我得到的FPS做坏事的一种坏方法,尽管3看起来非常低。当我使用代码时,我得到了大约25 FPS,并写了自己做同样的事情!那么,是否有一种加速的Slick2D / opengl方法可以做到这一点我还缺少或者我是否需要平铺我的背景图像或将它们保存为多边形并开发多边形裁剪程序?

1 个答案:

答案 0 :(得分:2)

经过更多的研究,我发现我的显卡可以使用Slick2D支持最多4096 x 4096像素的图像:

BigImage.getMaxSingleImageSize();

我已恢复在程序中使用宽度不大于此大小的Slick2D图像文件,现在大约需要350 FPS,因此BufferedImage解决方案绝对是一个坏主意。