好久没有更新博客了,今天开始继续耕耘。

生活要继续

工作要继续

梦想也一定要继续!

之前写过一篇关于DirectX截屏的文章,其中有网友留言提到了截图黑屏的问题,于是这些日子研究了一下,与大家一同分享。

为什么会黑屏?

一句话概括,黑屏是由于DDraw加速引起的!

先说一下DirectX的显示原理,通常我们看到的屏幕上的数据,都是通过Primary Surface送至显示器的,什么是Primary Surface呢?中文叫做主显示表面,也就是说我们当前看到的屏幕上的图像数据是从这个表面来的,除了主表面意外还有离屏表面,叫做OffScreenSuface。这种表面中的数据是不直接显示在屏幕上的。常用的截屏函数也基本上是通过截取Primary Surface中的数据来实现的。现在多数的视频播放软件都是用DDraw写的(现在DDraw已经融合到DirectX的Graphics本分,DDraw这个词也已经成为历史了。),而且使用了一种叫做Overlay的表面,我们常用的截屏函数都是截取普通的primary surface中的数据,无法截取Overlay surface中的数据,而微软又没有提供公共的API来获取Overlay surface中的数据,所以,黑屏就不足为奇了。下面就是使用了Overlay技术的Windows Media Player截图时的黑屏现象。

Overlay是纯硬件支持的,DDraw并不会用软件实现这种功能。这种Surface的特殊之处在于,它相当于蒙在屏幕上的一块塑料板,也就是说,这个如果使用了这种Surface,那么它就位于所有surface的最前端。显示设备在向屏幕显示数据的时候,会先判断该位置是否有Overlay,如果有,就显示Overlay中像素,如果没有,就使用Primary Surface中的像素。所以,当你打开一个播放器来播放视频,截图的时候就会发现播放器窗口是黑的。原因就是这块区域正好对应着Overlay。当然是截取不到的。

关于Overlay surfaces的详细介绍,可以看这里

如何避免截图时黑屏

大多数软件除了DDraw的渲染模式之外,还提供了一种Software renderer模式,也就是软件模式,这种模式在DDraw加速不可用的时候才会使用,所以一个避免截图黑屏的办法就是关闭DDraw加速,强迫软件使用Software renderer模式,这样,Overlay surface就不存在了,也就不会黑屏了。具体办法如下

方法一: 使用软件本身的设置来禁用Overlay技术,该方法只会影响该软件本身,以常见的Windows Media Player为例,设置如下(将 使用覆盖这个选项勾掉,这样软件就不会使用Overlay Surface了)

方法二: 使用DirectX控制面板来关闭DDraw加速,上面的方法相当于关闭分支开关,而这个方法则相当于把总闸给关闭了,系统中所有其他软件也不能使用DDraw加速了。如果安装了DirectX SDK,那么直接在运行栏里面输入dxdiag即可打开DirectX控制面板,设置如下。

方法三:其实还有一种办法,就是用程序占用Overlay surface,这种办法太麻烦,一般人不会用,因为一般的独立显卡都支持Overlay Surface,而且支持的个数是有限的,所以,如果我们提前用程序占用了所有的Overlay Surface,那么其他程序就无法再使用了,也就不会导致截图黑屏了。在使用这种方法前,应该首先查看自己的显卡是否支持Overlay技术,以及支持多少个。如果安装了DirectX SDK,可以依次展开:开始-程序-Microsoft DirectX SDK-DirectX Utilities-DirectX Caps Viewer,由下图可知,我的显卡支持一个Overlay Surface,我还没玩过高级显卡,没见过支持多个Overlay的显卡,哪位兄弟有好的显卡,也发个图让小弟看看。

但是这种方法有一个弊端,就是如果软件不支持Software Renderer模式,那么如果你先用程序占用了Overlay,再启动播放软件的时候,就会导致错误。

以上几种办法究其本质,实际上就是一种,都是禁止使用Overlay Surface。而且这些方法都有一个弊端,就是要求先入为主,也就是在软件启动前(或者确切的说,是视频播放前)做好设置,然后再启动软件。如果视频已经播放(Overlay已经被占用),那么这些方法将会统统失效。

除此之外,还可以使用现成的截图软件,很多软件都可以处理黑屏的情况,比如HyperSnap 6就很不错。

如何截取Overlay中的数据?

说来这不是一个简单的问题,我在网上搜索了很久,也没找到合适的办法,据说使用Hook技术可能会办到,但是我对hook不太熟悉,所以也没尝试,希望哪位朋友有兴趣可以试试,关于这个话题,google讨论组上有个帖子,介绍的比较详细,感兴趣的可以看看这里

挑战一下!

我这里有一个关于Overlay Surface的Demo(下载)。这个Demo来自DirectX 7的SDK,是一只飞动的小蚊子。由于版本较老,现在网上已经不太常见了。根据上面的研究可以断定,能截取到这只小蚊子绝非易事,感兴趣的朋友不妨试试!

References

Hardware Overlay http://www.fox-magic.com/sva_overlays.php

from:http://www.cnblogs.com/graphics/archive/2012/04/03/2117798.html

DirectX截图黑屏的解决办法的更多相关文章

  1. Android 避免APP启动闪黑屏的解决办法(Theme和Style)

    前几天Boss就反应说,机器每次启动程序都会闪一下黑屏,这个客户不接受.没办法,只能想想怎么解决,最后找到了下面的方法.闪黑屏的原因主要是我们启动Activity的时候,需要跑完onCreate和on ...

  2. ctrl+alt+F1~6进入不了字符界面,黑屏的解决办法

    ubuntu系统,我是ubuntu14.04 本来想装cuda,需要在字符界面下装,奈何按ctrl+alt+F1就黑屏了,按ctrl+alt+F7又可以正常回到图形界面,网上查了很多,有的方法也试过, ...

  3. 关于VMware虚拟机安装镜像时黑屏的解决办法

    新下载的VMware14,设置了新的虚拟机,镜像放的是ubuntu系统,然后开机要安装系统的时候黑屏,并没有进入到安装系统的界面 解决办法:在管理员权限下打开cmd,然后运行netsh winsock ...

  4. 升级win10 1903版后,vmware打开虚拟机黑屏的解决办法

    按照网上给的方法(1-3),又增加了几步(从4开始,只在我自己电脑上实践过): 1. 打开cmd,执行以下命令 netsh winsock reset 2. 重启电脑 3. 以管理员身份执行vmwar ...

  5. 关于OBS获取显示器黑屏的解决办法

    近来看到许多人说OBS获取显示器源的时候黑屏,下面介绍下相关处理办法. 第一种,先尝试把OBS程序的兼容性设置成Win 7和管理员身份,具体操作: 设置成这样,如果能够获取到显示器,那么问题解决,否则 ...

  6. vitrual box安装centos时一直黑屏的解决办法

    趁着清明节没事,昨天看了mysql性能优化后,想装个linux系统学习下,linux一直是我的短板...之前是在vmware上安装ubuntu,买了新电脑后,听过virtual box相比vmware ...

  7. MacBook安装WIN7开机黑屏的解决办法

    同事的一台Macbook,全盘用diskgenius格式化为MBR分区,支持BIOS启动,安装ghost版本的WIN7,开机黑屏,看了网上的帖子没有用,插入启动盘按option键选择从优盘启动,用di ...

  8. 【转】Android Fragment中使用SurfaceView切换时闪一下黑屏的解决办法

    重构了下之前自己的一个新闻客户端,全部使用了Fragment来进行页面切换,只有一个入口Activity作为程序的启动Activity,其中有一个界面需要调用摄像头识别二维码, 于是就会用到Surfa ...

  9. Windows10系统,截图黑屏,怎么办?

    问题:Windows10系统,截图黑屏,怎么办? 图片描述: 原因:也许有  媒体播放软件和系统(或者正在使用的截图软件)起了冲突. 我就开了个这个软件,就完蛋了. 导致了  系统自带的  这两个截图 ...

随机推荐

  1. WCF 之 OperationContract

    这里主要说的是同名异常: [ServiceContract] public interface IUserInfo { [OperationContract] string ShowName(stri ...

  2. display:none和visibility: hidden二三事

    display:none属性后,HTML元素(对象)的宽度.高度等各种属性值都将“丢失”;而使用visibility:hidden属性后,HTML元素(对象)仅仅是在视觉上看不见(完全透明),而它所占 ...

  3. Chp14: Java

    1.finally keyword: finally keyword is used in association with a try/catch block and guarantees that ...

  4. HDU 3047 Zjnu Stadium(带权并查集)

    题意:有一个环形体育场,有n个人坐,给出m个位置关系,A B x表示B所在的列在A的顺时针方向的第x个,在哪一行无所谓,因为假设行有无穷个. 给出的座位安排中可能有与前面矛盾的,求有矛盾冲突的个数. ...

  5. js注册验证【转】

    function getFocus() //设置用户名文本框获取焦点 { document.getElementById("txtuname").focus(); } functi ...

  6. java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中

    /** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中. *  * 思路:1.需要深度遍历.--递归 * 2.遍历的过程中过滤指定扩展名的文件 ...

  7. POJ2299Ultra-QuickSort

    http://poj.org/problem?id=2299 题意 : 排序,求排序次数,本来以为用冒泡可以搞定,事实上,那么大的数据以及一个TLE告诉我,会超时......... 思路 : 问了一下 ...

  8. jndi配置数据源

    jndi(java Naming and DirectoryInterface,java命名和目录接口)是一组在Java应用中访问命名和目录服务的API. 命名服务将名称和对象联系起来,使得我们可以用 ...

  9. lintcode 中等题:Min stack 最小栈

    题目 带最小值操作的栈 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 解题 可以定义 ...

  10. 【Linux常识篇(3)】文件及文件夹的ctime atime mtime的含义详解

    首先可以使用stat 命令来查询文件的inode信息,其中包括ctime atime mtime [root@localhost ~]# stat sort2.txt File: 'sort2.txt ...