问题标签 [dxgi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 调整绑定到 Direct2D 渲染目标的 DXGI 交换链的大小
我有一个使用 ID2D1Factory::CreateDxgiSurfaceRenderTarget 创建的 Direct2D 渲染目标。当我收到 WM_SIZE 消息时,我尝试通过调用 IDXGISwapChain::ResizeBuffers 来调整相应交换链的大小,但它失败并显示 DXGI_ERROR_INVALID_CALL (0x887a0001)。我相信这是因为ResizeBuffers 文档所述:
除非您释放对其后台缓冲区的所有未完成的引用,否则您无法调整交换链的大小。您必须释放其在后台缓冲区上的所有直接和间接引用,才能使 ResizeBuffers 成功。
在对资源调用 AddRef 后,应用程序会保留直接引用。
间接引用由对资源的视图持有,将资源视图绑定到设备上下文、使用资源的命令列表、使用该资源视图的命令列表、执行另一个命令列表的命令列表资源等等。
我假设由 ID2D1RenderTarget::CreateDxgiSurfaceRenderTarget 创建的 Direct2D 渲染目标就是这样一种间接引用。但是我无法想象每次调整窗口大小时我都应该重新创建渲染目标,那我该怎么办?
visual-c++ - DXGI 演示最大帧延迟
对于当前间隔为 1 并与用户输入交互的应用程序,我试图了解是否有任何动机/场景通过IDXGIDevice1::SetMaximumFrameLatency设置最大帧延迟 > 1 。很明显,低最大帧延迟的好处是减少用户输入的延迟,但对我来说,什么情况下保证最大帧延迟为 2 或 3 并不明显。它对 FPS 没有真正帮助,因为在稳定状态下,无论如何,应用程序只能排队一个额外的帧,因为它必须等待当前显示的帧完成。
如果有人对此有任何想法,将不胜感激。特别是如果有人可以概述更高的最大帧延迟确实有帮助的场景:)
谢谢。
c++ - 有没有办法在 ID3DUserDefinedAnnotation 上调用 SetPrivateData?
我试图在我的应用程序中命名由 DXGI 或 D3D11 实例化的每个 COM 对象,以便可以在调试器中很好地查看它们。
我卡在ID3DUserDefinedAnnotation
界面上,从ID3D11DeviceContext
. 我找不到SetPrivateData
为此对象公开的接口。
设置此对象的调试器名称的方法是什么?
c++ - 为什么对 Device 和 Swap Chain 使用相同的 IDXGIFactory
IDXGIFactory 接口的引用告诉我,为了创建交换链,我可能会使用与创建 Direct3D 设备相同的工厂:
因为您可以在不创建交换链的情况下创建 Direct3D 设备,所以您可能需要检索用于创建设备的工厂以创建交换链。
它还提供了以下代码示例:
这篇文章非常冗长,当试图完全理解它时,出现了以下两个问题,而第一个问题是主要问题(关于这个线程的标题):
为什么我必须使用与创建 Direct3D 设备相同的工厂才能创建交换链?工厂实例是否维护一个重要的内部状态,或者只是为了避免创建另一个消耗资源的工厂实例?
此外,在代码示例中,我遇到了以下代码行:
对我来说,IDXGIAdapter 是 IDXGIDevice 的父级是不合逻辑的。否则,我希望IDXGIAdapter有一个像 CreateDevice 这样的方法,它会使适配器成为设备的父级。但事实并非如此。为什么适配器是设备的父级?
directx - 如何裁剪 IDXGISurface 的一个区域?
我是初学者,所以我的问题可能听起来很傻。我有一个包含一些数据/图像的 IDXGISurface。我希望从中裁剪某些矩形区域并将其存储到相同的 IDXGISurface 或另一个类似的表面中。我相信 Direct2D 提供了一种通过层来实现的方法。对此的任何指导(最好是逐步进行)都会有所帮助。
directx-11 - DirectX11 交换链和窗口失去全屏状态
我只是偶然发现了这个令人讨厌的行为,同时在示例程序上添加了全屏支持。
创建一个全屏窗口是可行的,但是只要我在包含全屏窗口的输出上移动任何窗口(来自另一个应用程序),它就会自动切换回窗口化。
有什么办法可以防止这种行为(所以全屏窗口不会回到窗口)?
作为参考,这是一个小的独立示例(因此可以轻松复制问题)。
另外,如果这有用,我正在 Windows 8.1 上运行。
我已经尝试更改 WindowAssociationFlags 和 SwapChainFlags,均未成功,与使用 FlipSequential 而不是 Discard 相同
编辑:我还尝试了一个 c++ 示例(刚刚从 Microsoft 获取了 DirectX11 基础教程并添加了全屏开关),这导致了相同的行为,所以这不是 SharpDX 特定的问题。
我查看了消息循环,一旦发生这种情况,第一个全屏模式会更改回窗口模式,并且我会收到一条 WM_DISPLAYCHANGE 消息)。
c++ - IDXGIFactory1::isCurrent(), when does it return TRUE?
I'm using IDXGIFactory1::isCurrent()
to detect when display topology has changed.
The documentation says;
FALSE, if a new adapter is becoming available or the current adapter is going away. TRUE, no adapter changes. IsCurrent returns FALSE to inform the calling application to re-enumerate adapters.
However it seems to return TRUE after an WM_DISPLAYCHANGE message, for example after entering fullscreen mode.
Am I really expected to re-enumerate all DXGI topology after going fullscreen? Does anybody know how this works?
c++ - DXGI 桌面复制:编码帧以通过网络发送它们
我正在尝试编写一个应用程序,它将捕获屏幕的视频流并将其发送到远程客户端。我发现在 Windows 上捕获屏幕的最佳方法是使用DXGI Desktop Duplication API(自 Windows 8 起可用)。Microsoft 提供了一个简洁的示例,它将重复的帧流式传输到屏幕。现在,我一直想知道对这些帧进行编码并通过网络发送它们的最简单但仍然相对较快的方法是什么。
这些帧来自AcquireNextFrame
一个包含桌面位图和元数据的表面,其中包含已更新的脏区和移动区域。从这里,我有几个选择:
- 从 DirectX 表面提取位图,然后使用ffmpeg等外部库将位图系列编码为 H.264 并通过 RTSP 发送。虽然简单,但我担心这种方法会太慢,因为它没有利用任何本地 Windows 方法。将 D3D 纹理转换为与 ffmpeg 兼容的位图似乎是不必要的工作。
- 从这个答案:将 D3D 纹理转换为 IMFSample 并使用 MediaFoundation 的SinkWriter对帧进行编码。我找到了这个视频编码教程,但我还没有找到一种方法来立即获取编码帧并将其发送而不是将它们全部转储到视频文件中。
因为我以前没有做过这样的事情,所以我问我是否朝着正确的方向前进。最后,我想要一个简单的、最好是低延迟的桌面捕获视频流,我可以从远程设备上查看它。
另外,我想知道我是否可以利用桌面复制提供的脏和移动区域。我可以通过网络发送它们并在客户端进行处理,而不是对帧进行编码,但这意味着我的客户端必须有可用的 DirectX 11.1 或更高版本,如果我想流式传输到移动平台,这是不可能的.
c++ - MF SinkWriter 内存问题
我尝试使用 DXGI Desktop Duplication API 和 MF Sink Writer 将我的桌面图像 (1920x1080) 编码为视频文件。我的编码线程如下所示:
初始化例程直接取自Desktop Duplication Sample和Sink Writer Tutorial。视频格式定义也取自 Sink Writer 教程,其中帧分辨率和VIDEO_INPUT_FORMAT = MFVideoFormat_ARGB32
.
然而,经过这个循环约 20 次(有时多一点,有时少一点)后,它会失败,或者会mSinkWriter->WriteSample()
出现mDeskDupl->AcquireNextFrame()
以下 HRESULT 消息:
应用程序发出了无效的调用。调用的参数或某些对象的状态不正确。启用 D3D 调试层以通过调试消息查看详细信息。
启用 D3D 调试层后,我看到我的帧(我想那些对象是我的帧)由于某种原因没有释放,只是继续堆积:
D3D11 警告:0x0000006504FFC290 处的活动对象,引用计数:17。 [状态创建警告 #0:未知]
我相当肯定 HRESULT 失败是因为我的 GPU 内存不足(也可以通过 GPU-Z 实用程序观察 GPU 内存使用情况来确认)。但是,我不知道是什么导致了这种内存泄漏,因为我正在释放我正在分配的每个资源(SafeRelease 实现)。
编辑:更改了指向智能指针的指针并添加了宏定义。