【问题标题】:free memory used by a Tbitmaplistanimation.animationbitmap Exception raised EInvalid PointerTbitmaplistanimation.animationbitmap 使用的空闲内存引发异常 EInvalid Pointer
【发布时间】:2017-01-04 13:57:52
【问题描述】:

我面临的问题如下。请注意我不是delphi pascal的专业人士

为了节省大量内存和时间,我创建了一个过程:

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; 关闭可执行文件,或者简单地用窗口中的出口关闭它。

关闭后它会在模块 Project1.exe 中的 00007A55 处引发应用程序错误异常 EInvalidPointer。无效的指针操作

我不认为我正在尝试释放已经释放的内存,我也没有尝试释放分配给内存管理器以外的其他地方的内存,除非占位符过程很重要。除非我遗漏了什么或不理解我应该理解的东西。

【问题讨论】:

  • 注意程序占位符与需要相同文件的多个动画一起使用,因此 3 个“草动画”使用相同的内存,节省大约 30 到 50 mb ram

标签: delphi firemonkey delphi-xe7


【解决方案1】:

作为一般规则,您应该只对您创建的对象调用Free。您没有创建此对象,TBitmapListAnimation 控件创建了它。所以这段代码对你来说是一个明显的错误:

bitmaplistanimation5.AnimationBitmap.Free;

你必须删除它。

我怀疑从 FMX 位图中清除内存的正确方法是将位图的 WidthHeight 属性设置为 0

我想知道你是否真的需要释放这段记忆。如果您的程序停止使用内存,并且系统内存不足,可以将您未使用的内存交换到磁盘。通常会发现对虚拟内存没有很好理解的程序员,采取这样的行动没有任何好处。如果通过尝试释放此内存实际上使程序的性能变得更差而不是更好,我一点也不感到惊讶。

【讨论】:

  • 因为这个游戏是多平台的,所以我会考虑 windows 的虚拟内存管理,但我不确定这将如何在 android 上执行,或者即使它支持到这种程度并且它会有效缓慢的 sdcard 内存和控制器。此外,此应用程序在实际玩游戏时不需要实时内存加载。由于游戏中的对象数量和 120 MB 可用内存的硬件非常低,我的目标是非常低的内存使用量. 游戏菜单使用大约 85 兆字节的内存捕捉需要 15-20 秒,而游戏使用大约 110 MB
猜你喜欢
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2021-02-27
  • 2013-05-02
相关资源
最近更新 更多