Android - рендеринг растровых изображений из собственного кода - nativeCreate растровые изображения не очищаются из памяти - PullRequest
0 голосов
/ 22 февраля 2011

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

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

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

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

C код:

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);

1 Ответ

1 голос
/ 23 февраля 2011

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

...