О производительности и рисовании растровых изображений - PullRequest
0 голосов
/ 16 июня 2019

Вначале я должен сказать, что я изучаю Java самостоятельно и могу совершить самую глупую ошибку за всю историю ...

У меня проблема с падением FPS при рисовании растровых изображений в моей 2d игре.

Карта моей игры состоит из плиток размером 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 голосов
/ 17 июня 2019

Хорошо, мне удалось решить эту проблему.Это было бы только для API26 +.

Вместо просто:

canvas = this.surfaceHolder.lockCanvas();

Я поставил:

canvas = this.surfaceHolder.lockHardwareCanvas();

И теперь снова у меня есть 60FPS +:)

...