在C#中渲染图形

9

除了 GDI+XNA,在C#中还有其他渲染图形的方式吗?

(用于瓦片地图编辑器的开发。)


David,刚注意到你的问题“理解指针”。非常好的问题,很棒的答案!那篇帖子中提到的所有要点也适用于我下面的“不安全”答案。 - Ash
6个回答

10

SDL.NET是我喜欢的解决方案。如果您需要在其中添加3D效果,则可以使用Tao.OpenGL进行渲染。它快速、符合工业标准(即SDL),而且跨平台。


太棒了!我实际上对SDL很熟悉。我会去研究一下这个的。 - David McGraw
他们已经移动了他们的维基,所以那个链接不再有效。只需转到http://cs-sdl.sourceforge.net/并从那里导航即可。 - Danny Parker

4

是的,我编写了一个Windows Forms控件,包装了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. 使用所需的演示参数(窗口模式,后台缓冲等)初始化一个新的DirectX设备对象。
  4. 创建设备时,需要记录表面“Pitch”和当前显示模式(每像素位数)。
  5. 当您需要显示某些内容时,锁定后台缓冲表面并将返回的指针存储到表面内存的起始位置。
  6. 使用指针算术,基于表面pitch、每像素位数和实际x/y像素坐标计算数据中实际的像素位置。
  7. 在我的情况下,出于简单起见,我坚持使用32 bpp,这意味着设置像素就像这样简单:*(surfacePointer + (y * pitch + x))=Color.FromARGB(255,0,0);
  8. 完成绘图后,解锁后台缓冲表面。呈现表面。
  9. 根据需要从步骤5重复。

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


2

2
  • Managed DirectX (Microsoft.DirectX namespace) 可以提升 3D 图形的速度。它是一个稳定的 .NET 封装,覆盖了 DirectX API,但创建 .NET 对象和 marshalling 会有一定的性能损失。除非你正在编写一个功能齐全的现代 3D 引擎,否则它可以正常工作。

  • Window Presentation Foundation (WPF) (Windows.Media namespace) - 最适合 2D 图形的选择。也具有有限的 3D 能力。旨在用矢量、硬件加速、分辨率无关的框架取代 Windows Forms。非常方便,支持多种自定义控件、资源、数据绑定、事件和命令... 但也有一些 WTFs。速度通常比 GDI 快,比 DirectX 慢,并且很大程度上取决于你如何处理事情(看到某些东西在以明智的方式重写后运行速度快了 60 倍)。我们成功地在单个(不是最好的)PC 上实现了 3 个 1280x1024 的屏幕上满载实时指标、图形和绘图。


1

开罗是一个选择。我目前正在使用GDI+和Cairo重写我的映射软件,它具有瓦片地图生成器等其他功能。


1
你可以尝试使用Visual Studio和/或Expression Blend来开发WPF应用程序。我不确定你想要多么复杂的编辑器,但它应该能够处理一个简单的编辑器。请查看这个MSDN文章以获取更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接