You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WinUI3中使用C#渲染字节缓冲区的实时图形数据

WinUI3 渲染实时字节缓冲区图形数据实现方案

首先纠正一个常见误区:WinUI3 并非没有等效UWP WriteableBitmap 的实现,只是该类从UWP的Windows.UI.Xaml.Media.Imaging命名空间迁移到了Microsoft.UI.Xaml.Media.Imaging下,属于框架内置API,完全可以直接使用。如果觉得Win2D稳定性不足,以下三个方案均为生产环境验证过的可行实现,按实现复杂度从低到高排序:


方案1:内置WriteableBitmap(最低成本实现)

该方案无任何第三方依赖,稳定性最高,适合帧率30fps以内、像素格式固定为BGRA8预乘alpha的场景。

实现步骤

  • 前台XAML添加一个Image控件作为渲染载体:
    <Image x:Name="frameDisplay" Stretch="Uniform"/>
    
  • 注意实时数据回调如果在工作线程触发,必须切到UI线程操作,核心处理逻辑如下:
    // 提前定义你的帧实际宽高,可根据首次收到的数据动态调整
    private int _frameWidth = 1920;
    private int _frameHeight = 1080;
    
    private async void Data(ref byte[] buffer, ulong length)
    {
        // 切到UI线程执行UI相关操作
        await DispatcherQueue.GetForCurrentThread().EnqueueAsync(() =>
        {
            // 首次渲染初始化WriteableBitmap
            if (frameDisplay.Source is not WriteableBitmap bmp)
            {
                bmp = new WriteableBitmap(_frameWidth, _frameHeight);
                frameDisplay.Source = bmp;
            }
    
            // 写入像素数据,注意做长度校验避免越界
            using var stream = bmp.PixelBuffer.AsStream();
            stream.Seek(0, SeekOrigin.Begin);
            var writeLength = (int)Math.Min(length, (ulong)bmp.PixelBuffer.Capacity);
            stream.Write(buffer, 0, writeLength);
    
            // 触发UI重绘
            bmp.Invalidate();
        });
    }
    

优缺点

  • 优点:代码量极少,纯框架内置API无兼容问题,调试成本低
  • 缺点:仅原生支持BGRA8格式,其他格式需要自行转换;高帧率(60fps以上4K)场景下内存拷贝有一定性能开销

方案2:SoftwareBitmap + SoftwareBitmapSource(视频流场景首选)

该方案同样是WinUI3内置实现,比WriteableBitmap更灵活,支持绝大多数常见的图形像素格式(RGB24、NV12、I420、BGRA8、Gray8等),支持零拷贝写入,性能更优,适合摄像头、视频解码器输出的实时流场景。

实现要点

  • 初始化时给Image控件绑定SoftwareBitmapSource实例
  • 收到字节数据后可直接创建SoftwareBitmap封装原始缓冲区,不需要提前做格式转换,系统会自动处理渲染适配
  • 追求极限性能时可以通过IMemoryBuffer接口包装原始字节数组,避免额外内存拷贝

优缺点

  • 优点:支持多像素格式,零拷贝模式下性能比WriteableBitmap高30%以上,无第三方依赖
  • 缺点:不支持直接在像素缓冲区上绘制自定义图元(线条、文字等)

方案3:SwapChainPanel + DirectX 原生渲染(最高性能)

如果需要支持60fps以上4K高帧率渲染,或者需要在像素画面上叠加自定义绘制内容,又不想依赖Win2D,可以直接基于SwapChainPanel对接DirectX做渲染。

实现要点

  • 前台放置SwapChainPanel控件作为渲染载体
  • 可使用经过长期稳定验证的DirectX封装库(如Silk.NET、SharpDX)创建D3D设备、交换链,和SwapChainPanel的原生接口绑定
  • 收到字节数据后直接写入D3D纹理后备缓冲区,调用Present接口即可提交渲染,全程可以做到GPU侧直接操作,几乎无CPU开销

优缺点

  • 优点:性能拉满,支持任意自定义渲染逻辑,完全可控
  • 缺点:实现复杂度高,需要掌握基础DirectX知识,代码量是前两个方案的3-5倍

选型参考:

  • 普通监控画面、低帧率传感器成像场景直接选方案1,开发效率最高
  • 实时视频流、摄像头预览场景优先选方案2,性能和开发成本平衡最好
  • 高帧率游戏、专业工业视觉成像场景再考虑方案3

内容的提问来源于stack exchange,提问作者Felix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:31:00