0

0

Avalonia如何使用DrawingContext进行绘制 Avalonia底层绘图API

畫卷琴夢

畫卷琴夢

发布时间:2025-12-27 00:49:07

|

297人浏览过

|

来源于php中文网

原创

Avalonia 使用 DrawingContext 在 OnRender 中进行跨平台高性能 2D 绘制,基于 SkiaSharp 构建向量指令并光栅化;需缓存资源、避免频繁 Push/Pop、原点在左上角且单位为 DIP。

avalonia如何使用drawingcontext进行绘制 avalonia底层绘图api

Avalonia 使用 DrawingContext 进行自定义绘制,主要在控件的 OnRender 方法中完成,其底层基于 SkiaSharp(默认渲染后端),提供跨平台、高性能的 2D 绘图能力。它不是直接操作像素,而是构建绘图指令列表,由 Skia 引擎最终光栅化。

在 OnRender 中获取并使用 DrawingContext

所有继承自 Visual 的类(如 ControlShape、自定义 Panel)均可重写 OnRender 方法:

  • 必须调用基类实现:`base.OnRender(context)` 通常需放在开头,确保子元素正常绘制(除非你完全接管)
  • context 是临时对象:仅在 OnRender 调用期间有效,不可缓存或跨帧复用
  • 坐标系原点在左上角,单位为设备无关像素(DIP),自动适配缩放和高 DPI

常用绘图操作与对应 API

DrawingContext 提供分层绘制能力,常见操作包括:

LuckyCola工具库
LuckyCola工具库

LuckyCola工具库是您工作学习的智能助手,提供一系列AI驱动的工具,旨在为您的生活带来便利与高效。

下载
  • 绘制几何图形:`DrawGeometry(brush, pen, geometry)` —— 支持 RectangleGeometryEllipseGeometryPathGeometry
  • 绘制文本:`DrawText(formattedText, point)` —— 需先用 FormattedText 构建带样式的文本布局
  • 绘制图像:`DrawImage(bitmap, rect, opacity: 1.0)` —— 支持 IBitmap(如 Bitmap 实例)
  • 应用变换:通过 PushTransform + Matrix.CreateScale/Translate/Rotate 实现局部坐标系变换
  • 裁剪区域:`PushClip(geometry)` 限定后续绘制范围,匹配后需 PopClip

性能与注意事项

高效使用 DrawingContext 需注意以下关键点:

  • 避免在 OnRender 中创建资源:如 BrushPenFormattedText 应预先创建并缓存(例如在构造函数或 OnAttachedToVisualTree 中)
  • 减少 Push/Pop 调用次数:每次变换或裁剪都会增加绘制指令开销,尽量合并操作
  • 慎用透明度和混合模式:非 1.0 的 opacity 或自定义 CompositingMode 可能触发离屏渲染,影响性能
  • 不支持即时重绘控制:Avalonia 自动管理渲染时机(脏区检测 + 合成),手动调用 InvalidateVisual() 触发重绘即可

底层渲染链路简述

Avalonia 的绘图流程为:OnRenderDrawingContext 记录指令 → Scene 树收集所有视觉节点的绘制命令 → 渲染线程交由 SkiaRenderer(基于 SkiaSharp)执行光栅化 → 输出到窗口表面。这意味着:

  • 所有 DrawingContext 操作本质是构建向量指令,非立即像素操作
  • 无 Canvas.Children 类似 WPF 的“子元素集合”,绘图完全由代码逻辑驱动
  • 若需更底层控制(如直接 Skia 绘图),可继承 SkiaDrawingContext 或使用 ISkiaGpu,但会失去跨平台抽象层保障

相关文章

Windows激活工具
Windows激活工具

Windows激活工具是正版认证的激活工具,永久激活,一键解决windows许可证即将过期。可激活win7系统、win8.1系统、win10系统、win11系统。下载后先看完视频激活教程,再进行操作,100%激活成功。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

463

2023.08.10

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

497

2023.10.23

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

30

2025.12.25

错误代码dns_probe_possible
错误代码dns_probe_possible

本专题整合了电脑无法打开网页显示错误代码dns_probe_possible解决方法,阅读专题下面的文章了解更多处理方案。

20

2025.12.25

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

37

2025.12.25

word转换成ppt教程大全
word转换成ppt教程大全

本专题整合了word转换成ppt教程,阅读专题下面的文章了解更多详细操作。

6

2025.12.25

msvcp140.dll丢失相关教程
msvcp140.dll丢失相关教程

本专题整合了msvcp140.dll丢失相关解决方法,阅读专题下面的文章了解更多详细操作。

2

2025.12.25

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

6

2025.12.25

微信调黑色模式教程
微信调黑色模式教程

本专题整合了微信调黑色模式教程,阅读下面的文章了解更多详细内容。

5

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 7.4万人学习

CSS3 教程
CSS3 教程

共18课时 | 4万人学习

Vue 教程
Vue 教程

共42课时 | 5.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号