Android Java — Предотвращение GC_FOR_ALLOC с большим количеством растровых изображений

#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 один раз и помещаю их в массив, чтобы я мог их повторно использовать. Ваше руководство прямо здесь и сейчас привело меня в режим «мне нужно спросить столько, сколько я могу сейчас». Ха-ха!