如何提高使用 SkiaSharp 绘制大多边形的性能?

Posted

技术标签:

【中文标题】如何提高使用 SkiaSharp 绘制大多边形的性能?【英文标题】:How to improve the performance of drawing a large polygon using SkiaSharp? 【发布时间】:2020-05-07 02:36:32 【问题描述】:

我正在使用SkiSharp 绘制一个包含大约 20,000 个点的轮廓。这有点慢(200 毫秒),我想知道是否可以对我的代码进行任何性能改进:

var path = new SKPath();
path.AddPoly(contour.Select(p => p.ToSKPoint()).ToArray());  // contour is Point[]
canvas.DrawPath(path, paint);

当我的视图被缩小时,甚至可能看不到那么多点,所以我想到的一种可能的优化是统一过滤掉点(比如每 10 或 100 个点只保留一个)。

【问题讨论】:

肯定会减少数据量 - 您可以使用一些平滑算法,但我建议您从消除 90% 的数据开始,看看它如何改变性能 @Jason 减少点数肯定有帮助,所以当用户缩小(并且无法注意到缺失的点)时,也许我可以这样做。然而,当放大时,我想显示每一点。我注意到,当放大时,性能再次提高(因为只需要绘制点的子集)。 @redcurry 在电子游戏中被称为细节层次 (LOD)。问题非常相似,远处的几何体不需要像近处那样详细。愿你找到一些可能有帮助的想法。如果您找到了解决方案,请回答您自己的问题,以便其他人可以从中受益。 【参考方案1】:

通过使用 SKGLView 而不是 SKCanvasView,我将渲染时间从 6 毫秒缩短到了 1 毫秒。 它们具有相同的 API,并且非常易于交换。

另外,就像您所说的那样,根据缩放级别动态减少点数。又名 LOD - 细节级别。

如果可行,请禁用 AntiAliasing。

【讨论】:

【参考方案2】:

尝试只创建一次SKPath,然后一次又一次地使用它。这可能会有所帮助。

【讨论】:

以上是关于如何提高使用 SkiaSharp 绘制大多边形的性能?的主要内容,如果未能解决你的问题,请参考以下文章

SkiaSharp 不使用 StrokeAndFill 填充三角形

SkiaSharp ConicTo 方法不绘制曲线

来自 URL 的 Skiasharp 贷款图像并在 Xamarin 表单中的 Canvas 上绘制

Xamarin.Forms - SkiaSharp 在后台线程中绘图

在 WPF 中使用 SkiaSharp 模糊文本

SkiaSharp 之 WPF 自绘时钟(案例版)