간단히 성능을 테스트해보았습니다.
public class DrawningCanvas : Canvas
{
private static readonly Pen _pen;
static DrawningCanvas()
{
_pen = new Pen(Brushes.Red, 1);
_pen.Freeze();
}
public DrawningCanvas()
{
_ = Task.Run(async () =>
{
var timer = new PeriodicTimer(TimeSpan.FromMilliseconds(150));
while (await timer.WaitForNextTickAsync())
{
await Dispatcher.InvokeAsync(InvalidateVisual);
}
});
}
protected override void OnRender(DrawingContext dc)
{
var rand = Random.Shared;
var count = 3800;
for (var i = 0; i < count; i++)
{
dc.DrawEllipse(Brushes.Red, _pen, new Point(rand.Next((int)ActualWidth), rand.Next((int)ActualHeight)), 3, 3);
}
}
}
<Window
x:Class="WpfApp38.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp38"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<local:DrawningCanvas x:Name="canvas" />
</Window>
제 컴퓨터에서는 무리 없이 동작하는군요.
참고로 사용하는 Brush나 Pen의 Freeze()
유무에 따라 성능 차이가 많이 납니다.