2014-02-16 3 views
0

Чтобы поддерживать различные размеры разрешений экрана, я программно масштабирую растровые изображения в приложении для игры в Android, используя SurfaceView. Я выполнил его, используя метод drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint). Я видел метод Bitmap с именем createScaledBitmap, который может создавать новый растровый рисунок, масштабированный из существующего растрового изображения. Есть ли разница в производительности между ними?Разница в производительности между drawBitmap и createScaledBitmap

+1

Поскольку вы используете «SurfaceView», считаете ли вы установку фиксированного размера и позволяете аппаратное обеспечение масштабировать? См. Http://android-developers.blogspot.com/2013/09/using-hardware-scaler-for-performance.html – fadden

+0

Я добавил пример Grafika - см. «Аппаратный сканер-сканер» в https: // github.com/google/grafika. – fadden

ответ

2

Да, есть. Они делают разные вещи. createScaledBitmap принимает растровое изображение и создает новую масштабированную копию в памяти. Он не помещает его на холст, это новый объект растрового изображения, который впоследствии можно нарисовать на холсте. drawBitmap рисует растровое изображение на холсте (которое может быть подкреплено растровым изображением, поверхностью или экраном), масштабирует его, применяет эффекты от объекта краски, уважает области отсечения и т. д.

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

2

Создание масштабированного растрового изображения не отображает растровое изображение. Он предоставляет средства для включения опций перед рисованием. Например, вы можете использовать различные методы интерполяции в зависимости от размера, поворота и т.д. исходного изображения по сравнению с которой он будет нарисован:

What does the filter parameter to createScaledBitmap do?

Так что, если вы не удовлетворены результатами drawBitmap, вы можете попытаться улучшить битмап с параметрами масштабирования. drawBitmap использует «автоматическое» масштабирование, но не указывает, что используется.

В особенности, связанный с производительностью, createScaledBitmap использует собственный метод «nativeCreate», а drawBitmap использует «native_drawBitmap» - поэтому он будет меняться в зависимости от реализации собственных методов платформы. Несмотря на это, вам нужно будет нарисовать растровое изображение на холсте после его масштабирования, поэтому «drawBitmap» потребуется в любом случае, и даже если битмап уже масштабирован, очень маловероятно повысить производительность. Однако, если вы не рисуете его, тогда нет смысла использовать «drawBitmap», потому что он автомасштабирует и использует ресурсы для выполнения розыгрыша.