为什么 DirectX 全屏应用程序会出现黑色屏幕截图?

2023-12-05

您可能知道尝试以 GDI 方式捕获 DirectX 全屏应用程序(使用BitBlt())给出一个black截屏。

我的问题很简单,但我找不到任何答案:why?我是说技术上,为什么截图是黑色的?

我正在阅读 DirectX 教程:http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-1。上面写着:

[...] 函数 BeginScene() [...] 执行称为锁定的操作,其中视频 RAM 中的缓冲区被“锁定”,从而授予您对此内存的独占访问权限。

是这个原因吗? VRAM 被锁定,因此 GDI 无法访问它,并且屏幕截图为黑色? 还是还有其他原因?就像 DirectX 直接与显卡“对话”而 GDI 却听不懂?

谢谢。


原因很简单:性能。

这个想法是在 GPU 上尽可能多地渲染与 CPU 不同步的场景。你使用CPU将渲染缓冲区发送到GPU(顶点、索引、着色器等),这总体来说非常便宜,因为它们很小,然后你可以做任何你想做的事情,物理,多人同步等。GPU可以处理数据并自行渲染。

如果你需要在窗口上绘制场景,你必须中断GPU,请求渲染缓冲区字节(LockRect),请求窗口的图形对象(对 GPU 的干扰更大),渲染它并释放每个锁。您只是失去了在 GPU 上渲染与 CPU 不同步所获得的任何增益。更糟糕的是,当您想到所有不同的 CPU 核心因为忙于“渲染”(更像是等待缓冲区传输)而处于空闲状态时。

因此,图形驱动程序所做的就是用幻彩绘制渲染区域,并告诉 GPU 场景的位置,GPU 负责根据幻彩像素(有点像多像素)将场景覆盖在显示的屏幕上。当第一个纹理具有特定颜色时,传递从第二个纹理获取的像素着色器x,y,但没那么慢)。您的渲染完全不同步,但是当您向操作系统询问其视频内存时,您会得到场景所在的神奇颜色,因为这就是它实际使用的颜色。

参考:http://en.wikipedia.org/wiki/Hardware_overlay

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 DirectX 全屏应用程序会出现黑色屏幕截图? 的相关文章

随机推荐

  • 如何使用依赖属性来替换UserControl构造函数中的参数?

    我注意到以前有人问过类似的问题 但我没有找到任何详细的例子 我有一个winform程序 它的构造函数有一个参数cn public AddFailure ProSimConnect cn constructor in winform this
  • 为什么BFS的复杂度是O(V+E)而不是O(E)? [复制]

    这个问题在这里已经有答案了 这是一个通用的 BFS 实现 For a connected graph with V nodes and E total number of edges we know that every edge will
  • 自定义GridView删除按钮

    如何自定义自动生成的命令按钮 例如Delete 我想在删除时添加客户端确认 同时我希望在设置时生成此按钮AutoGenerateDeleteButton true 是否可以 我可以这样添加自定义按钮
  • 您请求的商品无法购买

    我正在尝试在 Android 应用程序中测试订阅 我用地下城的例子 我上传的 apk 未发布 但订阅项目已发布 我在开发控制台中添加了新的测试帐户 gmail 它不是开发人员帐户 我将手机重置为出厂状态并添加了测试帐户 我安装了签名的apk
  • 如何从以破折号开头的远程名称中提取

    在 git 中 可以使用以下命令处理远程名称 人物明星 例如 我们可以添加一个以 只需使用选项更新它 在 git 命令中 命令选项和远程名称之间分开 但它不起作用 git pull myremotename master 而且 我收到此错误
  • 将 pandas 系列时间戳转换为唯一日期列表

    我在 pandas 数据框中有一列时间戳格式的列 想要将唯一日期 没有时间 提取到列表中 我尝试了以下方法并没有真正起作用 1 dates datetime datetime df EventTime tolist date 2 dates
  • 从 Google 应用脚本访问 Google 文档评论

    我正在与几个人同时编写谷歌文档 为了跟踪谁必须做什么 我正在使用评论 然后 文档的每个部分都会分配给某人 并且他必须在评论中更新其部分的状态 以结构化格式 感谢 VBA 中的宏 我将其提取出来并将结果放入电子表格中 这样就可以轻松跟踪文档的
  • 具有一个或多个(多个)参数的搜索表单

    我已经掌握了基础知识 在其中创建了两个文件 用户输入搜索参数的搜索表单 以及生成输入项目的结果文件 为了简单起见 我们将搜索表单文件指定为 search php 将结果页面指定为 results php 搜索 php
  • Java8 Collections.sort(有时)不会对 JPA 返回的列表进行排序

    Java8 在我的 JPA EclipseLink 2 5 2 环境中不断执行奇怪的操作 我不得不删除这个问题https stackoverflow com questions 26806183 java 8 sorting behavio
  • 在聚焦的输入上按空格键并输入“单击”。如何禁用此行为?

    在 Chrome 和 Firefox 也许还有其他 中 如果您有一个输入焦点 按 空格 和 Enter 即可为您单击它们 我正在制作一个 HTML 5 游戏 我想重写空格和输入在焦点上的反应方式 但默认行为妨碍了我 有没有办法在大多数浏览器
  • 使用 CNN 进行二值图像分类 - 选择“负”数据集的最佳实践? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 假设我想训练一个 CNN 来检测图像是否是汽车 选择 Not Car 数据集的最佳实践或方法有哪些 因为这个数据集可能是无限的 基本上是除汽车以外的任何东西 是否有关于数据集需要
  • 通过 Spring MVC 框架包含其他 JSP 是一个好主意吗?

    这是一个模糊而宏大的问题 但希望我能用尽可能少的具体例子来解释它 我们最近改用 Spring MVC 作为我们的应用程序框架 但在开发过程中发现了一个 实际上只有一个 限制因素 如何使用适当的模型包含动态视图 例如 我们正在创建一个包含可重
  • 安装了 SQL Server 2008,但运行版本仍然是 2005

    不久前 我在一台开发计算机上安装了 SQL Server 2008 该计算机已经从 Visual Studio 中安装了 Sql Server 2005 Express 当我查看程序时 我看到 Microsoft Sql Server 20
  • 将 jdb 附加到未捕获的异常

    所以 我正在启动一个 Java 程序 如下所示 java agentlib jdwp transport dt socket address 8000 server y suspend n MyClass 然后我手动附加一个调试器 如下所示
  • 如何在Dialogflow中的对话之间保存数据?

    我不明白你应该如何保存数据 我尝试使用 let conv agent conv conv data data1 mydata to save mydata conv data data1 to load agent add conv 但它使
  • NSNumber 给出错误的 int 值

    我有一个获取 cookie 的程序 此 cookie 的一个参数是 NSNumber 所以我将其保存到数据库中 sqlite3 bind int addStmt 2 HEREisNSNUMBER 将该值保存为 cookieObj creat
  • 选择排序与索引的问题

    实际上我正在处理 CodeAbbey 问题 所以我不想将答案作为代码 而是对此进行解释 我做错了什么 http www codeabbey com index task view selection sort 我的选择排序实际上可以正常工作
  • Google+ api 不会通过登录请求返回个人资料名称

    谷歌文档HERE明确地说 您不应将 userinfo profile 或 plus me 与 https www googleapis com auth plus login 范围结合使用 因为它们是隐式包含的 并且会为您的用户创建一个令人
  • 根据选定的复选框显示 div

    我有一个网页 有四个复选框 如下所示 p Buy Samsung 2230 p
  • 为什么 DirectX 全屏应用程序会出现黑色屏幕截图?

    您可能知道尝试以 GDI 方式捕获 DirectX 全屏应用程序 使用BitBlt 给出一个black截屏 我的问题很简单 但我找不到任何答案 why 我是说技术上 为什么截图是黑色的 我正在阅读 DirectX 教程 http www d