DirectX或OpenGL

时间:2009-02-02 20:31:38

标签: c# .net opengl directx

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

如果我们认为C#与平台无关,那么OpenGL看起来很诱人,但性能等等呢?

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

编辑:你也可以考虑SlimDX和TAO,OpenTK,csGL等。

15 个答案:

答案 0 :(得分:25)

我建议使用OpenGL,原因如下: -

  1. 跨平台 - OpenGLES目前与移动平台特别相关
  2. OpenGL着色语言实现本质上优于DirectX着色器。
  3. OpenGL有点容易学习,因为可以用很少的代码行设置基本渲染
  4. 哲学上OpenGL被设计为通用渲染引擎,而DirectX总是以游戏为导向,因此OpenGL似乎更适合您的问题。
  5. OpenGL是一种稳定的技术,已经存在了一段时间,并将继续如此。 DirectX更依赖于微软的想法,如果MS觉得它可以立即弃用。
  6. 也就是说,系统的要求和个人偏好可能会以两种方式提示,因为两种方法都是可靠的实现方式。在不利方面,OpenGL非常像一台状态机,可能很难适应OO,虽然这当然不是不可能的。

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

答案 1 :(得分:12)

Direct3D和OpenGL之间的性能差异接近于零。两者的特征集不是一对一映射,但它们很接近。 OpenGL的主要专业是跨平台支持。

答案 2 :(得分:8)

托管代码中与图形子系统相关的性能并不差。在每次调用DirectX时,SlimDX对完全本机代码的支付略有损失,但这并不严重。实际的惩罚取决于调用 - 对DrawRrimitive的调用总体上比调用SetRenderState要昂贵得多,所以百分比方式你最终会在SetRenderState调用上失去更多。 SlimDX包含一个通常表现非常好的调优数学库,尽管你必须要小心一点。即使使用像NProf这样的junker工具,分析也可以非常快速地突出显示这些内容,因此修复起来并不困难。

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

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

答案 3 :(得分:7)

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

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

顺便说一下,只有采取某些预防措施,C#和.NET才是独立于平台的。

答案 4 :(得分:4)

以下是我对您的诚实建议:同时使用

建议

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

关于辩论的想法

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

我的选择

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

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

结论

因此,您必须能够以自己的方式奋斗,并且慢慢开发利用这两种API的自己的框架,从而使您能够测试和实施您想要的任何程序。

此致

Mossa Nova Merhi

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

我已经使用过OpenGL和DirectX。我认为性能非常相似。我更喜欢OpenGL的编程模型 - 特别是它对转换的处理,以及对拾取操作的直接支持。我不喜欢每次升级操作系统时MS继续重写相同功能的方式,我认为OpenGL会保护你。

然而,两者都很古怪,你需要花费大量的时间来确保它与托管应用程序框架(无论是Windows还是其他东西)进行良好的交互。

答案 8 :(得分:1)

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

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

另外一个小小的注释,DX不应该在.NET中使用,因为Managed DirectX已被弃用;使用XNA。

答案 9 :(得分:1)

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

如果您只需要定位Windows,请使用XNA

对于跨平台工作,也许其他人已经做了一些使用单声道与openGL的工作 - 我假设你打算制作图形软件而不是游戏,所以有一些像winForms这样的框架会非常有帮助用于所有UI控件。

答案 10 :(得分:1)

您可能希望查看IrrLicht引擎,它同时具有C ++和.Net API,并且它完全与Graphics API无关(意味着您可以使用相同的代码来执行OpenGL或DirectX,程序员甚至不必知道你在使用哪个)

您可能还想了解SlimDX,这是XNA的一种非常快速,轻量级的开源替代方案

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

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

根据您可能想要支持的其他平台,例如移动设备或XBox360,这可能有助于您决定使用哪种API。

答案 13 :(得分:1)

就性能而言,两者几乎相同,您的代码和设计将成为影响速度的市长因素。此外,这两个API都很好(与5年前相比,当dx领先时)。

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

有些可能需要商业焦点;出售软件,转换资金,做生意。来自商业环境,资金可以加快速度, dx 可能非常适合这种情况,在这种情况下,你可以获得有关微软的能力和开发工具等有趣的交易。

另一方面, OpenGL 是一个开放标准,这意味着人们可以讨论/评估并有助于改善标准API,这将有利于社会保障。这与科学方法更加兼容,其目标可能是发布研究,发布免费软件,建立社区并从世界各地的开发人员获得反馈,多平台。

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

答案 14 :(得分:0)

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