关于性能和绘制位图

时间:2019-06-16 17:52:20

标签: java android performance 2d drawbitmap

一开始我不得不说我自己学习Java,并且可能犯过最愚蠢的错误...

在2D游戏中绘制位图时,我面临FPS下降的问题。

我的游戏地图由100x100像素的图块组成,每个图块都有一些表面图形,并且可能还有其他内容(例如树,岩石或其他东西)。

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

这是代码。我限制了用这种方法绘制的内容。

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更优雅:)

1 个答案:

答案 0 :(得分:0)

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

不只是:

canvas = this.surfaceHolder.lockCanvas();

我放了:

canvas = this.surfaceHolder.lockHardwareCanvas();

现在我又有60FPS +:)