在C#中渲染图形

时间:2008-09-12 02:56:33

标签: c# gdi+ xna rendering

是否有另一种方法可以在C {#{3}}和GDI+之外呈现图形?

(用于开发瓷砖地图编辑器。)

6 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

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

我实际上在Stack Overflow上写了另一篇文章,询问是否还有其他更好的方法: Unsafe C# and pointers for 2D rendering, good or bad?

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

这是所需步骤的高级别:

  1. 下载DirectX SDK。
  2. 创建一个新的C#Windows Forms项目并引用已安装的项目 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开始重复。
  10. 请注意,采用这种方法时,您需要非常小心地检查目标表面的当前显示模式(间距和每个像素的位数)。此外,您还需要制定策略来处理窗口大小调整或在程序运行时更改屏幕格式。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可以查看Cairo graphics libraryMono项目具有C#的绑定。

答案 5 :(得分:0)

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