在 C# 中绘制椭圆的最快方法

Fastest way to draw ellipse in c#

我需要在二维位图上绘制很多小椭圆 (c. 60 000)。根据我的经验,事实证明 GDI+ 或 NGraphics 对于此类任务非常慢。我希望能够达到至少 10 fps,这似乎不太雄心勃勃,但我不知道如何实现。

由于视频游戏非常有效地执行此类操作,我很想认为这是硬件加速的问题。但我在另一个问题中看到 GDI+ 应该是 2D 加速的,所以也许还有其他我没有得到的东西。

我的问题不是关于闪烁或双缓冲。这实际上是一个纯粹速度的问题:在位图上绘制简单形状(像素、线条、椭圆)的最快方法是什么。

在 GDI 中,最快的方法 是在其上获得 Graphics object (e.g. within the OnPaint() method) and call e.g. DrawEllipse()

但是你必须检查自己是否可能不是所有的都可见并跳过这些。您也可以尝试通过设置图形对象的 CompositingQuality, InterpolationMode, PixelOffsetMode and SmoothingMode 来调整性能。

但也许使用 WPF、OpenGL 或 DirectX 等不同的技术会更有意义。也许甚至切换到 Unity 也是一种选择。但那是完全不同的故事。

您可以试试 OpenTK。它使用 OpenGL,速度非常快。如果需要,您可以获得绘图操作的结果并将其转换回位图。

您可以尝试使用 SkiaSharp,它比 GDI+ 更快,但我不知道它是否可以处理 600K lines/s。

迅捷

Skia 的 C# / .Net 包装器

SkiaSharp 文档 SkiaSharp managed by "Xamarin/Microsoft"

Skia 库的文档skia.org

使用 SkiaSharp

  1. 添加 NuGet 包SkiaSharp
  2. 添加using SkiaSharp;
  3. 画画Ellipse/ovalcanvas.DrawOval ( cx, cy, rx, ry, paint)

绘制椭圆的代码:

using (var surface = SKSurface.Create (width: 640, height: 480, SKImageInfo.PlatformColorType, SKAlphaType.Premul)) {
    SKCanvas canvas = surface.Canvas;

    SKPaint paint = new SKPaint
    {
        Style = SKPaintStyle.Stroke,
        Color = Color.Red.ToSKColor(),
        StrokeWidth = 10
    };
    canvas.DrawOval ( cx,  cy,  rx,  ry, paint)
}

参数: cx 中心 x 坐标。

cy中心y坐标。

rx椭圆的垂直半径。

ry椭圆的水平半径。

paint绘制椭圆时使用的颜料。