我正在编写一个 C# 控件,它包装 DirectX 9 并提供一个简化的接口来执行 2D 像素级绘图。 .NET 要求我将此代码包装在不安全代码块中,并使用允许不安全代码选项进行编译。
我锁定整个表面,然后返回指向锁定的内存区域的指针。然后我可以使用“简单”指针算术直接写入像素数据。我对此进行了性能测试,发现比我所知道的其他“安全”方法有显着的速度改进。
这是在 C# .NET 应用程序中操作单个像素的最快方法吗?有没有更好、更安全的方法?如果有一种同样快速且不需要指针操作的方法,我会更倾向于使用它。
(我知道现在是 2008 年,我们都应该使用 DirectX 3D,OpenGL http://en.wikipedia.org/wiki/OpenGL等,但是此控件专门用于 2D 像素渲染,并且不需要 3D 渲染。)
使用不安全指针是在 C# 中进行直接内存操作的最快方法(绝对比使用 Marshal 包装函数更快)。
只是出于好奇,您想要执行哪种 2D 绘图操作?
我之所以这么问,是因为锁定 DirectX 表面来进行像素级操作将会破坏您希望通过使用 DirectX 获得的大部分硬件加速优势。此外,当通过终端服务(远程桌面)使用时,DirectX 设备将无法初始化,因此该控件在这种情况下将无法使用(这对您来说可能并不重要)。
当绘制大三角形和转换图像(纹理映射到四边形)时,DirectX 将是一个巨大的胜利,但它在单像素操作方面的表现并不那么出色。
在 .NET 领域,一种替代方法是保留 Bitmap 对象作为表面,使用 LockBits 并通过返回的 BitmapData 对象中的不安全指针直接访问像素。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)