Сократить время, чтобы сделать скриншот до 40 мс - PullRequest
0 голосов
/ 08 апреля 2019

Я делаю снимок экрана, уменьшаю его до 50% разрешения, чтобы занять меньше места, а затем помещаю байты в buffer, однако, к сожалению, этот процесс занимает слишком много времени.

В настоящее время для разрешения источника 1920x1080 требуется от 60 до 100 мс, из-за чего ускоряется вывод видео с частотой 30 кадров в секунду, поскольку я не создаю скриншоты достаточно быстро.Мне нужно около 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);
            }
        }
    }
}

1 Ответ

1 голос
/ 08 апреля 2019

Этот подход медленный, потому что вы используете GDI, который больше не является основным графическим API в Windows (и не было со времен Windows Vista).Одна из причин, по которой он работает медленно, заключается в том, что он копирует данные изображения из памяти вашего графического процессора (VRAM) в основную память вашего компьютера (RAM), чтобы им можно было управлять с помощью GDI.

Если вы хотите fast операций над кадровым буфером вашего компьютера, используйте API-интерфейсы DWM и копируйте только память между буферами в вашем графическом процессоре.Вероятно, вы также можете очень быстро изменять размер изображения и выполнять другие операции, выполняя их как шейдеры или программы CUDA.

...