9

如果您正在用 C# 编写下一个 3d 图形密集型应用程序(如 3d 建模和动画软件),哪个会是更好的选择?

如果我们将 C# 视为独立于平台的,那么 OpenGL 似乎很诱人,但性能等呢?

由于使用的语言是 C#,因此性能是非常重要的考虑因素。

编辑:您也可以考虑 SlimDX 和 TAO、OpenTK、csGL 等。

4

15 回答 15

25

我推荐 OpenGL 的原因如下:-

  1. 跨平台 - 如今,OpenGLES 与移动平台特别相关
  2. OpenGL 着色语言实现本质上优于 DirectX 着色器。
  3. OpenGL 更容易学习,因为它可以用很少的代码行设置基本渲染
  4. 从哲学上讲,OpenGL 被设计为通用渲染引擎,而 DirectX 始终面向游戏,因此 OpenGL 似乎更适合您的问题。
  5. OpenGL 是一种稳定的技术,已经存在了一段时间,并将继续存在。DirectX 更依赖于 Microsoft 的突发奇想,如果 MS 愿意,它可能会立即被弃用。

也就是说,您的系统要求和您的个人偏好可能会以任何一种方式提示它,因为这两种方法都是可靠的实现。不利的一面是 OpenGL 在很大程度上是一个状态机,很难适应 OO,尽管这当然不是不可能的。

编辑:添加以澄清我对 OpenGL 着色器模型本质上优于 DirectX 的评论。这是因为 DirectX 着色器是在开发时针对通用 GPU 模型与程序一起编译的,而 OpenGL 着色器作为源代码保存并在运行时由 OpenGL 驱动程序编译。因此,理论上驱动程序编写者可以利用 GPU 的特定(或在运行旧程序时更新)功能并创建运行速度比 DirectX 着色器更快的编译代码。这是一个小问题,但可能非常重要。

于 2009-02-02T21:02:19.003 回答
12

Direct3D 和 OpenGL 之间的性能差异几乎为零。两者的特征集并没有一一对应,但很接近。OpenGL 的主要优点是跨平台支持。

于 2009-02-02T20:40:00.937 回答
9

就图形子系统而言,托管代码的性能还不错。每次调用 DirectX 时,SlimDX 都会对完全本地代码支付轻微的惩罚,但这绝不是严重的。实际的惩罚取决于调用 - 调用 DrawPrimitive 将比调用 SetRenderState 更昂贵,因此按百分比计算,您最终会在 SetRenderState 调用上损失更多。SlimDX 包含一个经过调整的数学库,通常性能非常好,尽管您必须小心使用它。分析,即使使用像 NProf 这样的垃圾工具,也可以非常快速地突出显示这些内容,因此不难修复。

总体而言,如果我们考虑通过 D3D 进行渲染的通用、完全优化的 C++ 和 C# 代码,C# 版本可能在 C++ 版本的 10-15% 范围内。不过,这很难实现;考虑一下在 C# 中工作节省了多少时间,您可以将其应用于更高级别的图形优化,如果您必须用 C++ 构建整个事物,您可能根本没有时间进行这些优化。即使你设法在 C++ 中获得额外的 10%,它也会在几个月内迅速缩小到 5%,因为新一轮硬件比以往任何时候都更快地撕裂你的应用程序代码。我知道我会选择什么——这就是我开始编写 SlimDX 的原因。

OpenTK 具有类似的性能特征,但需要注意的是他们的数学库在某些地方相当慢。这是我与他们讨论过的一个实现错误,希望很快就会得到修复。

于 2009-04-17T02:30:21.690 回答
7

OpenGL 过去在性能特性方面落后,但事情最终得到了解决。举个例子,考虑可绑定的制服,在 OpenGL 获得类似的机制之前,Direct3D 有一个更快的机制。除了有时支持不同的功能集外,没有什么区别。

因此,除非您打算使用最新的 GPU 功能,否则我建议您使用 OpenGL。可以肯定地说,OpenGL 在性能相关功能方面落后的领域并不多。

顺便说一句,C# 和 .NET 仅在您采取某些预防措施时才独立于平台。

于 2009-02-02T20:42:00.683 回答
4

这是我对您的诚实建议:两者都使用

建议

我会权衡哪一天有更多工具可用于完成程序,然后出于性能原因,我会利用另一个以确保在不同系统上的最大性能。

关于辩论的想法

让我们回顾一下:程序的性能取决于很多因素,主要是您的努力(应用程序的代码)和给定计算机上的驱动程序。图形 API 是您的应用程序与 GPU 通信的一种方式,因此您非常依赖于为已安装的 GPU 实现给定驱动程序的好坏程度。

我的选择

Direct3D 在某些显卡上有时比 OpenGL 更快,这是因为显卡供应商及其驱动程序。

DirectX 提供了大量工具来加速开发。我意识到一开始它的学习曲线非常陡峭,但请允许我提醒您,您恰好是一名程序员。我什至敢说一个很好的。

结论

因此,您必须能够奋力拼搏,慢慢开发自己的框架,利用这两种 API,从而使您能够测试和实现您想到的任何程序。

真挚地,

Mossa Nova Merhi

于 2009-06-05T14:05:13.240 回答
2

如果你不喜欢 XNA,你可以使用SlimDX。与 XNA 不同,SlimDX 支持 DirectX 10。

于 2009-02-02T21:15:01.910 回答
2

使用 OpenGL,您可以在 Windows XP 和 Linux 上使用“DirectX 10 功能”,例如几何着色器。使用 GLUT 可以非常简单地在几分钟内启动并运行演示应用程序。

于 2009-02-02T21:19:54.973 回答
2

我使用过 OpenGL 和 DirectX。我认为性能非常相似。我更喜欢 OpenGL 的编程模型——尤其是它对转换的处理,以及对拾取操作的直接支持。我不喜欢 MS 每次升级操作系统时都继续重新包装相同功能的方式,我认为 OpenGL 可以保护您免受这种情况的影响。

但是,两者都很古怪,您需要花费大量时间确保它与托管应用程序框架(无论是 Windows 还是其他东西)很好地交互。

于 2009-02-02T21:22:47.497 回答
1

我觉得 OpenGL 不像 XNA 那样适合纯 OO 环境。也就是说,如果您真的关心跨平台兼容性,那么您的后端应该无关紧要。

将应用程序的业务逻辑设计为独立于渲染后端。您应该能够插入 OpenGL 渲染对象,然后将其换成 XNA 渲染器没问题。这不仅增加了您的潜在客户群(通过启用对两者的支持),而且使您的应用程序设计更好。

还有一点需要注意的是,DX 不应该在 .NET 中使用,因为托管 DirectX 已被弃用;使用 XNA。

于 2009-02-02T20:36:54.797 回答
1

这取决于您打算定位的平台。

如果您只需要针对 Windows 使用 XNA

对于跨平台的工作,也许其他人已经使用单声道和 openGL 完成了一些工作 - 我假设您打算制作图形软件而不是游戏,因此拥有像 winForms 这样的框架对您的所有人都非常有帮助用户界面控件。

于 2009-02-02T20:58:33.677 回答
1

您可能想要研究 IrrLicht 引擎,它同时具有 C++ 和 .Net API,并且完全与图形 API 无关(这意味着您可以使用相同的代码来执行 OpenGL 或 DirectX,程序员甚至不必知道您使用的是哪个正在使用)

您可能还想研究 SlimDX,它是 XNA 的一个非常快速、轻量级的开源替代品

于 2009-02-02T21:24:30.330 回答
1

DirectX 将在 Windows 上获得更好的视频驱动程序支持,因为它是 MSFT 用来认证卡的。我们发现,对于 Windows 上的廉价卡,OpenGL 支持缺乏、崩溃或完全错误。

于 2009-04-17T02:37:15.030 回答
1

您可能想看看这个: http ://groups.google.com/group/microsoft.public.win32.programmer.directx.managed/browse_thread/thread/1fc097147796e15b

现在不支持托管 API,因此 OpenGL 可能是您最好的选择,除非您想使用 XNA。

根据您可能想要支持的其他平台,例如移动设备或 XBox360,这可能会帮助您决定使用哪个 api。

于 2009-04-17T02:44:38.350 回答
1

就性能而言,两者实际上是相同的,您的代码和设计将是影响速度的主要因素。此外,这两个 API 都得到了很好的维护(与 5 年前 dx 遥遥领先相比)。

在这种情况下,一种选择是根据您的理念和每个 API 背后的理念进行选择。

有些可能需要商业重点;卖软件,倒钱,做生意。来自商业环境,金钱可以加快速度,dx可能非常适合这种情况,您可以在能力和开发工具等方面与微软达成有趣的交易。

另一方面,OpenGL是一个开放标准,这意味着人们可以讨论/评估并为改进标准 API 做出贡献,这将首先保证为社会造福。这更符合一种科学方法,其目标可能是发布研究、发布免费软件、建立社区并从世界各地的开发人员那里获得反馈,多平台。

它们是软件进化的不同观点,我认为两者都有自己的优势,我们仍然可以在两个来自非常不同的背景但做非常相似的事情的 API 之间进行选择,这是很好的。

于 2011-09-22T15:32:45.787 回答
0

DirectX 有一个托管 API,可让您以“本机”C# 对象的形式访问 DirectX API。这对 OpenGL 来说是一个巨大的进步。

于 2009-02-02T20:35:19.773 回答