0

一开始我不得不说我正在自学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有那么有限吗?

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

完整代码可在此处查看(如果有人愿意检查):

gitlink

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

4

1 回答 1

0

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

而不仅仅是:

canvas = this.surfaceHolder.lockCanvas();

我放了:

canvas = this.surfaceHolder.lockHardwareCanvas();

现在我又有了 60FPS+ :)

于 2019-06-17T15:17:30.440 回答