使用TBitMap类的一个问题。(5分)

C

casso

Unregistered / Unconfirmed
GUEST, unregistred user!
在使用一个TBitMap类时,如下
var
bitmap: TBitMap;
begin
bitmap:=TBitMap.Create;
...
for i:=0 to 100 do
begin
GetBitMap(bitmap,..); //用某个函数给bitmap分配一个位图
...
end;
bitmap.free;
end;
在循环中要显示这个图象,结果
一开始是正常的,等出现到一定的
图象后,就会有重叠。
请问在循环中应该加入什么语句,
可是在用完后就释放了位图,而不
影响下次使用这个对象。
(抱歉,只有5分了)
 
这个问题大致是因为加载一定的图像后,会出现内存占用过多,windows会去使用
硬盘交换.所以性能急剧下降. 从本质上来说,这种情况没有很好的解决办法,
只有自己控制,避免出现这种情况.
比如说,使用JPG代替BMP.

但是,我在内存未满时也出现过这种情况.使用两个BMP来回调,就会出现.
我没有分析过source,但估计是 VCL没有写好.

后来用双缓冲,先把要调用的BMP读进内存,再用独立的Timage画出来,情况会缓解.

 
但是,如果在循环体中如下写
for ...
begin
bitmap:=TBitMap.Create;
GetBitMap(bitmap,...)
... //do other things about bitmap;
bitmap.Free;
end;
这样就可以解决问题,
可是这样做速度会变慢吗?
 
天啊!这个世界上还有价值5分的问题。^-^
不介意。要成为大富翁,1分也不能丢。~_*
casso,你的问题并不好解释。我没有遇到过这个现象。我建议公开
GetBitmap的源程序,我还可以读一读。
曹兄的“内存占用”情况可能性较小,你可以在出现问题时查看一下
系统资源,如果在50%以上,便不大可能出问题。
采用jpg并不能解决问题,因为在win95内部只有bitmap,jpg和Bitmap
是一样消耗内存的(不过节省了硬盘空间和调入时间)。
casso的第二种方法应该可以解决问题,但肯定有速度损失。
 
5分钱的建议:
下载一个播放FLC的源程序看看人家是怎样作的吧
 
据说,Delphi3的Graphics.pas里有Bug,没有释放锁定的资源,可以自己修改一下.
Delph4已经把这个问题解决了,不知是不是这个原因。
 
与资源是否释放无关, 问题在于设备刷新的速度跟不上程序刷新的速度
 
抱歉,我真的只有5分了,都用完了。
不过还是感谢各位的大力协助。

GetBitMap( )在我的程序中
就是从ImageList中取其中一个Bitmap的标准方法。
之后我让它直接显示在屏幕上。(在循环体中)
(我是用Delphi 4编程的)
如果说设备刷新的速度跟不上,可是我的机子可是P200MMX 64M SDRAM的啊。
有4M显存的。

我Imagelist中的每个位图大概有20K大小。一共要显示60幅左右。
如果每次在循环体中create,free可以解决问题。但是速度?
难道Delphi的Object在第二次赋值有问题?
 
应该采用Double Buffer技术,手头没有现成资料,建议下载一个动画播放源程序看一看
 
试试看:
var
bitmap: TBitMap;
begin
bitmap:=TBitMap.Create; ...
for i:=0 to 100 do
begin
bitmap.Assign(GetBitMap(..));
end;
bitmap.free;
end;

GetBitMap返回类型为TBitmap;
 
你昏了!如果要实现这样的功能,你不如用一个动画Gif软件将这些
图做成一个.GIF文件,然后使用RxLib中的一个动画Gif组件来控制它。
RxLib中的这个组件可以在每帧(每个bitmap)后停下,然后进行你的操
作,也可以控制帧的切换速度。
其实,在标准的Delphi中也有一个类似的组件。好象叫TAnimate什么的。
性能如何,我没有用过。建议使用RxLib的TRxGIFAnimator组件。
 
顶部