关于窗口模式下的IDirectDrawSurface7.Blt()的讨厌问题,各位大哥谢谢了!(200分)

  • 主题发起人 主题发起人 Scarlette
  • 开始时间 开始时间
S

Scarlette

Unregistered / Unconfirmed
GUEST, unregistred user!
??小弟的程序从一块图像采集卡中获取DIB图像,然后复制到离屏表面,经过一点小处理
后Blt到主表面。由于是在窗口模式下,因此无法控制主表面的色深。更糟糕的问题在于,
图像采集卡获取的总是24bit的DIB,用户大多数情况下用的是16bit或者32bit显示模式。如
果把离屏表面定死为24bit,那就彻底没戏了——IDireciDrawSurface7.Blt()是不作颜色转
换的。
??所以,离屏表面只能和主表面采用相同的色深。但这样一来,24Bit DIB到离屏表面的
复制就必须完成色深转换。我尝试自己写了带有色深转换的复制过程,但是自己做转换的效
率实在太低,30 FPS时CPU占用率已经让人一头汗了,而我的程序必须还要做其他的事情。
而且,必须考虑24->16, 24->24, 24->32等各种情况,如果哪天图像采集卡变成16bit或者
32bit了,那就废了……
??后来,想了一个比较无耻的方法:每次复制的时候,都获取离屏表面的DC,然后将DIB
图像DrawDIBDraw()上去。这样色深转换是不成问题了,但是,DrawDIBDraw()同样也是完全
软件完成的,一点硬件加速也没有,效率实在不敢恭维,和自己写的差不多,甚至更糟:每
次表面GetDC()都费不少时间,而且无端多了一个HDRAWDIB设备,还需要Video For Windows
的支持,真是OOXX……
??现在只好求教于各位大哥,有没有什么方法可以尽量让硬件加速完成带有色深转换的复
制工作?
 
窗口模式有点麻烦.全屏就没那个问题了(可以把24bit的图像blt到16bit的图面上).
不懂,关注!







 
不知道你是怎么转换表层的。
DirectDraw默认是将表层图象建立在显存里,如果你对其转换,实际上变成了显存对内存的数据处理过程。不慢才怪!
如果你想通过硬件实现加快速度,较好的方法是图象建立在内存里。
通过内存向显存交换数据,效率提高起码 20% 以上!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部