java - 关于性能和绘制位图

标签 java android performance 2d drawbitmap

首先我不得不说我是自学java,可能会犯一个最愚蠢的错误......

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

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

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

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

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 个方 block (绘制大约 60 个图 block )时,FPS 为 60。一旦我摆脱该限制(要绘制整个屏幕 - 大约 250 个图 block ),FPS 就会下降到 27 -30 这使得游戏无法玩。

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

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

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

gitlink

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

最佳答案

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

而不仅仅是:

canvas = this.surfaceHolder.lockCanvas();

我已经放了:

canvas = this.surfaceHolder.lockHardwareCanvas();

现在我又拥有 60FPS+ :)

关于java - 关于性能和绘制位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56621300/

相关文章:

java - 从 Java ArrayList 中删除项目时接收 IndexOutOfBoundsException

java - Spring 并行执行方法

linux - 在不修改代码的情况下测量函数执行时间

performance - 检查两个 SSE 寄存器是否均不为零而不破坏它们

java - 如何处理 Retrofit 2 中不同模式的错误?

java - 如果存储过程在 MSSQL Server 2005 上的选择之前进行更新,则没有结果集

android - API 28 中 Fragment 中的 MapFragment 崩溃

java - android中如何从图像路径获取缩略图路径?

android - Android 中不显示卢比符号

javascript - 缩小 JS/CSS 文件