H hhb1981 Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-11 #4 用Delphi不太容易,最简单消息的响应时间也有5ms左右,最保守估计:5*60*2=600ms,再加上系统额外的开销……估计这个想法的可行性不大,除非嘛……自己搞个实时操作系统(呵呵,玩笑1个)。
李 李翔鹏 Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-11 #6 楼上算错了吧,60赫兹是0.16667秒/次 把INTERVALE设为166就行了吧 timer事件中写上 Image1.Vasivable := not Image1.Vasivable;
L ljdzxx Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-11 #7 李翔鹏,我试过了,不行的,我要达到和显示器一样的效果,就是快到肉眼基本分辨不出来图片不断的在刷
H hhb1981 Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-11 #8 to 李翔鹏: 呵呵,小学数学的问题,1/60=?,用计算器算1下吧,hoho~ 0.16667秒/次是6Hz! 再有,显示/隐藏 是两次Timer执行的结果,所以,即使是6Hz,也应该设为166/2=84才对。 to 楼主: 还有,用Timer来控制的话,效率和稳定性都不能保证,因为普通的Exe执行会受到Windows环境中很多因素的影响,不信的话,在Timer循环的时候,你把可执行程序的窗口拖住不放,或者开一个比较大的应用程序,就会看到Timer被暂停或者延时了。
to 李翔鹏: 呵呵,小学数学的问题,1/60=?,用计算器算1下吧,hoho~ 0.16667秒/次是6Hz! 再有,显示/隐藏 是两次Timer执行的结果,所以,即使是6Hz,也应该设为166/2=84才对。 to 楼主: 还有,用Timer来控制的话,效率和稳定性都不能保证,因为普通的Exe执行会受到Windows环境中很多因素的影响,不信的话,在Timer循环的时候,你把可执行程序的窗口拖住不放,或者开一个比较大的应用程序,就会看到Timer被暂停或者延时了。
H Hydra0 Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-12 #9 Timer极限好象是1秒最多18次事件,所以不能依靠它的,最好自己写,嵌入ASM应该可以办到
H hhb1981 Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-29 #10 写了一段测试程序,用来测试Timer响应的效率 var a: Integer = 0; implementation Procedure TForm1.Timer1Timer(Sender: TObject); begin Inc(a); Caption := IntToStr(a); end; procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := not Timer1.Enabled; ShowMessage(IntToStr(GetTickCount())); end; P4 2.66/1G DDR333RAM 运行的结果:从0数到1228,TickCount值从6132984到6152218,效率大约为1228 / (6152.218 - 6132.984) = 63.85 (次/秒),这个值和机器硬件/环境配置相关。从结果看到,即使对于简单的加算和显示操作,Timer的效率也并不高,若处理一个较大位图的绘制,相信结果会更糟糕。同时也说明了:对于Timer的Interval,设定为16(= 1000 / 63.85)以下,毫无意义(仅针对上述配置的机器)。同意楼上的,写汇编效率比较高,但本人认为,效率想要达到显示卡的刷新速度(即:每一桢的更新都应该比显存的更新速度要快一些),在Windows系统常规环境下,很难做到。 建议楼主试一下DirectX,能直接操作显存。
写了一段测试程序,用来测试Timer响应的效率 var a: Integer = 0; implementation Procedure TForm1.Timer1Timer(Sender: TObject); begin Inc(a); Caption := IntToStr(a); end; procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := not Timer1.Enabled; ShowMessage(IntToStr(GetTickCount())); end; P4 2.66/1G DDR333RAM 运行的结果:从0数到1228,TickCount值从6132984到6152218,效率大约为1228 / (6152.218 - 6132.984) = 63.85 (次/秒),这个值和机器硬件/环境配置相关。从结果看到,即使对于简单的加算和显示操作,Timer的效率也并不高,若处理一个较大位图的绘制,相信结果会更糟糕。同时也说明了:对于Timer的Interval,设定为16(= 1000 / 63.85)以下,毫无意义(仅针对上述配置的机器)。同意楼上的,写汇编效率比较高,但本人认为,效率想要达到显示卡的刷新速度(即:每一桢的更新都应该比显存的更新速度要快一些),在Windows系统常规环境下,很难做到。 建议楼主试一下DirectX,能直接操作显存。
P porsche Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-30 #11 晕倒,这个与Timer有什么关系? 关键是看你的图片有多大,WINDOWS能不能画得过来,如果只是个32*32的小ICON,肯定没问题
M modula-2 Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-30 #12 理论上是可以的,显示卡内存的速度比屏幕快,但一定要用直接写屏的,如directx 有好的游戏可以做到每秒100多帧.
C catbrother Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-30 #13 可以自己来做 专门开一个线程,不停循环,通过取时间函数来比较 然后,将相互切换的两个图片读到内存里,切换时直接写屏。 取时间的函数我忘记了,好像是在某本工业控制的杂志上看到的,可以达到毫秒级的采样频率。 但是,人眼的分辨率是每秒24张图片,电影就是这么来的,有必要到60赫兹吗?
可以自己来做 专门开一个线程,不停循环,通过取时间函数来比较 然后,将相互切换的两个图片读到内存里,切换时直接写屏。 取时间的函数我忘记了,好像是在某本工业控制的杂志上看到的,可以达到毫秒级的采样频率。 但是,人眼的分辨率是每秒24张图片,电影就是这么来的,有必要到60赫兹吗?
M modula-2 Unregistered / Unconfirmed GUEST, unregistred user! 2006-12-31 #14 人眼的分辨率是每秒24张图片那游戏为什么要做成60帧以上才流畅, 你的显示器刷新率也做成24hz你看看是什么效果。