微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在不使用 PaintSurface 事件的情况下在 SkiaSharp 中绘制的最有效方法

如何解决在不使用 PaintSurface 事件的情况下在 SkiaSharp 中绘制的最有效方法

question 的扩展。我正在使用 SkiaSharpOpenGL 绘制形状。 WPF 的大多数代码示例都建议使用 SKElement 控件并获取PaintSurface 事件内的绘图表面的引用。我需要始终引用绘图表面,而不仅仅是在此事件内部,因此我使用 SKBitmapSKCanvas 并将输出发送到 WPF 中的 Image 控件。

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 SKPaint { TextSize = 20 });
    image.source = wrt;                // Potentially slow line #2
    image.InvalidateVisual();
  }));
};
clock.Start();

ScreenControl.Children.Clear();
ScreenControl.Children.Add(image);

项目

<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>

问题

有没有一种方法可以更快地绘制,特别是无需重新创建位图 bmp.ToWriteableBitmap() 并且无需每次 image.source = wrt 都更改图像源?后台缓冲区或相关的东西?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。