为什么我在程序中用了几幅大一点图片的时候(是OnShow时Load入的),程序变得特别慢!有没有解决方法?(50分)

  • 主题发起人 主题发起人 jklmsoho
  • 开始时间 开始时间
J

jklmsoho

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么我在程序中用了几幅大一点图片的时候(是OnShow时Load入的),
程序变得特别慢!有没有解决方法?
特别是用RXGif Load了一幅600X400的GIF图片(动画共两幅).
还有,在用一些给Form做背景图的控件也是这样的情况。
 
启动的时候变慢的吧。 建议你不要在onshow的时候load。 show出来之后再load吧。
 
仁兄同志:
没差什么的,一样是慢,我的机器:赛扬300A 192M
更不用说MMX166 32M了,
我做的都是配合老机用的程序。(变废为宝那种)
我又不懂搞DOS下的那些漂亮的程序,我很佩服那些人!
黑不隆冬的DOS居然把界面搞得多姿多彩!!!!!!!
哪位同志会的,点几招来叹下。我只会Pascal!
(不要笑嘛!!!!就是笑也不用笑得那么大声嘛!!!!
不好!我得走啦!!!!!我怕斑竹说我不够资格来DFW,要赶我走!
还不如自动溜了算,这样才有点面子。。。。。。。。。)
不敢高攀和你们做同志的同志上
同志=志同道合 is it?
 
我想问的是。怎么个慢法。是启动慢呢,还是运行慢。
 
RXGIF?呵呵,这个东西可不应该用,我用D6+RX275做的东西用了几个这东西,一会就死机,最后才找到原因,极
耗资源啊!!,动态调也不行。最好不用他,我最后把它去了,因为没时间找别的GIF控件了,你可以试试其它的

至于背景,我不喜欢用IMAGE什么的,都是自己画,在FORM.oncreate,create一个bmp或JPG,
然后LOADFROMFILE或LOADFROMSTREAM(如果用数据库存图的话就得用这个),在destroy时,free掉。
onpaint时,用canvas.stretchdraw或fillrect,或直接draw到form上,要什么效果都行。
 
TO Xwings:
什么都慢!!!!

To MenXin:
我有试过用TImageList和Timer配合画过,结果还是一样!
那我以后都不敢用这RxGif了,我以前就是这样,怎么自己不动脑筋想一想呢?
我够笨的了!!!

To All:
谁有最好的办法解决?
无论程序或启动都可以有根本的改变的的的的(太多的了!打手!)
 
我写过一个多媒体演示程序。像authorware一样的。 就是采用动态调入图片。速度不是很慢嘛。
动画图片是先调入一张显示出来。 然后再陆续调入其他部分。效果不错的。建议自己写一个吧。
imagelist最好不要用。 自己写一个imgbuffer来处理图片的调入。
 
To: xwings(飞得很快吗?):
怎么写什么的imgBuffer? 我最怕什么的 Buffer Stream....的,
是什么流呀 存的东西吗?教教我吧!或有什么相关的中文资料吗?
要不我一点都不懂了!我看见一些程序老是Loadfromstream什么的,
究竟是什么用的?如何用?按照我的全部知识应该是通过流呀 存呀
进行图像什么操作的,是吧?
我可是个好学之人,同在一片蓝天下,帮帮忙吧,啥时候见面请你
抽根烟或什么的都行。
 
我写的buffer很简单的。提供一个list存储文件列表,程序运行之后,每次要用图片就执行一个方法,它就读取
文件到动态分配的img数组里去。(这是图片不多不大的时候用的),还有一个方法就是在程序空闲的时候读几个图到一个数组里.
知道全读进去为止.这样是针对大图片或者很多图片做的.
 
To XWings:
能不能写源代码给我?谢谢!
在谢谢!谢谢!多多谢(写)!
jklmsoho=jklmiuin=一时冲动yeschoto 上
不怪我吧!!
 
要等到周一。现在我很忙没有时间。不好意思。
 
没关系,我能等!或E-Mail: yeschoto@yahoo.com.cn
 
你不该把图片的装入过程放在Form的OnShow事件,
这个事件会经常发生的,每次Form上的内容需要重画时都会触发OnShow事件。
OnActive事件则是你的Form从非活动状态(无输入焦点)到活动状态时发生,
程序运行中也可能多次触发,所以也不合适。
你应该在Form.OnCreate事件中装入图像,因为OnCreate事件只在该窗口创建时发生一次。

另外如果RxGIF很不爽的话可以试试TGifImage
(http://www.torry.net/vcl/graphics/gif/gifimage.exe),这是个免费的GIF控件,
效果很好。
 
To SkyWeb:
Thanks,i will try it.
But i use the large gif image in my program.
how to use 'stream' or 'buffer'?
 
to jklmsoho:
我想你的问题关键并不在于你的图像大小,而是因为你在程序中多次反复地装入图像
引起的。一幅600x400的256色图像在内存中不过240000字节,显示上应该很快,再说你
的赛扬300A并不是很慢的CPU,我在MMX166 64M内存的机器上用Delphi 4写的图像处理
程序显示一个800x600的真彩图像也不显慢。
 
To SkyWeb:
我原来也是用MMX166 48M,那么当我要Load new image,
应该怎样处理才好?是 Free Memory 或 Destroy old image?
又或是Redraw image's canvans?
 
其实图像文件最后在屏幕上画出所需的时间是很短的,慢主要是慢在图像文件的
读取和解码上,解决这个问题可以有很多种方法,如果你的图片只有有限的几幅,
你可以一次把它们全部读入内存,然后在需要的时候把其中一幅画出来。如果你
做的是个图片浏览器,你可以参考一下AcdSee的做法:显示这幅图像的时候,同
时用一个线程读入下一幅图像,用户闲着的时候你的程序不闲着。

下面是个切换图片显示的例子,假设GIF1,和GIF2都已装入内存,显示图片用Image1:
程序显示Gif1后马上显示Gif2
begin
Gif1.LoadFromFile('c:/MyGif1.gif');
Gif2.LoadFromFile('c:/MyGif2.gif');
// 以下两句同时显示的效果在屏幕上应该是Gif1一闪而过,尔后是Gif2
// 说明图像的显示是很快的
Image1.Picture.Graphic:=Gif1;
Image1.Picture.Graphic:=Gif2;
end;

如果你觉得还不够快,可能你需要直接用GDI函数编程了,先把GIF图像转换成
BMP位图,然后用BitBlt函数显示BMP。
 
换个快机器
 
To skyweb:
真不好意思!我还算是个入门者,没有什么基础,
我还没有用过BitBlt函数,怎么用?Delphi help有吗?怎样把内存装入内存?
不嫌我烦吧?没办法,我认识的人很少人会编程,不知香水请教。
万分感谢!
 
后退
顶部