• 0
RapsodRF

Утечка памяти при использовании эффекта

Вопросы

Привет друзья!

Помогите разобраться со сложившийся проблемой.

К компоненту TImage применил эффект BlurEffect. После чего происходит циклическая смена изображений в TImage. И было замечено колоссальная утечка памяти.

Без эффекта, утечки не наблюдается. Возможно при каждой смене изображения нужно вручную очищать кэш? 

Платформа Android 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 ответов на этот вопрос

  • 0

Ну наверное самое простое отказаться от эффекта, т.к. эта тема ещё далека от идеала.

ну если хотите получить альтернативные ответы, опишите проблему детально и прикрепите проект

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Здравствуйте ZuBy!

Спасибо за то что решились помочь мне!

Дело в том, что я не могу отказаться от использование эффекта :( 

Я решил описать проблему более детально:

Допустим есть форма, на неё бросаем Image. К Image применяем эффект BlurEffect.

В процессе работы программы в Image загружаются разные картинки. 

Проблема состоит в том, что на устройстве под управлением ОС Android, программа потребляет всё больше и больше оперативной памяти. После чего программа вылетает.

Вот я собрал тестовый проект, чтобы вы могли сами протестировать и воспроизвести данную проблему утечки памяти

#include <fmx.h>
#pragma hdrstop

#include "Unit1.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;

// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}

// ---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
	if (switchOn) {

		switchOn = false;
		Image3->Bitmap = Image1->Bitmap;
		Image4->Bitmap = Image1->Bitmap;
	}
	else {
		switchOn = true;
		Image3->Bitmap = Image2->Bitmap;
		Image4->Bitmap = Image2->Bitmap;
	}
}

// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {

	if (Timer1->Enabled) {

		Timer1->Enabled = false;
	}
	else {
		Timer1->Enabled = true;
	}
}
// ---------------------------------------------------------------------------

 

Буду благодарен за любую помощь! :) 

APK_File_Effect.zip

Effect.zip

src1.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

у меня не установлен билдер, но попробуйте сделать так

  BlurEffect1->Enabled = false;
  if OnSwitch then
  begin
    switchOn = false;
    Image3->Bitmap->Assign(Image1->Bitmap);
    Image4->Bitmap->Assign(Image1->Bitmap);
  end
  else
  begin
    switchOn = true;
    Image3->Bitmap->Assign(Image2->Bitmap);
    Image4->Bitmap->Assign(Image2->Bitmap);
  end;
  BlurEffect1->Enabled = true;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 часа назад, ZuBy сказал:

у меня не установлен билдер, но попробуйте сделать так


  BlurEffect1->Enabled = false;
  if OnSwitch then
  begin
    switchOn = false;
    Image3->Bitmap->Assign(Image1->Bitmap);
    Image4->Bitmap->Assign(Image1->Bitmap);
  end
  else
  begin
    switchOn = true;
    Image3->Bitmap->Assign(Image2->Bitmap);
    Image4->Bitmap->Assign(Image2->Bitmap);
  end;
  BlurEffect1->Enabled = true;

 

К сожалению это не помогло.

Я ещё пробовал динамически создавать эффект и удалять его после использования. тоже не помогло. 

Возможно вы знаете как можно программно очистить память (кэш)???

Или может быть есть ещё какие-то варианты?

Очень нужна ваша помощь!

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Через какое время у вас заканчивается память? И какой девайс имеется под рукой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 часа назад, ZuBy сказал:

Через какое время у вас заканчивается память? И какой девайс имеется под рукой?

Приблизительно через 1/2 минуты

Тестил на двух девайсах: 

1. Alcatel IdolX  RAM 2 GB (Android 4.22)

2. Lenovo 3000 RAM 1 GB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Какое значение стоит для размытия?

У меня на стандартных настройках эффекта все нормально, ждал минуты 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Значение размытия: 5

Я устанавливал 0,3 и тоже через некоторое время программа съедала более 700 МБ оперативной памяти. :( 

Изменено пользователем RapsodRF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Под андроидом пробовать лень, под виндой всё корректно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В том-то и дело, что под виндой всё корректно, а под андроидом всё валится.

Может у кого-то есть какие-то идеи, как избавиться от утечки памяти при использовании эффекта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Найдено решение. Может кому-то пригодится.

Вот тут представлены четыре разных алгоритма размытия http://blog.ivank.net/fastest-gaussian-blur.html

Работает быстро и утечки теперь не наблюдается, то что и надо было сделать))

Так что всем спасибо! 

Пользуйтесь! ;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 18.06.2016 в 19:50, RapsodRF сказал:

Найдено решение. Может кому-то пригодится.

Вот тут представлены четыре разных алгоритма размытия http://blog.ivank.net/fastest-gaussian-blur.html

Работает быстро и утечки теперь не наблюдается, то что и надо было сделать))

Так что всем спасибо! 

Пользуйтесь! ;-)

RapsodRF, поделитесь готовым примером

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От TrueCrypt
      Привет, при вызове метода ASeries.AddXY (пример: ASeries.AddXY(ASeries.MaxXValue + 1, AValue);) происходит утечка памяти, при том довольно сильная. Есть ли какая-то возможность устранить такой недочет. Исходник чарта закрытый, найти перврпричину не удается.
       
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу