项目背景与演进
当前 PC 客户端开发主要依赖 .NET 官方框架(WinForms/WPF/MAUI)、开源跨平台方案(Avalonia)或 Web 套壳技术(Electron/Tauri)。大多数开发者选择在这些成熟框架之上进行二次封装,但真正愿意从源头全链路自研一套 UI 引擎的并不多。
本项目历时 6 年,历经多次架构重构,最终定型为基于 GLFW + SkiaSharp 的纯 C# 用户态跨平台 UI 引擎。设计融合了 Android View 绘制流程、Jetpack Compose 函数式组合编程以及 Flutter 渲染优化理念,形成渲染管线、视图布局、动画调度、虚拟滚动等全链路闭环。
核心设计理念
框架追求极简与高效,摒弃 XML 配置和重量级组件:
- 单线程架构:配合对象复用机制,大幅降低 GC 压力。
- 无冗余设计:元素结构精简,内存占用极低。
- 函数式组合:状态驱动界面重组,组件树一次声明多处复用。
- 原子化组件:只提供最基础的 Text/Input/Icon 等,复杂组件通过积木式组合实现。
相比传统方案,本引擎回归原生渲染本质,全程无黑盒、无浏览器内核,可直接对接底层 Skia 生成绘制指令并提交 GPU 执行。
性能与特性
- 纯 C# 用户态实现,Release 核心 DLL 小于 200KB。
- 支持.NET8 AOT 原生发布,已验证 Windows / Ubuntu / macOS。
- 自研无 Timer 高性能动画系统,支持脏矩形局部刷新。
- 底层对象池复用 SKPaint/SKFont/SKBitmap。
- 百万级数据列表稳定运行在 60fps+。
代码示例
采用函数组合式 API,通过状态对象驱动界面重组。以下是一个包含响应式计数器和旋转动画的示例:
ContentView(() => {
Column(() => {
var counterNum = StateValueOf(0);
Text()
.H3()
.Binding(counterNum, (builder, num) => {
builder.TextValue($"计数器:{num}");
}, true);
var visibleState = StateValueOf(true);
var animateValue = AnimateFloatOf(visibleState, animate => {
animate.Duration = 800;
animate.Times = int.MaxValue;
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);
});


