【问题标题】:Fastest way to draw ellipse in c#在c#中绘制椭圆的最快方法
【发布时间】:2016-04-10 09:59:00
【问题描述】:

我需要在 2D 位图上绘制很多小椭圆(c. 60 000)。根据我的经验,GDI+ 或 NGraphics 被证明对于这类任务非常慢。我希望能够达到至少 10 fps,这似乎并没有太大的野心,但我不知道如何。

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

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

【问题讨论】:

  • 你说的是每秒 60k * 10 帧 = 600k 椭圆吗?尝试使用 WPF,它将利用 DirectX..
  • 是的,我说的是每秒 60 万个椭圆。这就是为什么我认为我需要使用 GPU 来完成这项任务,所以 DirectX 是一个好主意。谢谢
  • wpf 无法做到这一点,因为开销太大。它是直接加速的,但 cpu 仍然可以完成大部分工作。

标签: c# graphics gdi+ gdi hardware-acceleration


【解决方案1】:

在 GDI 中,最快的方法是获取 Graphics 对象(例如在 OnPaint() 方法中)并调用例如DrawEllipse()就可以了。

但是您必须检查自己是否可能并非所有这些都可见并跳过这些。您也可以尝试通过设置图形对象的CompositingQualityInterpolationModePixelOffsetModeSmoothingMode 来调整性能。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,我也试试 OpenGL。
    【解决方案3】:

    你可以试试SkiaSharp,它比GDI+快,但不知道能不能处理600K行/s。

    SkiaSharp

    Skia 的 C# / .Net 包装器

    SkiaSharp SkiaSharp managed by "Xamarin/Microsoft" 的文档

    Skia 图书馆文档skia.org.

    使用 SkiaSharp

    1. 添加 NuGet 包SkiaSharp
    2. using SkiaSharp;
    3. 画椭圆/椭圆canvas.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 绘制椭圆时使用的颜料。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多