Avalonia 使用 DrawingContext 在 OnRender 中进行跨平台高性能 2D 绘制,基于 SkiaSharp 构建向量指令并光栅化;需缓存资源、避免频繁 Push/Pop、原点在左上角且单位为 DIP。
Avalonia 使用 DrawingContext 进行自定义绘制,主要在控件的 OnRender 方法中完成,其底层基于 SkiaSharp(默认渲染后端),提供跨平台、高性能的 2D 绘图能力。它不是直接操作像素,而是构建绘图指令列表,由 Skia 引擎最终光栅化。
所有继承自 Visual 的类(如 Control、Shape、自定义 Panel)均可重写 OnRender 方法:
OnRender 调用期间有效,不可缓存或跨帧复用DrawingContext 提供分层绘制能力,常见操作包括:
RectangleGeometry、EllipseGeometry、PathGeometry 等FormattedText 构建带样式的文本布局IBitmap(如 Bitmap 实例)PushTransform + Matrix.CreateScale/Translate/Rotate 实现局部坐标系变换PopClip
高效使用 DrawingContext 需注意以下关键点:
Brush、Pen、FormattedText 应预先创建并缓存(例如在构造函数或 OnAttachedToVisualTree 中)opacity 或自定义 CompositingMode 可能触发离屏渲染,影响性能InvalidateVisual() 触发重绘即可Avalonia 的绘图流程为:OnRender → DrawingContext 记录指令 → Scene 树收集所有视觉节点的绘制命令 → 渲染线程交由 SkiaRenderer(基于 SkiaSharp
)执行光栅化 → 输出到窗口表面。这意味着:
DrawingContext 操作本质是构建向量指令,非立即像素操作SkiaDrawingContext 或使用 ISkiaGpu,但会失去跨平台抽象层保障