Windows Phone上的WritableBitmap高速绘图

时间:2016-01-25 01:30:12

标签: c# wpf xaml windows-phone-8 windows-phone

我在Windows Phone上试验WritableBitmapEx。我创建了一个简单的例子,一个简单的盒子上下移动。

有一个绘图功能,每帧重绘矩形:

    int y = 0;
    int dy = 15;
    public void draw()
    {
        y += dy;

        if (y > 500 || y < 0)
            dy = -dy;

        writeableBmp.Clear(System.Windows.Media.Colors.Black);
        writeableBmp.FillRectangle(0, y, 100, y + 100, System.Windows.Media.Colors.Green);
    }

Loaded事件,它会创建可写位图,并在每个帧上调用draw()

    WriteableBitmap writeableBmp;
    private async void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
    {
        writeableBmp = BitmapFactory.New((int)ContentPanel.ActualWidth, (int)ContentPanel.ActualHeight);
        image.Source = writeableBmp;
        writeableBmp.GetBitmapContext();
        CompositionTarget.Rendering += CompositionTarget_Rendering;
    }

    private void CompositionTarget_Rendering(object sender, EventArgs e)
    {
        draw();
    }

但这最多只给我~30FPS,所以动画不顺畅。

知道有一些更好的方法可以在xaml中创建这样的动画(例如创建一个矩形对象并使用xaml动画设置动画),但是有一个游戏(用另一种语言) )以这种方式重绘每一帧,我的最终目标是将该代码移植到Windows Phone。因此,找到一种快速重绘的方法可以更轻松地移植

那么,有没有办法提高性能呢?或者有更好的方法手动绘制每个帧,但足够快(60fps)?

2 个答案:

答案 0 :(得分:3)

试用Microsoft Win2D。你可以在这里使用NuGet或他们的GitHub来获取它:Microsoft Win2D GitHub。它基本上是Direct2D的包装器,使用起来非常简单。

功能(复制自:https://github.com/Microsoft/Win2D/wiki/Features

  

易于使用的Windows Runtime API

     

•可从.NET和C ++中获取

     

•支持Windows 10,Windows 8.1和Windows Phone 8.1

     

使用GPU加速的立即模式2D图形渲染

     

•在Direct2D,DirectImage和DirectWrite

之上实现了一个层      

•与基础类型互操作,因此您可以混合使用将Win2D与原生D2D匹配

     

位图图片

     

•加载,保存和绘制位图图像

     

•渲染到纹理

     

•使用位图作为不透明蒙版

     

•用于有效绘制大量位图的Sprite批处理API

     

•使用块压缩位图格式来节省内存

     

•加载,保存和绘制虚拟位图,这些位图可能大于最大GPU纹理大小,并自动拆分为磁贴

     

矢量图形

     

•绘制原始形状(线条,矩形,圆形等)或任意复杂的几何体

     

•使用纯色,图像画笔或线性和径向渐变填充形状

     

•使用灵活的笔触样式(点线,虚线等)绘制任何宽度的线条

     

•高质量抗锯齿

     

•丰富的几何操作(并集,交叉,路径上的计算点,镶嵌等)

     

•将绘图剪辑到任意几何区域

     

•在命令列表中捕获绘图操作以便以后重播

     

•通过手写笔光栅化笔划

     

强大的图像处理效果

     

•变模糊

     

•混合物

     

•颜色调整(亮度,对比度,曝光,高光和阴影等)

     

•过滤器(卷积,边缘检测,浮雕,锐化)

     

•照明

     

•自定义像素着色器

     

•还有更多......

     

文字

     

•完全国际化的Unicode文本呈现

     

•可以根据

绘制,测量或测试文本布局      

•将文本轮廓转换为几何

     

•枚举字体并查询其指标

     

•绘制或操纵单个字形运行以创建自定义文本布局

     

用户界面整合

     

•XAML CanvasControl使其易于启动和运行

     

•还可以创建高级内容,例如所有者绘制XAML控件

     

•XAML CanvasAnimatedControl提供更新/绘制游戏循环编程模型

     

•XAML CanvasVirtualControl用于绘制到非常大的虚拟化曲面

     

•绘制到Windows.UI.Composition绘图曲面和交换链

     

•也可以直接绘制到CoreWindow

     

•打印

答案 1 :(得分:0)

感谢Chubosaurus Software建议使用Microsoft Win2D。

我会更多地解释一下我在案件中所做的事情。

Win2D中有一个名为CanvasAnimatedControl的控件,专门用于此目的。

从NuGet获取包并将其添加到页面后,您可以使用两个事件DrawUpdate

Update表示逻辑,而Draw是您渲染帧的位置。

所以,这是问题中描述的移动矩形的代码:

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        cvs.Update += Cvs_Update;
        cvs.Draw += Cvs_Draw;
    }

    int y = 0;
    int dy = 15;
    private void Cvs_Draw(Microsoft.Graphics.Canvas.UI.Xaml.ICanvasAnimatedControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasAnimatedDrawEventArgs args)
    {
        args.DrawingSession.Clear(Windows.UI.Colors.Blue);
        args.DrawingSession.FillRectangle(new Rect(0, y, 100, 100), Windows.UI.Colors.Green);
    }

    private void Cvs_Update(Microsoft.Graphics.Canvas.UI.Xaml.ICanvasAnimatedControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasAnimatedUpdateEventArgs args)
    {
        y += dy;

        if (y > 500 || y < 0)
            dy = -dy;
    }

此代码在我的手机上运行良好(~60fps)。

唯一的缺点是,Win2D支持Windows Phone 8.1及更高版本。因此,通过使用此库,您将失去与Windows Phone 8的兼容性。