不安全的C#和2D渲染指针,好还是坏?

时间:2008-09-11 07:47:22

标签: c# graphics pointers

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

出于好奇,你想要进行什么样的2D绘图操作?

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

当绘制大三角形并转换图像(纹理映射到四边形)时,DirectX将是一个巨大的胜利,但它不会真正用单像素操作执行那么好。

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

答案 1 :(得分:3)

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

几年前,我不得不在像素级别比较两个1024x1024图像;获取像素方法需要2分钟,不安全扫描需要0.01秒。

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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

我并不是说使用标准的.NET类是不可能的,但我最终无法将其工作。