Повышение производительности Canvas.drawBitmap (), когда НОВОЕ растровое изображение ДОЛЖНО быть масштабировано и повернуто каждый раз - PullRequest
0 голосов
/ 02 апреля 2020

Примечание: это не обман Улучшение производительности Canvas.drawBitmap () для android!

Решение этого вопроса было:

Вы должны быть уверены, что вы не заставляете Android использовать масштабирование изображений при рисовании.

Однако в моем случае использования (обработка потока в реальном времени изображения) Я постоянно получаю новые кадры, которые должны быть повернуты и масштабированы после обработки перед выводом на экран. В настоящее время для рисования требуется 30 миллисекунд, что нежелательно, так как я бы хотел, чтобы он отображал 60FPS. Если я не могу этого добиться, это не конец света, так как моя фактическая обработка происходит в другом потоке, который может достигать 60FPS (который сбрасывает обработанные кадры в ограниченную, высвобождающую очередь кадрового буфера для потока представления), но это будет было бы неплохо иметь возможность просмотра в реальном времени, чтобы не отставать от потока обработки.

Есть идеи? Вот мой код для рисования:

long beforeDraw = System.currentTimeMillis();

canvas.rotate(90, canvas.getWidth()/2, canvas.getHeight()/2);

int origin_x = (canvas.getWidth()-canvas.getHeight())/2;
int origin_y = (canvas.getHeight()-canvas.getWidth())/2;

double canvasAspect = (float)canvas.getHeight()/(float)canvas.getWidth();

if(aspectRatio > canvasAspect)
{
    canvas.drawBitmap(
            bitmapFromMat,
            null,
            createRect(origin_x, origin_y, canvas.getHeight(), (int) Math.round(canvas.getHeight() / aspectRatio)),
            null
    );
}
else
{
    canvas.drawBitmap(
            bitmapFromMat,
            null,
            createRect(origin_x, origin_y, (int) Math.round(canvas.getWidth() * aspectRatio), canvas.getWidth()),
            null
    );
}

long afterDraw = System.currentTimeMillis();
System.out.println("Draw: " + (afterDraw-beforeDraw));

----------------------------------------------------------------

Rect createRect(int tlx, int tly, int w, int h)
{
    return new Rect(tlx, tly, tlx+w, tly+h);
}

Я чувствую, что ответ - мне, вероятно, нужно изучить OpenGL .... но я бы предпочел не делать этого:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...