Android - рендеринг растровых изображений из собственного кода - растровые изображения nativeCreate не очищаются из памяти

Я транслирую видео в Android и декодирую кадры в собственном коде, а затем копирую пиксели в растровое изображение, затем отображаю растровое изображение в Java с помощью canvas.unlockandpost с циклом while для всех растровых изображений.

Все хорошо, но потоковая передача растровых изображений очень медленная и вызывает сбой. Я вижу только сообщение на logcat о том, что «недостаточно памяти, больше нет фоновых процессов».

Я вижу в таблице распределения из eclipse, что созданные мной растровые изображения не удаляются из памяти, хотя я каждый раз перезаписываю пиксели. Есть ли способ очистить память, которую он хранит.

Мой код выглядит следующим образом.

Код С:

AndroidBitmapInfo  info;
void*              pixels;
int                ret;


if ((ret =AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {
}

memcpy(pixels, pictureRGB, 480*320);

AndroidBitmap_unlockPixels(env, bitmap);

Java-код

     Bitmap mBitmap = Bitmap.createBitmap(480, 320, Bitmap.Config.RGB_565);
     renderbitmap(mBitmap, 0);
     canvas.drawBitmap(mBitmap, 0, 0, null);

person Anil Arrabole    schedule 22.02.2011    source источник


Ответы (1)


В коде, показанном в вашем вопросе, отсутствуют некоторые важные части, чтобы полностью понять вашу проблему, но похоже, что вы создаете новое растровое изображение для каждого кадра. Поскольку Android позволяет выделять только около 16 МБ для каждой виртуальной машины Java, ваше приложение будет уничтожено примерно через 52 кадра. Вы можете создать растровое изображение один раз и повторно использовать его много раз. Точнее, вы создаете растровое изображение (Bitmap.CreateBitmap), а не уничтожаете его (Bitmap.recycle). Это решит вашу утечку памяти, но все же не лучший способ справиться с ней. Поскольку размер растрового изображения не меняется, создайте его один раз при запуске вашей активности и повторно используйте его на протяжении всей жизни вашей активности.

person BitBank    schedule 23.02.2011