c# - 以 window 8/10 技术无延迟地完全实时截屏

标签 c# c++ winapi

我将使用 C# 或 C++ 创建一个非常快速的实时远程服务,没关系,但目前我正在使用 c#。

好的,我正在寻找和要求的是一种以最快的形状实时捕获窗口屏幕的方法。

我知道互联网上已经有这些方法,但问题是延迟 ...

  • I used C# copyfromscreen and the delay was 92ms for 1920x1080 [ 5 frame in video ]
  • I used C# copyfromscreen with jpg encoder and delay was 36ms for 1920x1080
  • I used Unity3D screenCapture with jpg encoder and delay was 38ms for 1920x1080
  • I used C# Windows Desktop Duplication API and delay was 19ms for 1920x1080 [ 3 frame in video ]
  • I used C# Windows Desktop Duplication API with jpg encoder and delay was 12ms for 1920x1080 [ 2 frame in video ]
  • I used C++ Windows Desktop Duplication API with jpg encoder and delay was 9ms for 1920x1080 [ 2 frame in video ]
  • I used C# Windows DirectXCapture with jpg encoder and delay was 16ms for 1920x1080 [ 2 frame in video ]

我认为这种方式的进展是正常的,直到我检查了 Windows 10/8 任务栏实时预览缩略图并且它是完全实时的,没有 1 毫秒的延迟,这意味着帧到帧!

我尝试将所有方法的 1920 x 1080 大小调整为任务栏预览大小,但没有进行任何更改!

注意:该程序不能通过互联网处理,它可以在本地网络上运行。

我猜延迟是因为位图处理或其他原因,但我还不知道! [Times Added] 这是我在服务器上处理图片的方式:

private static byte[] capture()
{
    Bitmap bmp = screenshot_DDAPI(); // Avarage Time : 29.6566ms
    MemoryStream ms = new MemoryStream();
    bmp.Save(ms, ImageFormat.Jpeg); // Avarage Time : 1.7101 ms
    return ms.ToArray(); // Avarage Time : 3.032 ms
}

有谁知道windows用什么技术和方法把截图处理成任务栏实时缩略图的?

注意:如果这个问题与堆栈溢出无关或偏离主题,请告诉我我可以问哪个堆栈类别?

谢谢

最佳答案

桌面复制 API 是最快的 API。捕获延迟为零。

但是,在捕获之后,您会将原始纹理数据下载到系统 RAM 中,以供基于 CPU 的 jpeg 编码器使用。这就是花时间。实时缩略图不需要这样做,它们在 GPU 中缩放窗口纹理并使用 GPU 渲染它,当源数据已经在 VRAM 中时,两者都非常便宜。

如果您真的想最大限度地减少延迟,请寻找可以从 B8G8R8A8_UNORM D3D11 纹理获取源数据的基于 GPU 的 JPEG 编码器。 JPEG 占用的空间(因此带宽)比 RGBA 少得多,也就是说,您可能会更快地获得编码结果。

关于c# - 以 window 8/10 技术无延迟地完全实时截屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52930179/

相关文章:

c# - 配置 .editorconfig 中缺少 xml 注释的警告 (Visual Studio 2019)

c# - 在 XDocument 中合并 XML 文件

c# - Entity Framework 无法使用复合键更新表中的数据 (Oracle)

c++ - 编译c/cpp文件时scons "Depends"什么时候有用?

c++ - 一旦达到数据类型的限制,是否有一种简单有效的方法来动态更改数据类型?

java - 如何使 GetLastError 可靠地与 JNA 一起工作?

c++ - 获取特定进程的线程句柄/id

c# - 从服务注销

c++我如何获得当前的控制台conhost进程

c++ - 为什么 mpd_connection_clear_error () 在 mpd_recv_idle () 的 MPD_ERROR_TIMEOUT 之后失败?