纯 C# 全自研轻量 UI 引擎|内核 < 200KB + .NET8 AOT 跨平台 + 百万数据 60fps
本文介绍一款纯 C# 用户态跨平台 UI 引擎。
引擎的演进之路:从 WinForms + GDI 起步 → 多次架构重构 → 最终定型 GLFW + SkiaSharp,深度融合业界三大核心思想:
- Android View 绘制流程
- Jetpack Compose 函数式组合编程
- Flutter 渲染优化理念
当前 PC 客户端开发,大多基于以下技术体系: • .NET 官方框架:WinForms / WPF / WinUI / .NET MAUI • 开源跨平台方案:Avalonia • Web 套壳技术:Electron / Tauri • C++ 原生框架:Qt
绝大多数开发者与企业,都选择在这些成熟框架之上做二次封装、组件扩展,以此快速实现业务需求。但真正愿意从源头开始,全链路自研一整套 UI 引擎的开发者少之又少。
该引擎从 0 到 1 完全自研:渲染管线、视图布局系统、动画调度、虚拟滚动、事件分发、主题体系、状态管理,全部自主实现,形成全链路闭环。可满足 90% 以上的桌面客户端 UI 需求,复杂绘图可直接对接底层 Skia 渲染,生成绘制指令并提交 GPU 执行。
框架设计追求极简与高效: • 单线程架构 + 对象复用机制,大幅降低 GC 压力 • 元素结构无冗余设计,内存占用极低 • 函数式组合编程 + 状态驱动界面重组 • 组件树一次声明、多处复用 • 业务逻辑与 UI 结构高度内聚,不分散 • 思想贴近 React / Flutter / Jetpack Compose,现代前端/移动端开发者可快速上手
与传统 XML、重量级框架不同,本引擎坚持小而精的设计理念:只提供最基础的原子组件,所有复杂组件(DataGrid、TreeView、图表、卡片等)均通过基础组件积木式组合实现。框架不提供冗余、不内置臃肿组件,保持最轻量、最灵活、最可定制的核心优势。
全程无黑盒、无深度封装、无 Web 套壳、无浏览器内核,回归原生渲染本质。
引擎开发历程
从最初基于 WinForms + GDI 摸索渲染与布局,到中间数次因性能、架构、扩展性不足彻底推翻重构,再到最终选择 GLFW + SkiaSharp 构建跨平台渲染底座,6 年间不断打磨架构、优化渲染、精简内核。
最终沉淀出这套:极轻量、高性能、跨平台、纯 C# 用户态的 UI 引擎。每一行核心代码都经过反复推敲与验证。
引擎核心亮点
- 纯 C# 用户态实现,Release 核心 DLL < 200KB
- 函数组合式 API + 状态对象驱动界面重组
- 自研无 Timer 高性能动画系统
- 完整 View 布局系统:Row/Column/Flow/ 虚拟滚动容器
- 百万级数据列表轻松稳定 60fps+
- 自研渲染管线 + 脏矩形局部刷新
- 底层对象池复用:SKPaint/SKFont/SKBitmap 全复用
- 窗口对接 Silk.NET.GLFW,渲染基于 SkiaSharp
- 支持 .NET8 AOT 原生发布
- 已验证:Windows / Ubuntu,macOS 理论 100% 支持
- 插拔式架构,可快速对接其他平台与渲染器
基础组件 & 扩展能力
内置基础组件:Text/Input/Icon/Row/Column/Flow/LazyRow/LazyColumn/LazyGrid/PopupCard
复杂组件如 DataGrid、TreeView、图表等,均可通过基础组件积木式组合实现,无需重写底层。
功能演示
- 百万数据高性能虚拟滚动列表
- 仿微信 PC 端主界面
- 饼图 / 柱状图 / 折线图 / 仪表盘
[图片]
[图片]
[图片]
[图片]
极简示例代码
ContentView(() => { // 垂直布局 Column(() => { // 响应式状态 var counterNum = StateValueOf(0); Text() .H3() .Binding(counterNum, (builder, num) => { builder.TextValue($"计数器:{num}"); }, true); // 无 Timer 循环动画 var visibleState = StateValueOf(true); var animateValue = AnimateFloatOf(visibleState, animate => { animate.Duration = 800; animate.Times = int.MaxValue; animate.Delay = 200; animate.Interpolator = XAnimationInterpolator.Uniform; }); Icon(SvgResources.CircleProgress) .Size(32) .Binding(animateValue, (builder, value) => builder.Rotate(value * 360) ); // 点击交互 Text("点击增加计数") .PrimaryButton() .Click(() => counterNum.Value++); }) .Size(WRAP) .Space(10); });


