关于GetDIBits的奇怪问题,真的很奇怪(发到图形图像区,没人理我,只能回这里呢)

stidio_zhougang 2006-05-17 11:01:44
先说一下我的机器硬件情况:显卡是R9550,CPU P4 2.4G,内存1G
对于一个1280 × 1024的数据快
禁用显卡加速,GetDIBits每秒能执行大约64次,CPU这时平均占用88~95%,也就是说还有上升余地
而启用显卡加速,其只能执行平均20次/秒,CPU占用100%

不知道什么原因,结合以前经验,大概就知道显存到内存速度会比较慢,但也不会慢到这个地步吧
遇到这个问题的朋友,能不能告诉我什么原因,郁闷死呢

今天又经过几台机器的测试,发现N卡这种情况要好些,在禁用硬件加速情况下和A卡差不多,但不禁用,N卡能跑到30~40帧的样子(6600 LE)

我现在主要做一个录制软件,听人说DirectShow可能效率会高些,但不知道怎么弄,那位兄弟能发份代码给我:stidio@163.com
...全文
469 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
stidio_zhougang 2006-06-26
  • 打赏
  • 举报
回复
已经交付使用,突然发现屏幕录制不是最麻烦的事,最麻烦的是实现遍解码器,因为没使用DirectShow,而采用vfw所以写AVI文件中,音频数据的压缩也比较烦,不过现在想起来,或许实现一个SOURCE FILTER来表现屏幕或许更烦,毕竟其中还涉及到音频问题,比较DS中只有一个音频采集源,不过实现一个wrapper source filter来表现音频也是可以的,或许只是讨厌DIRECTSHOW的开发框架吧
好了,这个帖子就这样结了,谢谢各位捧场
stidio_zhougang 2006-06-09
  • 打赏
  • 举报
回复
我是说压成一个MPEG4的格式,储存为AVI,ZLIB太慢呢,如果是屏幕,用霍夫曼+行成码感觉更好一些,今天使用全局HOOK+帧值动态猜测(我自己想的一种技术,主要是用人的视觉感觉,尽量减少某些块的重建),在我的机器上1280*1024分辨率,30帧/秒, 就算屏幕变化再大最多也就1%~10%的CPU,已经满足呢
下一步工作,是找个好的编码器,如果的确没有,还得继续研究,自己弄,烦
大概想呢一下,如果能30帧/秒,加上压缩在我的机器上CPU占用40%以下,就挺满足了

对于覆盖表面的情况,本来打算使用HOOK DirectX的方式来做,但研究结果是,这种方式根本没实际操作性,真的慢,慢,慢

这个帖子暂时不结,我会把自己这个过程中的一些问题和心得写出来
starryeyed 2006-06-08
  • 打赏
  • 举报
回复
不很清楚你的目的,如果只是录制屏幕,可从另一个角度考虑:
1、动态考屏。即只有在屏幕变化的情况下才进行考屏,而且考屏也不是整屏考,只考变化的区域。VNC就是这样做的。
2、压缩我用过Dilph下的ZLIB压缩包,效果不错。

stidio_zhougang 2006-06-06
  • 打赏
  • 举报
回复
潜心研究了一下屏幕方面的东西,但还是有如下的问题:
1, Miniport的方式的确不错,但在驱动模式下DirectX好像用不了了,至少不能使用DDSCAPS_VIDEOMEMORY来创建surface,这样的后果是CPU占用增加了20%~30%(应该是视频缩放上消耗的资源),这到无所谓,但我不抓屏了,释放该资源,但还是不能使用VIDEOMEMORY来创建,也就是说,只要用了,CPU就一直这样高,很亏;另外驱动方式还存在着一些兼容性的问题,好烦

2, GDI的方式其实个人觉得在HOOK情况下,经过策略和代码优化后,保持10帧/s的速度获取,CPU资源占用并不高(%1-%20),但是使用了硬表面的程序,比如说MediaPlayer的图像不能被抓到,另外,如果禁用:属性->设置->高级->疑难解答里面的硬件加速,是能抓到MediaPlayer图形的,但不知道有没有程序的方法来实现这个步骤, 并且禁用后,GDI抓图的效率在某些显卡,特别是A卡上,有一个2~3倍的速度提升

3, 压缩方式现在也是一个问题,抓出来的东西,比如说一个1280~1024的分辨率,使用任何一个MPEG4(xVid, Vidx...)就算只有5帧/s的速度,也特别耗费资源,不知道还有什么比较快的编码器能将这个压成通用格式,那位仁兄知道的话请赐教
Kudeet 2006-05-17
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20050423/10/3960312.html
蒋晟 2006-05-17
  • 打赏
  • 举报
回复
写显卡镜像驱动吧
stidio_zhougang 2006-05-17
  • 打赏
  • 举报
回复
TO:laiyiling(陌生人 V2.0[MVP])
这样好想不是我所需要的,你给的这个地址,是用来抓诸如Media Player中的视频数据图的
但我需要的是全屏抓图,也就是说至少要得到一个全屏的表面
我现在知道一个方式,是用D3D的GetFontBuffer的方式,但速度好像也快不起来
看到CSDN上,有兄弟发贴说DSHOW的方式,不知道具体怎么弄的。。。
stidio_zhougang 2006-05-17
  • 打赏
  • 举报
回复
TO:蒋老大,我昨天看了一下VNC的代码,老实说让我看得郁闷
显卡驱动方式能不能将surface硬表面给抓下来?
另外他的速度到底能达到多少,全速跑,一秒能达到多少帧?
给点信心,俺只能继续努力呢
你的那两篇文章我都拜读呢,但个人愚钝又太懒,呵....
Eddie005 2006-05-17
  • 打赏
  • 举报
回复
帮顶~~

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧