我正在编写一个包含 DirectX 9 的 C# 控件,并提供一个简化的界面来执行 2D 像素级绘图。 .NET 要求我将此代码包装在不安全代码块中,并使用允许不安全代码选项进行编译。
我正在锁定整个表面,然后返回一个指向内存锁定区域的指针。然后我可以使用“简单”指针算法直接写入像素数据。我对此进行了性能测试,发现速度比我知道的其他“安全”方法有了显着提高。
这是在 C# .NET 应用程序中操作单个像素的最快方法吗?有没有更好、更安全的方法?如果有一种不需要指针操作的同样快速的方法,我会更喜欢使用它。
(我知道这是 2008 年,我们都应该使用 DirectX 3D、OpenGL 等,但是此控件专门用于 2D 像素渲染,根本不需要 3D 渲染。)
最佳答案
使用不安全指针是在 C# 中进行直接内存操作的最快方式(绝对比使用 Marshal 包装函数更快)。
出于好奇,您要执行哪种 2D 绘图操作?
我问是因为锁定 DirectX 表面以进行像素级操作会破坏您希望从使用 DirectX 中获得的大部分硬件加速优势。此外,当通过终端服务(远程桌面)使用时,DirectX 设备将无法初始化,因此在这种情况下控件将无法使用(这对您来说可能无关紧要)。
在绘制大三角形和转换图像(纹理映射到四边形)时,DirectX 将是一个巨大的胜利,但它在单像素操作方面并不会真正表现得那么出色。
留在 .NET 领域,一种替代方法是保留一个 Bitmap 对象作为您的表面,使用 LockBits 并通过返回的 BitmapData 对象中的不安全指针直接访问像素。
关于c# - 不安全的 C# 和 2D 渲染指针,好还是坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55963/