1

我有一个应用程序通过 Direct2D 进行一些绘图并通过桌面复制 API 捕获屏幕内容。它是一个 C# 应用程序,但我有自定义分层窗口来进行显示,并且我通过 Direct2D 进行渲染以绕过 WPF 中的“智能”绘图,该绘图以前导致我的应用程序不能非常积极地竞争图形资源。

如果我将这个应用程序与占用大量图形资源的 DirectX 游戏同时运行,那么我得到的行为如下:

  1. 如果我的应用程序是前台应用程序,它可以正常工作

  2. 如果我的应用程序是可见的,但不是前台应用程序,那么对 Map Subresource 和 Copy Resource 的调用会花费高度可变的时间,有时会阻塞数百毫秒(根据分析器)。我不确定我是否相信数百,但肯定 Map Subresource 平均为 50 毫秒,因此捕获率降至 20FPS 以下。在前台运行时,相同的调用平均需要 4ms。

我已经检查过操纵进程和线程优先级是否可以做任何事情,但它没有。当我不在前台时,DirectX 似乎在限制我的东西,与优先级无关。这是一个问题,因为我的应用程序需要在不处于前台的情况下运行全帧速率。

如果它严格优先考虑来自前台应用程序的 GPU 命令,那么我可以看到我的应用程序可能在通往/来自 GPU 的通道上被饿死,因为这可以解释像这样的停滞。如果我能以某种方式免除此应用程序的此类监管,那将是最佳选择。例如某种清单条目或 DirectX 调用通知驱动程序(或堆栈)不要将我的应用程序视为后台?

我比较了 OBS 的代码(据我所知),我看不出它们有什么不同。即使在流媒体甚至要求苛刻的游戏时,即使它们显然不是前台应用程序,OBS 是如何设法继续复制/捕获的?

[编辑]

有问题的游戏是 DCS,它总是使用所有可用的 GPU 资源,如果你愿意的话,它使用大约 1.5 个内核。当我说它不在前台时开始变慢时,我实际上是在谈论从我的应用程序中单击一个窗口而不是在游戏窗口中单击(甚至不是最小化或任何东西。)当我在前台时,DCS 会随着我消耗资源。如果 DCS 在前台,它会继续以全速渲染并使用所有资源,我的捕获速度会减慢。

我发现如果我通过 vsync 将 DCS 限制为 60 FPS,我可以让事情顺利进行,这样它就不能使用所有资源。然后一切正常。显然,这并不能解决问题,但它进一步表明这很可能是一些资源争用。我很好地争夺资源,但它似乎优先考虑 DirectX 中的前台应用程序(或 Nvidia 的驱动程序?)

[/编辑]

4

1 回答 1

2

我遇到了完全相同的问题,发现这是因为Window 的 Gamemode 功能。将其关闭并重新启动为我修复了它。

此外,我使用 Direct x 视频处理器来缩放我的图像,它的性能与各种驱动程序更新高度不一致,所以现在我决定“按原样”使用而不进行缩放。

于 2020-12-22T07:27:01.040 回答