Я только начинаю изучать использование 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 миллиона пикселей (это не ограничение по высоте или ширине, это ограничение по пикселям).
Пример времени рендеринга при медленном расширении окна:
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}");
}