关于性能和绘制位图



一开始我不得不说我正在自己学习Java,可能会犯一个有史以来最愚蠢的错误......

我在 2d 游戏中绘制位图时遇到了 FPS 下降的问题。

我的游戏地图由 100x100 像素的图块组成,每个图块都有一些表面图形,也可能有其他东西(如树、岩石或其他任何东西)。

我有两种主要的绘图方法。两者看起来很相似。首先是绘制地图,其次是地图上的所有内容(树木等)。

这是一个代码。我正在限制在此方法中要绘制的内容。

public static void drawMap(Canvas canvas, Player player, ArrayList<MapField> map)
{
int a = player.getShiftX()/Constants.TILE_SIZE;
int b = player.getShiftY()/Constants.TILE_SIZE;
for (int x = a-Constants.VISIBILITY_X; x<=a+Constants.VISIBILITY_X; x++)
{
if (x>=0&&x<=99)
{
for (int y = b-Constants.VISIBILITY_Y; y<=b+Constants.VISIBILITY_Y*2-1; y++)
{
if (y>=0&&y<=99)
{
map.get(x+y*100).update();
map.get(x+y*100).draw(canvas);
}
}
}
}
}

然后我打电话给:

public void draw(Canvas canvas)
{
canvas.drawBitmap(Graphics.TILES_BITMAP[tileId], null, rect, p);
}

当我将"视野"限制为每个方向 3 个正方形(绘制大约 60 个瓷砖)时,FPS 为 60。一旦我摆脱了这个限制(整个屏幕将被绘制 - 大约 250 个瓷砖),FPS 就会下降到 27-30,这使得游戏无法播放。

这是正常行为?Java有那么有限吗?

或者只是我在这里犯了一个错误?

完整的代码可以在这里看到(如果有人愿意检查):

吉特林克

有人告诉我,有了这么多的图形,我应该已经使用了一些OpenGL,并建议我学习LibGDX。但对我来说,纯Java更优雅:)

好的,我已经设法解决了这个问题。不过,它仅适用于 API26+。

而不仅仅是:

canvas = this.surfaceHolder.lockCanvas();

我把:

canvas = this.surfaceHolder.lockHardwareCanvas();

现在我又有了 60FPS+ :)

最新更新