当前位置: 首页 > 知识库问答 >
问题:

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

曹建华
2023-03-14

我正在用Java编写一个2D月球着陆器风格的游戏,并使用Slick2D库处理图形。我在处理背景图像时遇到问题。

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

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

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

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

b.将我的图层图像分割成512x512个图块,然后用图块更新屏幕,这是我已经做的事情的扩展(包装图层以创建一个“无限”的世界),所以考虑到我的能力,这似乎更可行。

我的第一个问题(或者说感觉检查,真的)是我遗漏了什么吗?我的图片虽然很大,但在内容方面却很小,比如黑色背景和几行文字。有没有办法在Slick2D/opengl中压缩这些图像,或者我错过了一些与设置有关的东西,这些设置意味着我可以让我的卡处理更大的图像?(根据我所读到的内容,我假设不是这样,而是希望永远存在。)

所以,假设我没有错过任何明显的东西,在第二部分。。。

作为一个快速的“我可能会逃脱这个”解决方案,我已经恢复到使用BuffereImage来保存层,然后将其中的部分提取到光滑的2D图像中,并在每个渲染循环中在屏幕上绘制这些图像。这样做的话,我得到了大约3帧,这显然是一个有点慢的实时游戏。

要创建我正在使用的BuffereImage,请执行以下操作:

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

... 然后我把我的内容画在上面(星星等)

在我的渲染循环中,我会做一些数学运算,计算出需要显示哪些图像块(以应对包装/提供“无限”体验),然后将BuffereImage的相关部分提取到光滑的2D图像中,如下所示:

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

我已经编写了一个静态助手方法,将我的BuffereImage块转换为Slick2D图像,如下所示:

   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!那么,有没有一种2D/opengl加速的方式来实现这一点,而我却没有,或者我又回到了必须平铺背景图像或将它们作为多边形保存并开发多边形剪裁例程的状态?

共有1个答案

戚均
2023-03-14

做了更多的研究后,我发现我的显卡可以支持高达4096 x 4096像素的图像使用Slick2D的:

BigImage.getMaxSingleImageSize();

在我的程序中,我已经恢复使用宽度不大于这个大小的Slick2D图像文件,现在速度大约为350 FPS,所以BuffereImage的解决方案肯定是个坏主意。

 类似资料:
  • 在Mac OS X El Capitan,OpenGL版本4.1,我的LWJGL 3.0应用程序挂起时调用Slick2D函数 下面是我试图用来加载纹理的代码。它与主循环在同一线程上运行,并在设置窗口后调用。 该文件确实存在,当我注释掉用于纹理处理的代码时,代码运行良好,这就是这种方法 我尝试使用的纹理是1024 x 1024 PNG图像, 我还尝试使用小得多的16 x 16像素图像, 但我得到了同

  • 我正在尝试写一些程序,在那里我加载图像到一个面板。以下是我的5个问题: 1>可以加载什么样的(扩展)图像有限制吗?我试着加载一个.bmp文件,即使我用.jpg重命名了它,它也没有加载。但是,加载了一些扩展名为.png或.jpg的其他文件。 就是这样。用一些例子来详细说明会很好。提前道谢。

  • 我在超文本标记语言页面中包含了一个堆叠条形图(带有Chart.js库),可以让用户可视化一些数据。这些数据会随着用户的选择而改变,启用此onClick功能的Javascript函数是: 其中函数createData创建JSON对象(带有标签和数据集)以传递给图形(工作正常),函数makeGrafico(): 获取用于显示的参数的名称,以及上一个函数的JSON对象。 当我第一次单击一个程序时(具有o

  • 黄金法则 二八原则 系统中 20% 的代码会消耗 80% 的性能!在进行性能优化时,我们应该始终坚持这个原则。 够用原则 如果有两种方式渲染图像,无法观察出哪个渲染的效果更好,那就选用性能消耗更低的方式。我们知道,RGBA4444 像素格式的 PNG 图像质量比 RGBA8888 像素格式的要低,但是如果在游戏效果上,无法观察出哪个效果好,我们应该坚持使用 RGBA4444 的像素格式,因为它占用

  • 我目前正在开发一种实时数据绘图解决方案,该解决方案能够频繁接收新数据(高达1kHz)并以较低的速率(例如50hz)执行重绘。我使用FLTK进行了第一次实现,但我想尝试一下GTK,因为我以前从未使用过它,它看起来对我来说很有希望。 为了简短起见,我注意到与我使用FLTK测量的结果相比,在绘制线条时调用cairo_stroke()需要花费很多时间(FLTK中没有笔划,fust一个fl_line()函数

  • 我目前正在为特别大的图像文件(有时在千兆像素)设计和开发定制的图像查看器。幸运的是,这些在分阶段分辨率层中以256x256瓦片的形式提供,然后在需要时传递给OpenGL。 瓷砖本身通过一个四叉树进行管理,这似乎是“几乎两幅图像的幂”的一个强有力的解决方案。然而,如果图像的宽高比非常大(例如,1千兆像素x 50000),模型就会因大量的空分片而变得不稳定。一次只能展示有限数量的瓷砖。 我正在使用Ja