#java #android #bitmap
#java #Android #растровое изображение
Вопрос:
Я хотел бы знать, есть ли какие-либо оптимизации, которые можно было бы использовать для повышения скорости при использовании большого количества растровых изображений, отображаемых на экране.
Я использую canvas, в который я загружаю все свои ресурсы при инициализации, и использую CreateBitmap, когда мне нужно обновить растровое изображение. Я использую файлы ~ 10-15 КБ с моим Galaxy Note 3 и замечаю задержку (xxhdpi), когда я достигаю около 20 растровых изображений, которые становятся практически непригодными для использования около 35 .
Я постоянно использую createbitmap, потому что растровые изображения используют анимацию кадров и матрицу для поворота.
Пока единственное, что я пробовал, и я заметил разницу, — это inBitmap, который дает примерно 5-10% увеличение освобожденного GC_FOR_ALLOC.
Кто-нибудь хочет дать хороший ответ на вопрос, что лучше? Я слышал, что flash AIR — хороший выбор для использования cacheAsBitmapMatrix, но я хотел бы другой вариант (просто личный префикс).
Редактировать:
(границы rectf = границы растрового изображения)
matrix.setRotate(rotation, rectf.centerX(), rectf.centerY());
ship1 = Bitmap.createBitmap(ship1, 0, 0, ship1.getWidth(), ship1.getHeight(), matrix, true);
Я думаю, что понимаю свою проблему, я должен звонить
canvas.drawBitmap(ship1, matrix, paint);
Но в моем методе onDraw я использую
canvas.drawBitmap(ship1, srcRectf, dstRectf, paint); //srcRectf = null
Я использую dstRectf для перемещения моего растрового изображения, но я полагаю, что это можно заменить на setTranslate. Я попробую это, спасибо, Мехмет!
Ответ №1:
Bitmap хранит пиксельные данные в собственной куче *, а не в куче Java, и заботится об управлении ими самостоятельно. Это означало бы, что GC не должен доставлять вам серьезных головных болей.
Проблема, вероятно, в постоянном использовании createBitmap()
, что обычно является действительно дорогостоящей операцией. В худшем случае это вызовет дисковый ввод-вывод или в лучшем случае относительно большое выделение памяти. Вы хотели бы использовать его как можно меньше, т. Е. только при первоначальном чтении их с диска.
Вместо этого я советую вам использовать Matrix
в сочетании с Canvas
. Просто измените свой Matrix
и с каждым шагом перекрашивайте свои Bitmap
с ним.
Редактировать:
* Корректно только для Android 2.3.3 <-> Android 3.0
Комментарии:
1. Не могли бы вы объяснить что-нибудь еще? Я поворачиваю матрицу, а затем создаю BITMAP с матрицей. Что такое перерисовка? Я отредактировал внизу, чтобы показать некоторый код, который я использую
2. Я думаю, я понимаю, я использую пользовательский вид рисования, поэтому я могу использовать canvas.drawBitmap (bitmap, matrix, paint); Но как я могу вызвать это, когда я также вызываю canvas.drawBitmap (bitmap, srcRectf, dstRectf, paint);?
3. Точно, я считаю, что matrix также может масштабироваться и обрезаться. Взгляните на это, потому что я не очень знаком с матрицей Android.
4. Добро пожаловать, я не получил ваш вопрос. Что вы подразумеваете под экземплярами или новым ресурсом? Если новый ресурс означает, что вы каким-то образом не загрузили его в память, да, вам следует вызвать
createBitmap
.5. Извините, что удалил это, я должен подумать, прежде чем нажимать enter:P — В моем коде я инициирую каждое растровое изображение с помощью CreateBitmap один раз и помещаю их в массив, чтобы я мог их повторно использовать. Ваше руководство прямо здесь и сейчас привело меня в режим «мне нужно спросить столько, сколько я могу сейчас». Ха-ха!