• 0
RapsodRF

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

Вопрос

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

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

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

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

Платформа Android 

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


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

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

  • 0

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

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

AlexG, Vitaldj и Kitty понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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;

 

Kitty понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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

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

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

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


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

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

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

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

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

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

Rusland и zairkz понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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 пользователей

    Нет пользователей, просматривающих эту страницу