首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows上的WritableBitmap高速绘图

Windows上的WritableBitmap高速绘图
EN

Stack Overflow用户
提问于 2016-01-25 01:30:12
回答 2查看 590关注 0票数 2

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

有一个绘图函数,它重新绘制每个框的矩形:

代码语言:javascript
复制
    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()

代码语言:javascript
复制
    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();
    }

但这给我的~30 not最多,所以动画是不顺利的。

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

那么,有什么方法可以提高这方面的性能吗?或者是否有更好的方法手动绘制每个帧,但足够快(60 fast )?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-26 00:51:38

尝试一下微软的Win2D。您可以在这里使用NuGet或他们的GitHub获得它:微软Win2D GitHub。它基本上是Direct2D上的一个包装器,使用起来非常简单。

特性(从:https://github.com/Microsoft/Win2D/wiki/Features复制)

易于使用的Windows ·可从.NET和C++获得 ·支持Windows 10、Windows 8.1和Windows Phone 8.1 基于GPU加速的即时二维图形绘制 ·作为Direct2D、DirectImage和DirectWrite之上的一个层实现 ·基础类型的互操作,因此可以将Win2D与本机D2D混合和匹配 位图图形 ·加载、保存和绘制位图图像 ·渲染到纹理 ·使用位图作为不透明掩码 ·Sprite批处理API,用于高效绘制大量位图 ·使用块压缩位图格式来节省内存 ·加载、保存和绘制虚拟位图,它们可以大于最大GPU纹理大小,并自动分割成块 矢量图形 绘制原始形状(线条、矩形、圆圈等)或任意复几何 ·使用实色、图像笔刷或直线和径向梯度填充形状 ·用灵活的笔画方式(虚线、虚线等)绘制任意宽度的线条。 ·高质量的抗混叠 丰富的几何操作(联合、相交、路径上的计算点、卫星等) *任意几何区域的剪贴画 在命令列表中捕获绘图操作,供以后重放 ·将墨水笔画(从手写笔)拉近 强大的图像处理效果 ·模糊 ·共混 ·颜色调整(亮度、对比度、曝光、高光和阴影等) ·过滤器(旋转、边缘检测、浮雕、锐化) ·照明 ·自定义像素着色器 还有更多..。 文本 ·完全国际化的Unicode文本呈现 ·文本布局可以绘制、测量或命中测试。 ·将文本轮廓转换为几何图形 ·枚举字体并查询它们的指标 ·绘制或操作单个字形运行以创建自定义文本布局 UI集成 ·XAML CanvasControl使起床和运行变得更容易 ·还可以创建高级的东西,比如所有者-绘制XAML控件 ·XAML CanvasAnimatedControl提供更新/绘制游戏循环编程模型 ·XAML CanvasVirtualControl用于绘制到非常大的虚拟曲面 ·绘制到Windows.UI.Composition绘图表面和交换链上 ·还可以直接绘制到CoreWindow ·印刷

票数 3
EN

Stack Overflow用户

发布于 2016-01-28 08:08:06

感谢鱼龙软件,他建议微软Win2D。

我要解释一下我在我的案子里做了些什么。

CanvasAnimatedControl中有一个名为Win2D的控件,它是为此目的而专门设计的。

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

Update表示逻辑,而Draw是渲染框架的地方。

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

代码语言:javascript
复制
    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;
    }

这段代码在我的手机上运行得很好(~60 This )。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34983803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档