XNA和DirectX(C#)之间的比较

50

对于PC开发(不包括Xbox和Zune),

XNA和C# DirectX有什么区别?在速度、版税等方面,C# DirectX是否比XNA有明显优势?

这两者与无管理的C++ DirectX相比如何?

游戏编程方面,行业正在向何处发展?

4个回答

54
如果你真的能写出优秀的非托管代码,那么你可能能够在DirectX的基础上编写一个更快的图形引擎。但是对于业余爱好者来说,XNA已经有足够的性能,无论是2D还是3D游戏开发。

这里有一个很好的Channel 9视频,他们在Xbox 360上运行了一个由XNA制作的赛车游戏。即使在全高清下也可以很好地运行。几款XBox Live Arcade游戏是由XNA社区开发的。

就C#DirectX而言,据我所知,由于XNA基本上取代了托管DirectX(称为Managed DirectX),因此不再得到官方支持。我可能错了,因为我很久没有看过它了。

XNA和Managed DirectX之间的性能差异可以忽略不计,因为它们在本质上是相同的东西。 XNA只是具有一些方便的部分,可以减少您需要编写的样板代码量。


31

Xna游戏开发工具主要解决游戏相关的问题,但我认为如果没有看到一些不错的度量标准,任何宣称Xna游戏开发工具性能比托管Direct X差的帖子都应该受到质疑。

微软之外的一个独立组织创建了一个名为SlimDx的项目-http://slimdx.mdxinfo.com/。 如果您编写的是应用程序而不是游戏(根据其他问题,我认为您不是),那么这个项目值得考虑。

游戏行业仍然广泛使用C ++作为游戏内部核心,但社区游戏部分的XBox上使用完全托管代码的XNA游戏工作室成功发布了一些游戏,并在XBox Arcade上发布。 关于人们在社区游戏中赚了多少钱,很快就会有一些有趣的统计数据。

许多高价游戏在某些方面使用C ++,但实际的游戏逻辑则使用像Lua这样的语言...而且Lua并不以其惊人的速度著称!

C#具有良好的学习曲线,并由行业中的工具程序员使用-它是一种有用的语言。 C ++是一种很棒的语言,但需要更多的纪律来创建功能代码-对于新手而言,使用C ++可能会让他们自掘坟墓。 C#可以在运行时动态更改并执行诸如展开循环之类的操作,而不是编译时执行-优秀的C#代码可以与易读的C ++代码一样快甚至更快-但您必须知道如何使用它。 在非常紧密的循环中,C ++和汇编语言可能会在某些情况下胜出。 在游戏中经常使用C ++,还会创建具有自己的内存策略的自定义分配器,以尝试帮助正常分配器造成的碎片...在.Net / C#中,CLR处理此类低级实现细节,并且只要按照垃圾回收器的强项(与您自己的C ++实现相同)进行编程,则无需关心此类底层实现细节。

如果你正在考虑进入游戏开发,并且正在决定使用哪种编程语言(从你的提问中可以看出),那么最好选择在项目结束时能够展示完成作品的语言,无论是C++、Objective-C、C#、Flash、Silverlight等。

由于编程语言不断地变化并风行一时,招聘者通常会寻找掌握不同语言的专业人才,这可能会减轻因不知道当前所使用的语言而带来的困难。而一个已完成的作品集也将证明你的技能水平。


1
我会怀疑任何说Xna游戏开发工具的表现比托管Direct X差的海报,如果没有看到一些体面的指标。我知道这是几年前的事了,但这篇文章仍然得到了很多阅读量,XNA绘制调用的速度大约比SharpDX调用慢6倍,比slimdx调用慢4倍:http://code4k.blogspot.co.uk/2011/03/benchmarking-cnet-direct3d-11-apis-vs.html。 - Levi H
那看起来是相当不错的证明 :) @STRAIGHTOUTTACOMPTON 给出了好链接 - paulecoyote
@STRAIGHTOUTTACOMPTON 谷歌搜索者注意:_[更新2012/05/15:请注意,原始代码经过了特定配置的微调,可能不会给出相同的结果。我已经重写了这个示例,以提供更加精确和可预测的结果。与XNA的比较也是不公平和不准确的,你应该得到类似x4慢的东西而不是x9。SharpDX最新版本2.1.0现在也比C++慢了x1.35。本文将在新的sharpdx.org网站上进行更新] (http://code4k.blogspot.co.uk/2011/03/benchmarking-cnet-direct3d-11-apis-vs.html)_ - user585968

17
  1. XNA 和 DirectX 是解决同一个问题-高性能图形密集型编程的两种非常不同的实现。两者都支持2D、3D、音频和网络组件。DirectX是非托管代码,而XNA是托管代码。
  2. 有一个受控制的DirectX实现,它是DirectX调用的包装器,但是在当前版本之后,它不再得到更新,所以我不会费心去使用它。
  3. XNA 不是一个围绕非托管的DirectX的包装器。它确实使用了DirectX的部分内容,但它不是一个包装器。
  4. 工业界似乎仍然非常倾向于非托管的DirectX——我这么说是因为所有主要的引擎公司都还在使用C++、ASM编码并支持DirectX(要么是独占,要么与OpenGL一起用于Linux/Mac版本)。微软“放弃”DirectX托管包装器并告诉人们改用XNA,表明他们正在推动使用托管代码的开发人员。

什么?XNA就是一个包装器。 - TraumaPony
4
不,不是这样的-如果需要澄清,请查看http://xnarocks.spaces.live.com/blog/cns!CDFDED0A2593C8E1!172.entry。只是举个快速的例子:包装器执行一对一函数映射。XNA 2.0中的管道功能如何映射到DirectX?它没有。这不是一个包装器。 - Robert MacLean
2
+1,XNA是在DirectX之上编写的更高级别的托管代码游戏库。对于许多事情,它甚至不使用DirectX的类/结构,而是自己实现了一些,最明显的是矩阵、向量和其他一些部分... - Pop Catalin

5

目前,微软似乎没有计划在Metro风格应用中支持XNA。替代XNA和现已弃用的“Managed DirectX”的选择是SharpDx。它可以用于创建Metro风格应用,并且已经通过基准测试与XNA、SlimDX和Windows API代码包进行了比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接