Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


RapsodRF

Вопрос

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

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

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

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

Платформа Android 

Ссылка на комментарий

Рекомендуемые сообщения

  • 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
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

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

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

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

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

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

Ссылка на комментарий
  • 0
В 18.06.2016 в 19:50, RapsodRF сказал:

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

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

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

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

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

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

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...