SkiaSharp: Как ограничить или уменьшить разрешение пикселя для больших (4K) экранов? - PullRequest
0 голосов
/ 29 июня 2019

Я только начинаю изучать использование SkiaSharp в качестве альтернативы GDI + с WinForms для Windows 10. Я специально хотел использовать 2D-графику с GPU-ускорением и смог запустить примеры SkiaSharp с GLControl и CreateNativeGlInterface.

ПК - Windows 10, 10-ядерный i7-6950X, с графической картой GTX-1080 TI Founders Edition и экраном 4K.

Я начал тестирование производительности SkiaSharp, нарисовав 1000 случайных линий случайными цветами, и заметил, что при изменении размера GLControl более чем на 3,145 миллиона пикселей скорость рендеринга внезапно снизилась с 1 мс до более 100 мс !!!

Длина по сравнению с шириной может варьироваться, если количество пикселей не превышает приблизительно 3,145 миллиона пикселей (это не ограничение по высоте или ширине, это ограничение по пикселям).

enter image description here

Пример времени рендеринга при медленном расширении окна:

ms: 1, w: 1914, h: 1637, pixels: 3133218
ms: 1, w: 1915, h: 1637, pixels: 3134855
ms: 1, w: 1916, h: 1637, pixels: 3136492 
ms: 1, w: 1917, h: 1637, pixels: 3138129
ms: 1, w: 1919, h: 1637, pixels: 3141403
ms: 3, w: 1920, h: 1637, pixels: 3143040
ms: 210, w: 1924, h: 1637, pixels: 3149588
ms: 196, w: 1931, h: 1637, pixels: 3161047
ms: 122, w: 1935, h: 1637, pixels: 3167595
ms: 122, w: 1938, h: 1637, pixels: 3172506
ms: 124, w: 1940, h: 1637, pixels: 3175780
ms: 190, w: 1940, h: 1637, pixels: 3175780

Вопросы:

  • Существуют ли какие-либо настройки SkiaSharp, которые предотвратят такое замедление для рисунков в диапазоне размеров от 2K до 4K?

  • Я хочу иметь возможность максимизировать экран для рисования, подобный этому, на мониторе 4K, но на самом деле мне не нужно такое большое разрешение. Для этого приложения хорошо подойдет растянутый рисунок с разрешением 1080p, однако рабочий стол Windows должен быть стандартным 4K со 100% масштабированием. Как можно уменьшить разрешение рисунка в пикселях и масштабировать его, чтобы уместить очень большой холст без значительного замедления времени рендеринга?

Спасибо за любые предложения !!

Пример исходного кода SKGLControl находится здесь: GitHub SKGLControl

Мой исходный код:

    private void SkglControl1_PaintSurface(object sender, SkiaSharp.Views.Desktop.SKPaintGLSurfaceEventArgs e)
    {
        var paintStroke = new SKPaint
        {
            IsAntialias = true,
            Style = SKPaintStyle.Stroke,
            Color = SKColors.Purple,
            StrokeWidth = 1
        };

        var rand = new Random();
        var sw = new Stopwatch();

        sw.Start();

        e.Surface.Canvas.Clear();

        var width = (int)skglControl1.CanvasSize.Width;
        var height = (int)skglControl1.CanvasSize.Height;

        for (int i = 0; i < 1000; i++)
        {
            var x1 = rand.Next(width);
            var x2 = rand.Next(width);
            var y1 = rand.Next(height);
            var y2 = rand.Next(height);

            paintStroke.Color = new SKColor((byte)rand.Next(255), (byte)rand.Next(255), (byte)rand.Next(255));

            e.Surface.Canvas.DrawLine(new SKPoint(x1, y1), new SKPoint(x2, y2), paintStroke);
        }

        sw.Stop();

        Console.WriteLine($"ms: {sw.ElapsedMilliseconds}, w: {width}, h: {height}, pixels: {width * height}");
    }
...