绘制矩形 WP8.1 异步(或快速)
Draw rectangle WP8.1 async (or fast)
我正在尝试将矩形绘制到 WriteableBitmap 中,不幸的是,提供 Fill* 扩展的 WriteableBitmapEx 太慢并且只能在主线程中 运行。
我正在寻找特定于 WP8.1 的替代方案,目前还不知道最佳解决方案。
我需要一种异步绘制矩形的方法,一种方法是在主窗口创建一个 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;
}
这会导致“792.1397 毫秒绘图”运行在诺基亚 Lumia 1020 的调试模式下,这非常慢。
使用 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");
}
我正在尝试将矩形绘制到 WriteableBitmap 中,不幸的是,提供 Fill* 扩展的 WriteableBitmapEx 太慢并且只能在主线程中 运行。
我正在寻找特定于 WP8.1 的替代方案,目前还不知道最佳解决方案。
我需要一种异步绘制矩形的方法,一种方法是在主窗口创建一个 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;
}
这会导致“792.1397 毫秒绘图”运行在诺基亚 Lumia 1020 的调试模式下,这非常慢。
使用 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");
}