在C#中渲染图形

还有另一种方法可以在C#中渲染图形超出GDI +和XNA吗?

(用于开发tile map编辑器。)

SDL.NET是我喜欢的解决方案。 如果你需要3D,你可以使用Tao.OpenGL在其中进行渲染。 它是快速的,行业标准( SDL ,即)和跨平台。

是的,我编写了一个Windows Forms控件,它包装了DirectX 9.0并提供了对video表面的直接像素级操作。

我实际上在Stack Overflow上写了另一篇文章,询问是否还有其他更好的方法: 不安全的C#和2D渲染指针,好还是坏?

虽然它的性能相对较高,但它需要不安全的编译器选项,因为它使用指针有效地访问内存。 因此这篇早期post的原因。

这是所需步骤的高级别:

  1. 下载DirectX SDK。
  2. 创建一个新的C# Windows窗体项目并引用已安装的Microsoft DirectX程序集。
  3. 使用您需要的Presentation Parameters(窗口化,后台缓冲等)初始化一个新的DirectX Device对象。
  4. 创建设备,注意记录表面“间距”和当前显示模式(每像素位数)。
  5. 当您需要显示某些内容时,请Lock后备缓冲区表面并将返回的指针存储到表面内存的起始位置。
  6. 使用指针算法,根据表面间距,每像素位数和实际x / y像素坐标计算数据中的实际像素位置。
  7. 在我的例子中,为了简单起见,我坚持使用32 bpp,这意味着设置像素非常简单:*(surfacePointer +(y * pitch + x))= Color.FromARGB(255,0,0);
  8. 完成绘制后, Unlock后缓冲区表面。 呈现表面。
  9. 根据需要从步骤5开始重复。

请注意,采用这种方法时,您需要非常小心地检查目标表面的当前显示模式(间距和每个像素的位数)。 此外,您还需要制定策略来处理窗口大小调整或在程序运行时更改屏幕格式。

  • 托管DirectX(Microsoft.DirectX命名空间)以获得更快的3D图形。 它是一个坚实的.NET包装程序,而不是DirectX API,它在创建.NET对象和编组时会带来一些性能损失。 除非您正在编写function齐全的现代3D引擎,否则它将正常工作。

  • Window Presentation Foundation(WPF)(Windows.Media命名空间) – 2D图形的最佳选择。 3D技能也有限。 旨在用向量替换Windows窗体,硬件加速与分辨率无关的框架。 非常方便,支持多种自定义控件,资源,数据绑定,事件和命令……还有一些WTF。 速度通常比GDI快,并且比DirectX慢,并且在很大程度上取决于你的工作方式(在以合理的方式重写之后看到的东西工作速度提高了60倍)。 我们成功地在一台(而不是最好的)PC上实现了3个1280×1024屏幕,其中包含实时指标,图形和图表。

您可以尝试使用Visual Studio和/或Expression Blend查看WPF。 我不确定你想要多么复杂,但它应该能够处理一个简单的编辑器。 查看此MSDN文章了解更多信息。

您可以查看Cairo图形库 。 Mono项目具有C#的绑定。

开罗是一个选择。 我目前正在使用GDI +和Cairo重写我的绘图软件。 它有一个瓦片地图生成器,以及其他function。