Метод Canvas 'drawBitmap вызывает плохую производительность после масштабирования - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь создать простое поступательное движение для растрового объекта. Я делаю это путем создания холста и передачи ему кадрового буфера, который ранее был инициализирован с разрешением 1080/1920. Затем я приступил к рисованию растрового изображения с помощью вызова метода drawBitmap () холста следующим образом:

this.canvas = new Canvas(frameBuffer);

...

canvas.drawBitmap(bitmap, null, destinationRect, paint);

В другом потоке, который установлен как представление содержимого для основного действия, я масштабирую кадровый буфер, чтобы он соответствовал фактическому размеру экрана, а затем рисую его со всем его содержимым с помощью следующих строк:

Canvas canvas = holder.lockCanvas();
canvas.getClipBounds(dstRect);

...

canvas.drawBitmap(framebuffer, null, dstRect, paint);
holder.unlockCanvasAndPost(canvas);

Это приводит к очень низкой производительности, как при измерении вручную с использованием дельта-времени, так и при мониторинге с помощью инструментов Android Studio. Даже визуально вы можете увидеть трейлинг после растрового изображения, сопровождаемый очень низким fps.

Я не могу найти причину этого, но я подозреваю, что процесс масштабирования, который drawBitmap выполняет неявно, делает что-то тяжелое. Я попытался изменить настройки фильтра безуспешно. Я также сомневаюсь, что мне следует отправиться в openGL для этой простой необходимости.

Должен ли я использовать растровые изображения с различными размерами и выбирать во время выполнения, какой размер наиболее близок к моим потребностям, или есть более простое решение этой проблемы?

EDIT: Вот как я получаю еще несколько кадров в секунду с помощью метода matrix.postScale ():

        int width = framebuffer.getWidth();
        int height = framebuffer.getHeight();
        float scaleWidth = ((float) game.size.x) / width;
        float scaleHeight = ((float) game.size.y) / height;
        // create a matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);
        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(framebuffer, 0, 0, width, height, matrix, true);

        canvas.drawColor(Color.parseColor("#013501"));
        canvas.drawBitmap(resizedBitmap, null, dstRect, paint);
        holder.unlockCanvasAndPost(canvas);
...