如何防止屏幕闪动(100分)

  • 主题发起人 主题发起人 FreeBit
  • 开始时间 开始时间
F

FreeBit

Unregistered / Unconfirmed
GUEST, unregistred user!
兄弟最近正在做一个图形的项目,功能基本都实现了。就是在图形的放大和缩小时
屏幕闪动的厉害(我用的是image控件),那位大侠知道如何防止这种情况的出现,
100分相送!先谢谢了!
 
要做到效果很好,不能用image,用OPENGL/DIRECTX才行,他们采用“双缓冲”机制,在后台
生成图形后,一次性写入显存,从而避免了闪烁。
 
image空间做双缓冲也可以的。
 
form1.doublebuffered:=true
 
系统都做的差不多了,控件不敢再换了。

白河愁:
image空间做双缓冲?怎么做呀。效果怎么样,有源码吗?
 
还有,使用Form的doublebuffered属性和Timage的doublebuffered有什么区别,是效率吗?
如果一个窗体上有上百个image会不会影响速度。
 
我觉得单纯使用delphi的doublebuffered不是一个很好的解决方案。
因为doublebuffered时, form上所有控件(不管是否需要更新的)都将重画,当然它是重画到后台内存中。
即使form上只有一个点像素发生了改变也将引起整个from的所有子控件重画到后台图片中--包括那些被其它wincontrol遮住的部分,然后再将后台图片中改变的那个点重画到前台(这个是windows根据UpdateRegion决定的),这种情况下99%的重画工作都是浪费的。
尽管所有control重画前都将通过RectVisible这个api检测自己是否有必要重画,但由于doublebuffered时后台图片没有设定clipregion, 因此这个检测的结果总是要重画的(尽管事实上它是被整个遮住了), 这将造成极大的浪费(尤其是form上充满各种需要复杂处理的图片时)。
所以一个变通的办法就是截获form的WM_PAINT消息, 在BeginPaint前获取UpdateRegion,然后用doublebuffered的实现方法--建立后台图片,将获取的UpdateRegion作为这个图片的ClipRegion然后调用WM_ERASEBKGND和原来的PaintHandler方法。这样可以大幅减少不必要的重画过程(根本不必担心未重画的部分造成后台图片不正确, 因为这部分永远不会出现在屏幕上)。
 
to:FreeBit
你把图象那部分代码贴出来看一下才知道是否会有ayes的问题。
 
我试过了,用这个编码就可以了:
mainform.doublebuffered:=true
就不会闪了,不信你试试看的
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部