我正在编写一个包装DirectX 9的C#控件,并提供简化的界面来执行2D像素级绘制。.NET要求我将此代码包装在不安全的代码块中,并使用allow unsafe code选项进行编译。
我要锁定整个表面,然后将指针返回到内存的锁定区域。然后,我可以使用“简单”指针算法直接写入像素数据。我已经对此性能进行了测试,发现与已知的其他“安全”方法相比,速度有了显着提高。
这是在C#.NET应用程序中处理单个像素的最快方法吗?有没有更好,更安全的方法?如果有一种不需要指针操作的同样快速的方法,那么我倾向于使用它。
(我知道这是2008年,我们都应该使用DirectX 3D,OpenGL等,但是此控件仅用于2D像素渲染,而根本不需要3D渲染。)
使用不安全的指针是在C#中进行直接内存操作的最快方法(肯定比使用元帅包装函数要快)。
出于好奇,您尝试执行哪种2D绘图操作?
我之所以问是因为锁定DirectX表面以进行像素级操作会挫败您希望通过使用DirectX获得的大多数硬件加速优势。另外,在终端服务(远程桌面)上使用DirectX设备时,初始化将失败,因此该控件在该情况下将无法使用(这可能对您没有影响)。
DirectX在绘制大三角形和变换图像(将纹理映射到四边形)时将是一个巨大的胜利,但是使用单像素操作并不能真正实现如此出色的效果。
停留在.NET领域,一种替代方法是使用LockBits保持Bitmap对象充当您的表面,并通过返回的BitmapData对象中的不安全指针直接访问像素。