在 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
- 添加 NuGet 包
SkiaSharp
- 添加
using SkiaSharp
;
- 画画Ellipse/oval
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绘制椭圆时使用的颜料。
我需要在二维位图上绘制很多小椭圆 (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
- 添加 NuGet 包
SkiaSharp
- 添加
using SkiaSharp
; - 画画Ellipse/oval
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绘制椭圆时使用的颜料。