Avalonia如何实现离屏渲染功能?
摘要:title: Avalonia 实现离屏渲染能力 description: 本文将告诉大家如何在 Avalonia 实现跨平台的离屏渲染能力 tags: Avalonia category: 我的需求是拿 Avalonia 当成一些图形画面
我的需求是拿 Avalonia 当成一些图形画面渲染的框架,准备在 Linux 和 Windows 设备上使用。刚好 Avalonia 做好了图形画面渲染的平台隔离能力,再有提供类 WPF 的布局方式,可以让我制作一些精妙的界面内容
我开始在 GitHub 上搜到 https://github.com/AvaloniaUI/Avalonia/issues/2174 这个帖子,一开始我按照 @maxkatz6 介绍的方法,顺利地在 Windows 上使用了 EmbeddableControlRoot 进行离屏渲染
然而以上方法在 Linux 上将会抛出 NotSupportedException 异常,导致完全不可用
我仔细阅读了 https://github.com/AvaloniaUI/Avalonia/issues/2174 这个帖子,按照 @kekekeks 提供的方法,尝试自己实现 ITopLevelImpl 接口的方式实现了在 Linux 上也能支持离屏渲染能力
实现的做法如下:如 @kekekeks 所教的方法,咱需要先在 csproj 项目文件里面使用 <AvaloniaAccessUnstablePrivateApis>true</AvaloniaAccessUnstablePrivateApis> 用于解决构建问题。随后编写一个名为 OffscreenTopLevelImpl 的类型,继承自 Avalonia.Controls.Embedding.Offscreen.OffscreenTopLevelImplBase 类型,其代码如下
class OffscreenTopLevelImpl : OffscreenTopLevelImplBase, ITopLevelImpl
{
public override IEnumerable<object> Surfaces { get; } = [];
public override IMouseDevice MouseDevice { get; } = new MouseDevice();
}
最后将以上定义的 OffscreenTopLevelImpl 放入到 EmbeddableControlRoot 的构造函数里。
