Я пытаюсь создать простое поступательное движение для растрового объекта. Я делаю это путем создания холста и передачи ему кадрового буфера, который ранее был инициализирован с разрешением 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);