如何提高使用 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 填充三角形
来自 URL 的 Skiasharp 贷款图像并在 Xamarin 表单中的 Canvas 上绘制