Я провел некоторое время, играя с Win2D сегодня.
Я следую инструкциям в Readme.md этой страницы, в основном просто устанавливаю пакет NuGet и добавляю несколько строк кода, и затем он начинает работать, аккуратно!
Что ядействительно интересует то, что Win2D
, который является «оберткой» для C # / XAML для Direct2D
, использует «аппаратное ускорение», которого нет в старой простой System.Drawing/GDI+
, страница Википедии для Direct2D
утверждает, что прирост производительности довольносущественный.
Итак, я пишу две функции для рисования 3000 эллипсов на Win2D CanvasControl
и простой Canvas
соответственно.В моем тесте время, занятое canvasControl_Draw
, меньше, чем время, затраченное Canvas_Loaded
, примерно на 20% -50%.
Мои вопросы:
Правильно ли настроен тест?Я даже не уверен, сравниваю ли я Win2D/Direct2D
с System.Drawing/GDI+
или сравниваю что-то еще. Я не знаю, если рисование на простой Canvas
уже Direct2D
.
Есть ли какая-нибудь простая в настройке тест, которая может очистить, демонстрирует, что 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}");
}