【问题标题】:Rendering graphics in C#在 C# 中渲染图形
【发布时间】:2016-11-06 07:01:25
【问题描述】:

除了GDI+ 和XNA,还有其他方法可以在 C# 中呈现图形吗?

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

【问题讨论】:

  • 大卫,刚刚注意到您的问题“理解指针”。好问题,好答案!该帖子中提到的所有要点也适用于我下面的“不安全”答案。

标签: c# gdi+ xna rendering


【解决方案1】:

SDL.NET 是我喜欢的解决方案。如果你需要在它上面做 3D,你可以使用 Tao.OpenGL 在里面渲染。它速度快、符合行业标准(即SDL)并且是跨平台的。

【讨论】:

  • 太棒了!我实际上对 SDL 很熟悉。我要调查一下。
  • 他们已经移动了他们的 wiki,因此链接不再有效。只需转到 cs-sdl.sourceforge.net 并从那里导航
【解决方案2】:

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

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

虽然它的性能相对较高,但它需要 unsafe 编译器选项,因为它使用指针来有效地访问内存。这就是之前这篇文章的原因。

这是一个高层次的必需步骤:

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

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

【讨论】:

    【解决方案3】:
    • 托管 DirectX(Microsoft.DirectX 命名空间)用于更快的 3D 图形。它是基于 DirectX API 的可靠 .NET 包装器,在创建 .NET 对象和编组方面会带来一些性能损失。除非您正在编写功能齐全的现代 3D 引擎,否则它会正常工作。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          Cairo 是一个选项。我目前正在使用 GDI+ 和 Cairo 重写我的地图软件。它具有平铺地图生成器等功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-02
            • 2013-10-14
            • 2018-08-10
            • 1970-01-01
            • 1970-01-01
            • 2021-05-26
            相关资源
            最近更新 更多