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

标签 c# graphics pointers

我正在编写一个包含 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/

相关文章:

c - const 关键字如何影响指向 const 变量的指针?

c# - 将 It.IsAny<> 分配给本地 var 不起作用?

c# - 根据最近相关实体的值选择实体集合

java - 检测 SurfaceView 上绘制的 View 的触摸

Java - 在菜单中选择形状并在 JPanel 中绘制

c++ - 指针和引用问题(链表)

c# - 类继承,强制新类实现某些功能

c# - 为什么不能总是像函数一样传递委托(delegate)

javascript - 在 HTML canvas 元素中将 Vector 优势与 Bitmap 相结合 - 如何实现?

c - 二进制转十进制...输出错误