4

我正在编写一个包装 DirectX 9 并提供简化接口来执行 2D 像素级绘图的 C# 控件。.NET 要求我将此代码包装在一个不安全的代码块中,并使用允许不安全代码选项进行编译。

我锁定了整个表面,然后返回一个指向锁定的内存区域的指针。然后我可以使用“简单”指针算法直接写入像素数据。我对此进行了性能测试,发现与我所知道的其他“安全”方法相比,速度有了很大提高。

这是在 C# .NET 应用程序中操作单个像素的最快方法吗?有没有更好、更安全的方法?如果有一种同样快速的方法不需要指针操作,那么我更喜欢使用它。

(我知道这是 2008 年,我们都应该使用 DirectX 3D、OpenGL等,但是这个控件专门用于 2D 像素渲染,根本不需要 3D 渲染。)

4

4 回答 4

5

使用不安全指针是在 C# 中进行直接内存操作的最快方法(绝对比使用 Marshal 包装函数更快)。

只是出于好奇,您要执行哪种 2D 绘图操作?

我问是因为锁定 DirectX 表面以进行像素级操作会破坏您希望从使用 DirectX 中获得的大部分硬件加速优势。此外,DirectX 设备在通过终端服务(远程桌面)使用时将无法初始化,因此在这种情况下控件将无法使用(这对您来说可能无关紧要)。

在绘制大三角形和变换图像(纹理映射到四边形)时,DirectX 将是一个巨大的胜利,但它在单个像素处理方面并不会真正表现得那么好。

留在 .NET 领域,一种替代方法是保留 Bitmap 对象作为您的表面,使用 LockBits 并通过返回的 BitmapData 对象中的不安全指针直接访问像素。

于 2008-09-13T20:41:18.503 回答
3

是的,这可能是最快的方法。

几年前,我不得不在像素级别比较两张 1024x1024 的图像;get-pixel 方法耗时 2 分钟,不安全扫描耗时 0.01 秒。

于 2008-09-25T04:27:26.207 回答
3

我还使用 unsafe 来加速这种性质的事情。至少可以说,性能改进是戏剧性的。这里的重点是,只要你知道自己在做什么,unsafe 就会关闭一堆你可能不需要的东西。

另外,请查看DirectDraw。它是 DirectX 的 2D 图形组件。它真的很快。

于 2008-12-18T13:57:09.637 回答
1

我最近的任务是为我们的一个瘦客户端应用程序 (C#) 创建一个简单的直方图控件。我正在分析的图像大约是 1200x1200,我必须走同样的路线。我可以毫无问题地让事物自己绘制一次,但需要重新调整控件的大小。我试图避免它,但我不得不获取原始内存本身。

我并不是说使用标准的 .NET 类是不可能的,但我最终还是无法让它发挥作用。

于 2008-09-11T07:51:23.567 回答