c# - 绘制矩形 WP8.1 异步(或快速)

标签 c# asynchronous windows-phone-8.1 writeablebitmap

我正在尝试将矩形绘制到 WriteableBitmap 中,不幸的是,提供 Fill* 扩展的 WriteableBitmapEx 太慢并且只能在主线程中运行。

我正在寻找特定于 WP8.1 的替代方案,但目前还不知道最佳解决方案。

我需要一种异步绘制矩形的方法,一种方法是在 MainWindow 上创建一个 Canvas 并在其上添加 xaml.Rectangles,这几乎可以用作问题的解决方案,但我想在WriteableBitmap 而不是创建大量 UIElement 并将所有元素添加到屏幕上。

抱歉,如果可以在互联网上找到任何给定的解决方案,我几乎找不到任何关于 C# 的内容。

我做的一个测试:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        var container = new Canvas()
        {
            Width = 300,
            Height = 500
        };

        var winImage = new Image()
        {
            Width = 300,
            Height = 500
        };
        container.Children.Add(winImage);

        //var winImage = imageView.NativeView<Image>();
        var img = new WriteableBitmap((int)winImage.Width, (int)winImage.Height);

        var clr = Color.FromArgb(255, 0, 0, 255);


        var start = DateTime.Now;
        var random = new Random();

        for (int i = 0; i < 50; i++)
        {
            //var color = Color.FromArgb(255, (byte)random.Next(255), (byte)random.Next(255), (byte)random.Next(255));
            img.FillRectangle(i * 2, i * 2, i * 2 + 10, i * 2 + 10, clr);
        }
        Debug.WriteLine((DateTime.Now - start).TotalMilliseconds + "ms drawing");

        winImage.Source = img;

        Content = container;
    }

这会导致在诺基亚 Lumia 1020 上以 Debug模式运行“792.1397 毫秒绘图”,这非常慢。

最佳答案

使用 GetBitmapContext()应该会快很多。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var container = new Canvas()
    {
        Width = 300,
        Height = 500
    };

    var winImage = new Image()
    {
        Width = 300,
        Height = 500
    };
    container.Children.Add(winImage);

    var img = BitmapFactory.New((int)winImage.Width, (int)winImage.Height); 
    winImage.Source = img;
    Content = container;

    var clr = Color.FromArgb(255, 0, 0, 255);
    var random = new Random();

    var sw = new Stopwatch();
    sw.Start();

    using (img.GetBitmapContext()) {
        img.Clear(Colors.White);
        for (var x = 0; x < 10; x++) {
          for (var y = 0; y < 10; y++) {
            img.FillRectangle(x * 10, y * 10, x * 10 + 10, y * 10 + 10, clr); 
          }
        }
    }

    sw.Stop();

    Debug.WriteLine(sw.ElapsedMilliseconds + "ms drawing");
}

关于c# - 绘制矩形 WP8.1 异步(或快速),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33267510/

相关文章:

c# - 如何找到集合的所有分区

c# - 获取实现类型的具体属性

.net - MailboxProcessor 在 Finalize 期间崩溃

javascript - 在 JavaScript 中的异步函数末尾运行同步函数?

c# - "winmdexp.exe"退出,代码为 -532462766

c# - Windows Phone 8.1 将文本复制到剪贴板

c# - windows phone 8.1 swype 键盘事件捕获

c# - 线程和 IEnumerable; "Collection Was Modified"- 异常

c# - .NET 函数中的线程永远不会返回

c# - Function 还是 async 可以细化吗?