Примечание: это не обман Улучшение производительности 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 .... но я бы предпочел не делать этого:)