C#不安全代码和指针在2D渲染中的使用,是好还是坏?

5
我正在编写一个C#控件,它包装了DirectX 9并提供了简化的接口来执行2D像素级绘图。.NET要求我将此代码包装在不安全的代码块中,并使用允许不安全代码选项进行编译。
我锁定整个表面,然后返回已锁定内存区域的指针。然后,我可以直接使用“简单”的指针算术来编写像素数据。我已经进行了性能测试,并发现与我所知道的其他“安全”方法相比,速度有了显着提高。
这是在C# .NET应用程序中操作单个像素的最快方法吗?有更好、更安全的方法吗?如果有一种同样快速的方法不需要指针操作,那将是我的首选。
(我知道现在是2008年,我们都应该使用DirectX 3D、OpenGL等,但是这个控件仅用于2D像素渲染,不需要3D渲染。)

那么你如何获取所说的指针呢? :-) - Anders
4个回答

5
使用不安全指针是在C#中进行直接内存操作的最快方法(肯定比使用Marshal包装函数更快)。
只是出于好奇,您要执行什么样的2D绘图操作?
我之所以问这个问题,是因为锁定DirectX表面以进行像素级别的操作将破坏大多数希望从使用DirectX获得的硬件加速优势。此外,在通过终端服务(远程桌面)使用时,DirectX设备将无法初始化,因此在该场景下控件将无法使用(这可能对您无关紧要)。
当绘制大三角形和转换图像(纹理映射到四边形上)时,DirectX将是一个巨大的胜利,但它在单像素操作方面的性能并不真正出色。
在.NET领域中,一种替代方法是保留一个Bitmap对象作为您的表面,使用LockBits并通过返回的BitmapData对象中的不安全指针直接访问像素。

3
我也使用了unsafe来加速类似的操作。性能提升是惊人的,不言而喻。这里的重点是,只要你知道自己在做什么,unsafe就会关闭一堆你可能不需要的东西。
另外,请查看DirectDraw。它是DirectX的2D图形组件。它非常快。

3

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

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


1

最近,我被分配创建一个简单的直方图控件,用于我们的一个轻量级客户端应用程序(C#)。我要分析的图像大约是1200x1200,我必须走同样的路线。我可以让它自己绘制一次没有问题,但是控件需要可调整大小。我试图避免这种情况,但最终不得不获取原始内存。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接