DirectX或OpenGL

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

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

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

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

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

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

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

我推荐OpenGL的原因如下: –

  1. 跨平台 – OpenGLES目前在移动平台上具有特别重要的意义
  2. OpenGL着色语言实现本质上优于DirectX着色器。
  3. OpenGL更容易学习,因为可以用很少的代码行设置基本渲染
  4. 哲学上,OpenGL被设计为通用渲染引擎,而DirectX始终以游戏为导向,因此OpenGL似乎更适合您的问题。
  5. OpenGL是一种稳定的技术,已经存在了一段时间,并将继续如此。 DirectX更依赖于微软的想法,如果MS觉得它可以在瞬间被弃用。

也就是说,您的系统要求和个人偏好可能会以两种方式提示,因为两种方法都是可靠的实现。 在缺点方面,OpenGL非常适合状态机,并且可能很难适应OO,尽管这当然不是不可能的。

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

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

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

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

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

以下是我对你的诚实建议: 兼顾两者

忠告

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

关于辩论的想法

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

我的选择

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

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

结论

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

此致

Mossa Nova Merhi

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

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

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

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

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

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

另外一点小问题,DX不应该在.NET中使用,因为Managed DirectX已被弃用; 使用XNA。

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

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

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

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

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

DirectX将在Windows上提供更好的video驱动程序支持,因为它是MSFT用于认证卡的方式。 我们发现,对于Windows上更便宜的卡,OpenGL支持缺乏,崩溃或完全错误。

您可能需要查看此内容: http : //groups.google.com/group/microsoft.public.win32.programmer.directx.managed/browse_thread/thread/1fc097147796e15b

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

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

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

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

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

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

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

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