【问题标题】:Reduce time to take a screenshot to 40ms将截屏时间缩短至 40 毫秒
【发布时间】:2019-04-08 16:48:36
【问题描述】:

我正在截屏,将其缩小到分辨率的 50%,以减少空间,然后我将字节放入 buffer,但不幸的是,此过程需要太多时间。

目前,1920x1080 源分辨率需要 60 到 100 毫秒,这会导致 30fps 的输出视频速度加快,因为我生成屏幕截图的速度不够快。我需要达到大约 40 毫秒才能制作流畅的视频。

问题:如何应用更快的插值算法或限制所需的操作以加快速度?

public void Screenshot(byte[] buffer)
{
    using (var bmp = new Bitmap(Params.SourceWidth, Params.SourceHeight))
    {
        using (var g = Graphics.FromImage(bmp))
        {
            g.CopyFromScreen(Point.Empty, Point.Empty, new Size(Params.SourceWidth, Params.SourceHeight), CopyPixelOperation.SourceCopy);
            g.Flush();
            using (Bitmap resized = new Bitmap(bmp, new Size(Params.TargetWidth, Params.TargetHeight)))
            {
                var bits = resized.LockBits(new Rectangle(0, 0, Params.TargetWidth, Params.TargetHeight), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
                Marshal.Copy(bits.Scan0, buffer, 0, buffer.Length);
                resized.UnlockBits(bits);
            }
        }
    }
}

【问题讨论】:

  • 就像我在您之前关于此主题的问题中所问的那样,现在已删除,只是为了说明上下文:您是否正在尝试发明自己的远程桌面协议?
  • @CodeCaster 不,我正在尝试以尽可能快的速度为SharpAvi 提供位图来记录桌面,而 60 毫秒 - 100 毫秒太慢了,
  • 你尝试过stackoverflow.com/questions/1922040/…中的任何选项吗?
  • 你考虑过多线程吗?大多数现代台式机 CPU 都有多个内核。

标签: c# .net performance image-processing screenshot


【解决方案1】:

这种方法很慢,因为您使用的是 GDI,它不再是 Windows 中的主要图形 API(并且自 Windows Vista 以来一直没有)。它速度慢的原因之一是它会将图像数据从 GPU 的内存 (VRAM) 复制到计算机的主内存 (RAM) 中,以便通过 GDI 对其进行操作。

如果您希望对计算机的帧缓冲区进行快速 操作,请使用 DWM API 并仅在 GPU 的缓冲区之间复制内存。您可能还可以通过将它们作为着色器或 CUDA 程序进行快速调整图像大小和其他操作。

【讨论】:

  • 感谢您的意见。我知道为什么它很慢,但是有很多答案建议解决方案,但没有一个示例显示如何在 C# 中加速它并实际使用 GDI 以外的其他东西。
  • @Yoda 没有任何建议可以使用 C# 和 GDI 改进它,因为这是不可能的。如果您希望它更快,则必须使用较低级别且更直接的 API。
  • 自从您发布答案后,我正在寻找任何 DWM 示例,但找不到任何示例。如果我可以在那里使用这个 DWM 并从中返回 byte[] 数组,我正在考虑调用 c++ 代码,但首先我需要找到任何示例。
  • @Yoda 这不像调用一些发出Byte[] 的C++ 代码那么简单,因为该托管数组必须存在于主内存中。快速图形涉及运行在 GPU 上执行并在 VRAM 上运行的代码,而不是在 CPU 上运行并使用主内存的代码。
  • 好的,有没有基于 C++ 的示例,(C++ 中的整个录音)。我尝试了更多的东西,不起作用,已经过时,对于 Ubuntu 等。
猜你喜欢
  • 1970-01-01
  • 2014-07-13
  • 2013-06-20
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多