这个的延伸question https://forums.xamarin.com/discussion/99300/is-there-a-way-to-access-a-sksurface-outside-of-the-paintsurface-event。我在用着SkiaSharp
绘制形状OpenGL
。大多数 WPF 代码示例建议使用SKElement
控制并获取内部绘图表面的参考PaintSurface
事件。我一直需要参考绘图表面,而不仅仅是在这个事件中,所以我正在使用SKBitmap
and SKCanvas
并将输出发送到Image
WPF 中的控制。
XAML
<Canvas x:Name="ScreenControl" />
CS
var bmp = new SKBitmap((int)ScreenControl.ActualWidth, (int)ScreenControl.ActualHeight);
var canvas = new SKCanvas(bmp);
var image = new Image
{
Stretch = Stretch.Fill
};
canvas.DrawText("Demo", new SKPoint(20, 20), new SKPaint { TextSize = 20 });
var index = 0;
var clock = new Timer();
var wrt = bmp.ToWriteableBitmap();
image.Source = wrt;
clock.Interval = 100;
clock.Elapsed += (object sender, ElapsedEventArgs e) =>
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
var wrt = bmp.ToWriteableBitmap(); // Potentially slow line #1
canvas.Clear();
canvas.DrawText((index++).ToString(), new SKPoint(20, 20), new SKPaint { TextSize = 20 });
image.Source = wrt; // Potentially slow line #2
image.InvalidateVisual();
}));
};
clock.Start();
ScreenControl.Children.Clear();
ScreenControl.Children.Add(image);
Project
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net5.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SkiaSharp.Views.WPF" Version="2.80.3-preview.18" />
</ItemGroup>
</Project>
Question
有没有一种方法可以更快地绘制,特别是无需重新创建位图bmp.ToWriteableBitmap()
并且无需每次都更改图像源image.Source = wrt
?后台缓冲区或相关的东西?