2017-01-04 2 views
-1

Проблемы я столкнулся как follows.Please отметить, я не профессионал в Дельфах паскальсвободной памяти, используемая Exception Tbitmaplistanimation.animationbitmap поднятого EInvalid Указатель

Чтобы сохранить большой объем памяти и время я создал процедура:

procedure TForm1.Placeholder(tspath: STRING); 
begin  //rgbholder :TImage globally declared (Dinamicly create image) 
    rgbholder.Free;//Free previous image 
    rgbholder := timage.Create(self); 
    rgbholder.Width := 10; 
    rgbholder.Height := 10; 
    rgbholder.Visible := false; 
    rgbholder.Bitmap.LoadFromFile(TSpath); 
end; 

procedure TForm1.Image3Click(Sender: TObject); 
begin 
    placeholder('Data\Grass\Grassanim1low.png'); 
    bitmaplistanimation5.Stop; 
    bitmaplistanimation5.Loop := true; 
    //bitmaplistanimation5.AnimationBitmap.LoadFromFile('Data\Grass\Grassanim1low.png'); 
    bitmaplistanimation5.AnimationBitmap.Assign(rgbholder.Bitmap); 
    bitmaplistanimation5.AnimationCount := 22; 
    bitmaplistanimation5.AnimationRowCount := 2; 
    bitmaplistanimation5.Duration := 2.5; 
    bitmaplistanimation5.PropertyName :='bitmap'; 
end; 

Теперь моя проблема высвобождая, что память о bitmaplistanimation5.AnimationBitmap.Assign(rgbholder.Bitmap);

При выполнении этого кода

bitmaplistanimation5.Stop; 
bitmaplistanimation5.Enabled := false; 
bitmaplistanimation5.AnimationBitmap.Free; 

Все идет хорошо, пока я не закрою исполняемый файл с помощью close; или просто закрыв его выходом в окне.

После закрытия он выдает исключение ошибки приложения EInvalidPointer в модуле Project1.exe в 00007A55. Недействительная операция указателя

Не думаю, что я пытаюсь освободить освобожденную память, я также не пытаюсь освободить память, которая была выделена где-то, кроме диспетчера памяти, если только процедура заполнителя не учитывается. Если я не пропущу что-то или не понимаю что-то, что я должен.

+0

Примечание. Процедура Заполнитель используется с несколькими анимациями, для которых требуется один и тот же файл, поэтому 3 '' анимация травы '', которая использует ту же память, что она экономит от 30 до 50 мб. Ram –

ответ

0

Как правило, вы должны только позвонить Free на объект, который вы создали. Вы не создали этот объект, его создал элемент управления TBitmapListAnimation. Соответствие этой этикетке является допустимым. Локализация:

bitmaplistanimation5.AnimationBitmap.Free; 

Вам необходимо будет удалить это.

Я подозреваю, что правильный путь, чтобы очистить память от битовой карты FMX является установка Width и Height свойства растрового изображения в 0.

Интересно, действительно ли вам нужно освободить эту память. Если ваша программа перестает использовать память, а системе хватает памяти, если вы можете поменять свою неиспользуемую память на диск. Общепринято найти программистов, которые не имеют хорошего понимания виртуальной памяти, предпринимая такие действия, которые не приносят никакой пользы. Я бы не удивился, если бы попытался выпустить эту память, вы на самом деле сделали производительность вашей программы хуже, чем лучше.

+0

Поскольку эта игра представляет собой многоплатформенную платформу, я рассмотрю управление виртуальной памятью для окон, но я не уверен, как это будет выполняться на андроиде или даже если оно будет поддерживаться до такой степени и что это будет эффективно с медленной памятью sdcard и контроллерами. Также это приложение не требует загрузки в реальном времени памяти когда игра на самом деле играет. Я нацелен на очень низкое использование памяти из-за количества объектов в игре и очень низкого уровня аппаратного обеспечения на полезной памяти 120 МБ. В игровом меню используется около 85 мегабайт памяти, которые занимают 15-20 секунды, когда игровой процесс использует около 110 МБ –

+0

Честно говоря, если производительность имеет значение, не используйте delphi на мобильных устройствах –

Смежные вопросы