Бенчмарк Win2D в UWP - PullRequest
       55

Бенчмарк Win2D в UWP

0 голосов
/ 22 октября 2018

Я провел некоторое время, играя с Win2D сегодня.

Я следую инструкциям в Readme.md этой страницы, в основном просто устанавливаю пакет NuGet и добавляю несколько строк кода, и затем он начинает работать, аккуратно!

Что ядействительно интересует то, что Win2D, который является «оберткой» для C # / XAML для Direct2D, использует «аппаратное ускорение», которого нет в старой простой System.Drawing/GDI+, страница Википедии для Direct2D утверждает, что прирост производительности довольносущественный.

Итак, я пишу две функции для рисования 3000 эллипсов на Win2D CanvasControl и простой Canvas соответственно.В моем тесте время, занятое canvasControl_Draw, меньше, чем время, затраченное Canvas_Loaded, примерно на 20% -50%.

Мои вопросы:

  1. Правильно ли настроен тест?Я даже не уверен, сравниваю ли я Win2D/Direct2D с System.Drawing/GDI+ или сравниваю что-то еще. Я не знаю, если рисование на простой Canvas уже Direct2D.

  2. Есть ли какая-нибудь простая в настройке тест, которая может очистить, демонстрирует, что Win2Dнамного эффективнее, чем, скажем, GDI +?

XAML

 <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <!--xmlns:canvas="using:Microsoft.Graphics.Canvas.UI.Xaml"-->
    <canvas:CanvasControl 
        ClearColor="CornflowerBlue" 
        Draw="canvasControl_Draw" />

    <Canvas Grid.Column="1" 
            x:Name="canvas" 
            Loaded="Canvas_Loaded" />   
</Grid>

Код позади

private void Canvas_Loaded(object sender, RoutedEventArgs e)
{
    var watch = System.Diagnostics.Stopwatch.StartNew();
    Random r = new Random();

    var stroke = new SolidColorBrush(Colors.Black);
    for (int i = 0; i < 3000; i++)
    {
        var ellipse = new Ellipse()
        {
            Stroke = stroke,
            StrokeThickness = 3,
            Width = r.Next(1, 200),
            Height = r.Next(1, 100)
        };
        ellipse.SetValue(Canvas.LeftProperty, r.Next(1, 600));
        ellipse.SetValue(Canvas.TopProperty, r.Next(1, 800));
        canvas.Children.Add(ellipse);
    }
    System.Diagnostics.Debug.WriteLine($"Canvas_Loaded end at {watch.ElapsedMilliseconds}");
}

private void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
    var watch = System.Diagnostics.Stopwatch.StartNew();
    Random r = new Random();
    for (int i = 0; i < 3000; i++)
    {
        args.DrawingSession.DrawEllipse(r.Next(1, 600), r.Next(1, 800), r.Next(1, 200), r.Next(1, 100), Colors.Black, 3);                
    }

    System.Diagnostics.Debug.WriteLine($"canvasControl_Draw end at {watch.ElapsedMilliseconds}");
}
...