如果您在C#中编写下一个3D图形密集型应用程序(如3D建模和动画软件),哪一个会是更好的选择?
如果我们认为C#是独立于平台的,那么OpenGL看起来很诱人,但性能等等呢?
由于使用的语言是C#,因此性能非常重要.
编辑:你也可以考虑SlimDX和TAO,OpenTK,csGL等.
我推荐OpenGL的原因如下: -
跨平台 - OpenGLES目前与移动平台特别相关
OpenGL着色语言实现本质上优于DirectX着色器.
OpenGL有点容易学习,因为可以用很少的代码行设置基本渲染
哲学上,OpenGL被设计为通用渲染引擎,而DirectX总是以游戏为导向,因此OpenGL似乎更适合您的问题.
OpenGL是一种稳定的技术,已经存在了一段时间,并将继续如此.DirectX更依赖于微软的想法,如果MS觉得它可以在瞬间被弃用.
也就是说,您的系统要求和个人偏好可能会以任何方式提示,因为两种方法都是可靠的实现.在缺点方面,OpenGL非常适合状态机,并且可能很难适应OO,尽管这当然不是不可能的.
编辑:添加以澄清我对OpenGL着色器模型的评论本质上优于DirectX.这是因为DirectX着色器是在开发时针对通用GPU模型编译的,而OpenGL着色器作为源代码保存,并在运行时由OpenGL驱动程序编译.因此,从理论上讲,驱动程序编写者可以利用GPU的特定(或运行旧程序时更新)功能,并创建可以比DirectX着色器运行更快的编译代码.这是一个小问题,但可能非常重要.
Direct3D和OpenGL之间的性能差异接近于零.两者的特征集不是一对一映射,但它们很接近.OpenGL的主要专业是跨平台支持.
托管代码中与图形子系统相关的性能并不差.在每次调用DirectX时,SlimDX对完全本机代码的支付略有损失,但这并不严重.实际的惩罚取决于调用 - 对DrawRrimitive的调用总体上比调用SetRenderState要昂贵得多,所以百分比方式你最终会在SetRenderState调用上失去更多.SlimDX包含一个通常表现非常好的调优数学库,尽管你必须要小心一点.即使使用像NProf这样的junker工具,分析也可以非常快速地突出显示这些内容,因此修复并不困难.
总的来说,如果我们考虑通过D3D进行渲染的通用,完全最优的 C++和C#代码,C#版本可能在C++版本的10-15%之内.但这很难实现; 考虑通过在C#中工作节省多少时间,你可以将其应用于更高级别的图形优化,如果必须用C++构建整个事物,那么你可能根本就没有时间.即使你设法在C++中获得额外的10%,它也会在几个月内迅速缩小到5%,这时新一轮硬件会比以往更快地撕掉你的应用程序代码.我知道我会选择什么 - 这就是我开始写SlimDX的原因.
OpenTK具有类似的性能特征,但需要注意的是他们的数学库在某些地方相当慢.这是我与他们讨论过的一个实现错误,希望能在很长时间内修复.
OpenGL在过去与性能特征有关,但最终得到了修复.举一个例子,考虑可绑定的制服,其中Direct3D在OpenGL获得类似的机制之前具有更快的机制.除了有时支持不同的功能集之外,没有区别.
因此,除非您打算使用最新的GPU功能,否则我建议您使用OpenGL.可以肯定地说,OpenGL在与性能相关的功能方面落后的地方并不多.
顺便说一下,只有采取某些预防措施,C#和.NET才是独立于平台的.