Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将截图时间缩短到40毫秒_C#_.net_Performance_Image Processing_Screenshot - Fatal编程技术网

C# 将截图时间缩短到40毫秒

C# 将截图时间缩短到40毫秒,c#,.net,performance,image-processing,screenshot,C#,.net,Performance,Image Processing,Screenshot,我正在拍摄一个屏幕截图,将其缩小到分辨率的50%,以节省空间,然后将字节放入缓冲区,但不幸的是,这个过程花费了太多时间 目前,1920x1080源分辨率需要60到100ms,这导致以30fps的速度输出视频的速度加快,因为我没有足够快地生成屏幕截图。我需要达到40毫秒,才能使我制作的视频流畅 问题:我如何应用更快的插值算法或限制所需的操作以提高速度 public void Screenshot(byte[] buffer) { using (var bmp = new Bitmap(Pa

我正在拍摄一个屏幕截图,将其缩小到分辨率的50%,以节省空间,然后将字节放入
缓冲区
,但不幸的是,这个过程花费了太多时间

目前,1920x1080源分辨率需要60到100ms,这导致以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);
            }
        }
    }
}

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


如果您希望在计算机的帧缓冲区上进行快速操作,请使用DWMAPI并仅在GPU的缓冲区之间复制内存。作为着色器或CUDA程序,您也可以快速执行图像大小调整和其他操作。

谢谢您的输入。我知道它为什么慢,但是有很多答案建议解决方案,但没有一个例子显示如何在C#中加速它,并实际使用GDI以外的东西。@Yoda没有任何建议可以用C#和GDI来改进它,因为这是不可能的。如果你想让它更快,你必须使用一个更低级更直接的API。因为你发布了你的答案,我正在寻找任何DWM样本,但找不到任何。我在想C++调用代码,如果我可以使用这个DWM并从它返回字节[]数组,但是首先我需要找到任何样本。@ YODA不是简单的调用某些C++代码,它发出了<代码>字节[]/COD>。因为托管数组必须存在于主内存中。快速图形涉及运行在GPU上执行的代码,运行在VRAM上,而不是在CPU上运行的代码,使用主内存。OK,那么是否有基于C++的示例(C++中的完整记录)。我尝试了更多的东西,不起作用,已经过时,用于Ubuntu等。就像我在你之前的问题上问的,现在删除了,只是为了上下文:你想发明你自己的远程桌面协议吗?@CodeCaster不,我想用位图尽可能快地记录桌面,而60ms-100ms太慢了,您是否尝试过中的任何选项?是否考虑过使用多线程?大多数现代桌面CPU都有多个内核。