WriteableBitmapEx的性能表现

3

我正在生成一个带有大约37000个标记的全屏图像。为此,我使用以下代码:

    private void DrawMarkers(WriteableBitmap bitmap)
    {

            WriteableBitmap marker = BitmapFactory.New(5, 5);
            var sourceRect = new Rect(0, 0, 5, 5);
            marker.DrawEllipseCentered(3, 3, 2, 2, Colors.Blue);
            var s = Stopwatch.StartNew();
            foreach (var point in TransformedPoints)
            {
                bitmap.Blit(new Rect((int)point.X, (int)point.Y, 5, 5), marker, sourceRect);
            }
            s.Stop();
            Console.WriteLine("Blitting " + 
                 TransformedPoints.Count + 
                 " Points took " + 
                 s.ElapsedMilliseconds + " ms");

    }

在我的EliteBook 8770w Windows7上,绘制这37000个点大约需要203毫秒。我已经从使用标准的WPF框架元素转向使用DrawingVisuals和可写位图。我需要对这组标记进行实时缩放,因此需要重新绘制标记。我认为需要约50毫秒才能重新绘制,以便其正常工作。
据我所知,WriteableBitmap是我可以使用的最低级别。在性能改进方面,我该采取哪些措施?似乎需要将这项任务委托给GPU。我应该如何在C#中执行此操作,或者应该使用哪些库?
1个回答

3

一个很大的改进是利用位图上下文的概念,这样就不需要一直锁定和解锁,并避免过多的像素复制。

using (marker.GetBitmapContext(ReadWriteMode.ReadOnly))
{
    using(bitmap.GetContext())
    {    
        foreach (var point in TransformedPoints)
        {
            bitmap.Blit(new Rect((int)point.X, (int)point.Y, 5, 5), marker, sourceRect);
        }
    }
}

如果您不需要透明度混合,则应提供BlendMode.None:

bitmap.Blit(new Rect((int)point.X, (int)point.Y, 5, 5), marker, sourceRect, BlendMode.None);
  • 雷恩

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接