首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Graphics2D性能问题

Graphics2D性能问题
EN

Stack Overflow用户
提问于 2014-05-22 23:57:01
回答 2查看 301关注 0票数 2

我是Java图形库的新手,我还在努力适应它的局限性。下面我有一个用于Grid类的绘制函数,它将一个二维的瓦片数组绘制为填充的矩形。

不是说它与问题相关,而是scale和offset参数用于调整网格的tiles和tileSize变量,以便在屏幕上以正确的位置和比例绘制网格。

我的问题是,当tiles变量非常大时,这会出现相当大的延迟吗?我通常在屏幕上没有任何栅格的情况下获得大约500fps的分辨率,并且当栅格的tiles10为50时,没有明显的减少。但在tiles1000中,要绘制的矩形总数为1,000,000,fps将降至7。

我知道一百万很多,但它们毕竟只是长方形,而且我的电脑可以在全设置下玩像Skyrim这样的游戏没有问题。我想象在Skyrim中有超过一百万个多边形展示,它们都有各种高分辨率的纹理和照明,所以,为什么一百万个灰色方块会有这样的问题?Java的图形库真的很差吗?我是不是期望太高了?或者,就像我怀疑的那样,有没有更好的方法来画这样的东西?

如果这很重要,我可以提供主类的paintComponent,但它只是一个对_Grid.draw()的调用,所以我不认为有问题。

代码语言:javascript
复制
public Graphics draw(Graphics g, double scale, Point offset) {

    Graphics2D g2 = (Graphics2D) g;

    for(int i = 0; i != this.tiles.length; i++) {
        for(int j = 0; j != this.tiles[0].length; j++) {

            boolean draw = true;

            if(this.tiles[i][j].type.equals("EMPTY")) {
                draw = false;
            } else if(this.tiles[i][j].type.equals("PATH")) {
                g2.setColor(Color.LIGHT_GRAY);
            } else if(this.tiles[i][j].type.equals("WALL")) {
                g2.setColor(Color.DARK_GRAY);
            }

            if(draw) {
                g2.fillRect((int)((this.xPos+i*this.tileSize)*scale + offset.x), 
                            (int)((this.yPos+j*this.tileSize)*scale + offset.y), 
                            (int)(this.tileSize*scale), 
                            (int)(this.tileSize*scale));
            }
        }
    }

    return g2;

}
EN

回答 2

Stack Overflow用户

发布于 2014-05-22 23:59:58

Java的BufferedImage类很慢。这是一个众所周知的事实。如果你想做快速的图像处理,那么它是错误的工具。

此外,像Skyrim这样的游戏正在使用图形卡来完成大部分工作,使用Java Image,所有这些都是在CPU中完成的。

你真的应该考虑使用游戏框架--有像Slick2d这样的2d框架,也有像jMonkeyEngine3这样的3d框架。

票数 3
EN

Stack Overflow用户

发布于 2014-05-23 00:11:41

以下是你可以考虑尝试的几件事:

  1. 如果您的原始Graphics对象是由BufferedImage创建的,请考虑改用VolatileImage。正如其他人所说的,这个绘制方法中的所有事情都是通过Swing事件分派线程在CPU上发生的,所以您只能使用单个CPU进行绘制(除非您在某个地方产生更多的线程)。
  2. 你正在做大量的字符串比较,这可能会非常慢。我会考虑将type字段重构为自定义enum,然后让enum定义自己的draw方法,该方法接受Graphics对象并绘制自身。这样,您就可以调用this.tyles[i][j].type.draw(g2)并依靠后期绑定来绘制正确颜色的矩形,从而消除String comparisons.
  3. Make确保您只绘制屏幕上的内容。我对你的tiles数组一无所知,但是如果它比实际渲染到屏幕上的值大得多,你可能会浪费很多CPU周期。
  4. 这听起来可能很傻,但实际上你正在做的内存访问是你真正需要的两倍。我将假设您在源代码中的某处定义了Tile[][] tiles ...。在外部循环中,首先通过编写类似Tile[] row = tiles[i];的代码来获取行,然后在内部循环中,通过调用row[j].type来获取类型。这将在迭代平铺数组时将内存访问次数减半。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23811802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档