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

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

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

(我知道现在是 2008 年,我们都应该使用 DirectX 3D, OpenGL, 等,但是此控件专门用于 2D 像素渲染,并且不需要 3D 渲染。)

有帮助吗?

解决方案

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

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

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

当绘制大三角形和转换图像(纹理映射到四边形)时,DirectX 将是一个巨大的胜利,但它在单像素操作方面的表现并不那么出色。

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

其他提示

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

几年前,我必须在像素级别上比较两个 1024x1024 图像;get-pixel 方法花费了 2 分钟,不安全扫描花费了 0.01 秒。

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

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

我最近的任务是为我们的一个瘦客户端应用程序 (C#) 创建一个简单的直方图控件。我正在分析的图像约为 1200x1200,我必须走同样的路线。我可以让这个东西自行绘制一次,没有任何问题,但控件需要重新调整大小。我试图避免它,但我必须了解原始记忆本身。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top