我是Java图形库的新手,我还在努力适应它的局限性。下面我有一个用于Grid类的绘制函数,它将一个二维的瓦片数组绘制为填充的矩形。
不是说它与问题相关,而是scale和offset参数用于调整网格的tiles和tileSize变量,以便在屏幕上以正确的位置和比例绘制网格。
我的问题是,当tiles变量非常大时,这会出现相当大的延迟吗?我通常在屏幕上没有任何栅格的情况下获得大约500fps的分辨率,并且当栅格的tiles10为50时,没有明显的减少。但在tiles1000中,要绘制的矩形总数为1,000,000,fps将降至7。
我知道一百万很多,但它们毕竟只是长方形,而且我的电脑可以在全设置下玩像Skyrim这样的游戏没有问题。我想象在Skyrim中有超过一百万个多边形展示,它们都有各种高分辨率的纹理和照明,所以,为什么一百万个灰色方块会有这样的问题?Java的图形库真的很差吗?我是不是期望太高了?或者,就像我怀疑的那样,有没有更好的方法来画这样的东西?
如果这很重要,我可以提供主类的paintComponent,但它只是一个对_Grid.draw()的调用,所以我不认为有问题。
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;
}发布于 2014-05-22 23:59:58
Java的BufferedImage类很慢。这是一个众所周知的事实。如果你想做快速的图像处理,那么它是错误的工具。
此外,像Skyrim这样的游戏正在使用图形卡来完成大部分工作,使用Java Image,所有这些都是在CPU中完成的。
你真的应该考虑使用游戏框架--有像Slick2d这样的2d框架,也有像jMonkeyEngine3这样的3d框架。
发布于 2014-05-23 00:11:41
以下是你可以考虑尝试的几件事:
Graphics对象是由BufferedImage创建的,请考虑改用VolatileImage。正如其他人所说的,这个绘制方法中的所有事情都是通过Swing事件分派线程在CPU上发生的,所以您只能使用单个CPU进行绘制(除非您在某个地方产生更多的线程)。type字段重构为自定义enum,然后让enum定义自己的draw方法,该方法接受Graphics对象并绘制自身。这样,您就可以调用this.tyles[i][j].type.draw(g2)并依靠后期绑定来绘制正确颜色的矩形,从而消除String comparisons.tiles数组一无所知,但是如果它比实际渲染到屏幕上的值大得多,你可能会浪费很多CPU周期。Tile[][] tiles ...。在外部循环中,首先通过编写类似Tile[] row = tiles[i];的代码来获取行,然后在内部循环中,通过调用row[j].type来获取类型。这将在迭代平铺数组时将内存访问次数减半。https://stackoverflow.com/questions/23811802
复制相似问题