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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我并不是说使用标准.NET类是不可能的,但我最终无法完成它。