C#/ .NET作为新标准游戏开发平台的可行性?

时间:2008-12-10 13:39:53

标签: c# mono xna

很长一段时间以来,C ++一直是主导的游戏开发语言。许多AAA质量的3D引擎可满足任何预算。

我的问题是,随着XNA的兴起,C#和.NET框架已经定位好,可以作为新的标准游戏开发平台接管吗?显然,XNA框架(Windows,Xbox,Zune)固有的跨平台特性有其优点,但这些优势是否足以吸引大型游戏开发工作室转换?

就我个人而言,我在使用C#/ XNA进行新项目和通过jMonkeyEngine使用Java之间徘徊不定。我非常希望让我的游戏能够移植到多个平台上,而我所知道的唯一能够完成此任务的语言是C#和Java。我很想看到由OpenGL驱动的XNA代码库的实现,并且可以在Mono上运行,但我认为这只是一厢情愿的想法。

我很想知道其他人在用C ++以外的其他东西制作3D游戏时所经历的事情。

13 个答案:

答案 0 :(得分:67)

我认为C ++在未来10年将会像装配一样过时。 15年来,我是一名职业游戏程序员。在90年代早期,很多人都说C对游戏来说效率不高。在90年代后期,同样的人说C可以,但C ++对于游戏这样的性能关键应用来说太慢了。现在C ++是标准的高性能语言,人们认为其他语言太慢了。与此同时,今天的游戏使用Lua,Python或Unrealscript等脚本语言来制作比C#或Java慢十倍的游戏逻辑。

当你在游戏中进行数学运算时,C ++会快得多。在C#或Java中,做线性代数的速度非常慢。但是,这只是游戏的一部分(10 - 25%)。当谈到游戏时,逻辑瓶颈是内存访问,因此使用其他语言并不会显着降低性能。游戏的工具方面,使用50-80%的代码,实际上不需要任何C ++。它很高兴在C#中运行,几乎可以用于任何工具。

人们也不应该忘记C ++是从C语言衍生而来的,它是在70年代早期制作的。所以C ++在很多方面已经过时了。最烦人的事情可能是预处理器,它会导致透明度下降并导致疯狂的编译时间。一个平均水平的C ++游戏引擎在30-60分钟内编译。在这段时间内,您可以编译人类制作的每个C#和Java项目。缺乏自我反射和动态代码创建也是一个缺点。通常需要花费大量的开发时间来克服这些缺点。

然而,C ++开发成本很高,游戏工作室通过改用游戏开发尚未证明的新技术来冒险失败的成本更高。这也是一个重要的因素,大多数有经验的游戏程序员只使用C / C ++,他们没有其他语言的经验,这肯定会增加转换的风险。因此,您可能不会在接下来的几年内看到游戏工作室转而使用C#。然而,微软拥有的工作室可能会在未来5年内在C#游戏中大受欢迎,这将说服其他工作室用C#制作AAA游戏是可行的,然后你会看到越来越多的工作室转向C#。

目前,我的建议是: 如果你想制作一个AAA多平台游戏,除了C ++之外你别无选择。考虑使用C#作为工具方面。有效地连接托管代码和非托管代码有点棘手,但从长远来看,它值得您花费在它上面。 如果你做一个业余爱好项目或B标题,其中性能不如开发成本/时间那么重要,那么就忘记使用C ++,只需使用C#就可以花一些时间来优化数学。

答案 1 :(得分:17)

大型游戏工作室很可能不会很快采用XNA。一些独立开发者正在使用它,但绝对有可能最终取得成功并让C ++落后。

XNA提供了许多可用于游戏开发的课程,但许多其他课程通常选择使用完全成熟的游戏引擎。虽然如果你是编程游戏的新手,XNA对于初学者来说是相当不错的。

C#是一种用于游戏开发的好语言。游戏开发产生的应用程序需要声音,高级图形,AI,物理等。所有这些都需要强大而相当快速的语言环境。虽然大多数顶级PC和控制台游戏都是用C ++编写的,但C#有一个可能会让C ++落后的路线图。 C ++ 0x即将发生的变化无疑将重振C ++一段时间,但C#似乎有望超越它。

如果你真的想成为一名游戏开发者,我会敦促你至少学习C ++并编写自己的游戏引擎。使用预先制作的游戏引擎很简单,你可以编写一些“好”的东西,但是你会遇到许多你无法编码的限制。您将有效地局限于游戏引擎的功能(除非您可以访问源,然后您可以根据自己的喜好进行修改)。

学习C ++,最好是OpenGL :) 一旦了解了OpenGL,您就可以轻松学习DirectX。

一旦你了解C ++,C#就是小菜一碟。

答案 2 :(得分:13)

虽然XNA专业版在不久前宣布,微软现在似乎专注于Express版本(虽然它在名称中丢失了“Express”),这似乎是针对业余爱好者市场而非商业市场。除此之外,这对XBox 360社区有很大好处,因为他们现在允许业余爱好者开发他们的Windows和XBox 360游戏,然后在XBox网络上销售他们的游戏,这是一个很好的的事情。

我真的很高兴看到XNA在专业领域获得动力,但除非可用于其他主要游戏平台(PS3和Wii),否则不会发生这种情况。问题不仅在于XNA框架/ API,它是语言/框架要求,因此您甚至无法用C#编写游戏,然后在Microsoft平台上使用XNA,在其他平台上使用OpenGL。

XNA的性能概况也是针对业余爱好者市场而非商业市场,虽然性能似乎相当不错,并且在野外有令人印象深刻的演示。

编辑:

如果您的问题实际上是“我现在应该将XNA用于我的项目,预算远低于一百万”,我的回答肯定是肯定的。试试吧,它是免费的。它很强大。

答案 3 :(得分:10)

我在90年代后期在一个名为Newfire的地方工作过。在资金枯竭之前,我们有一个引擎可以渲染一个10,000平方公里的沉浸式世界,分辨率为10厘米。你可以同时获得大量的玩家,并持续改变景观。这台引擎在带有Voodoo 2卡的P200上以帧速率运行。

大多数引擎都是用精心调整的C ++编写的。所有游戏代码都是用C或C ++或Java编写的。我还有原型代码可以使用下推自动机来定义对象行为,这可以做非常体面的AI。几乎没有CPU时间。游戏逻辑的执行因渲染而相形见绌。

有一次,我使用我们的软件渲染器演示了使用Java运行的Conway的生命游戏。细胞是立方体,放置在一个出现或消失的平面上,随着它们逐渐老化而变色。虽然游戏以每秒4代的固定发生速率运行,但3D显示器的运行速度为20+ FPS,再次在带有软件渲染器的P200上运行。

所以答案肯定不是C ++。与任何问题域一样,答案是在该域内最有效的语言。 C ++在该领域适用于渲染引擎,但对于实际的游戏逻辑和规则,许多语言都能很好地工作。 Python很棒。 C#很棒。 Java很棒。

答案 4 :(得分:10)

正如海报所提到的,XNA目前仅限于Microsoft平台,但您仍然可以使用C#,.NET和任何.NET编程语言以跨平台方式开发游戏。

Mono运行时确实提供了一个跨平台引擎,可用于在各种桌面平台(Windows,MacOS,Linux)以及游戏控制台(Novell支持的Wii)下运行C#(或.NET代码) ,PS3即将推出,Xbox360“靠你自己”。)

还有一个名为Unity3D的商业游戏平台,它使用Mono创造了奇迹。它们是一款超越XNA游戏开发环境的游戏IDE:物理,图形,灯光,模型,碰撞都是用本机C ++代码处理的,而所有游戏逻辑(AI,摄像机控制,视图等)都由通常用C#或UnityScript编写的托管代码(一种强类型的Javascript实现,为您提供两全其美:Javascript语法,但强大的类型可提高性能)。

答案 5 :(得分:10)

我不是游戏开发者(除非你算上我在1982年用Atari 6502汇编语言编写的Reversi游戏),但我确实有很多在Assembly中编写商业应用软件的经验 - > C - > Objective-C(任何人还记得Next Cube吗?) - > C ++ - > Java和现在的C#。

我无法比较游戏库,但我对C ++与C#有一些想法。

IMO,由于性能原因,C ++对C#的争论并不像你想象的那么简单。我所使用的软件对性能至关重要。我们与编译为本机代码的产品(可能是用C / C ++ / Assembly编写)竞争,我们在性能上取胜,以至于我们的竞争对手甚至使用我们自己的软件certain applications

如果C ++比C#更快,那该怎么办?根据我的经验,答案是这样一个事实:对于任何复杂的系统,体系结构和算法都比语言更重要(假设潜在的性能在同一个范围内 - 它肯定是C ++和C#)。虽然我是一名全职C ++开发人员多年来比使用C#,但我在C#中的效率要高于C ++。这意味着我可以花费更多的时间来重构和完善我的架构和算法。

现在,有时我不得不承认我很想用C ++重写我的应用程序的核心引擎,因为我知道我可以让它运行得更快并且使用更少的内存。到目前为止,我已经抵制了这种冲动,因为我认为生产力的下降意味着我的C ++代码库比我在C#中使用时的速度慢只是时间问题。

我认为游戏开发过渡到C#和/或Java和/或其他一些比C ++更高效的语言只是时间问题。使用Java已有好几年了,而现在已经使用C#几年了我会打赌C# - 但这只是猜测。

如果我今天开始进行游戏开发,我肯定会打赌Silverlight和/或WPF。 WPF建立在Direct3D之上。微软已经宣布Silverlight 3将支持硬件辅助3D渲染。 Silverlight可在各种浏览器和Mac上运行。使用Moonlight,它可以在Linux上运行。它已经宣布用于某些手机平台。由于Silverlight本质上是WPF的轻量级版本(最初是作为“WPF / E”引入,其中“E”表示无处不在),因此您可以在不需要额外努力的情况下进行目标。您可以在浏览器中使用Silverlight轻量级版本(免费或广告支持),以及使用WPF并在Windows上运行的严肃游戏玩家的真实交易。

更好的是,成为一个优秀的游戏库,可以轻松定位WPF和Silverlight 3(如果您不需要硬件辅助3D渲染,则可以使用Silverlight 2)。

虽然我没有看到官方声明,但很难相信下一代XBox将不支持Silverlight。当然,我不会在索尼或任天堂游戏系统上寻找它。

答案 6 :(得分:5)

我认为当人们谈论XNA或java游戏框架或pygame或其他什么时,就会出现一种BS精英主义。是的,专业游戏机构将长期使用C ++。但Atmospherian正在为他自己的项目询问一些事情,所以我会假设他是一个业余爱好者(如果他是Epic的首席执行官,或者我怀疑他会在SO上发帖)

无论如何,仅仅因为你无法在其中编写FarCry并不意味着它是一个毫无价值的框架。主要的工作室级游戏需要数百万美元和数十人,但XNA / Java / pygame /等允许业余爱好者做一些非常棒的东西。业余游戏和主要工作室游戏是两种不同的野兽,需要两套不同的工具。

回答你的问题,Atmospherian:

- 是的,XNA可以做一些非常酷的东西,人们用它来制作一些很酷的游戏。

- 如果您希望XNA跨平台并使用单声道,我认为这在技术上是可行的,但我不会屏住呼吸。

- 如果你想在游戏行业找到一份工作,你将需要学习C ++。

- 我认为获得一个可行的跨平台游戏引擎的阻力最小的路径目前在pyglet。与java或C ++相比,易用性可能会与速度相悖。

答案 7 :(得分:5)

只需添加到对话中...... C#/ .NET当然可以在其他非Microsoft平台上使用。

在这两者之间,你可以针对linux,mac,wii ......我确定如果有足够的资金/兴趣,他们也可以让Mono在ps3上运行。那时,您可以使用C#编写所有主要游戏平台(尽管可能不是使用XNA本身)。

此外,对于任何对性能感到疑惑的人......很多伟大的事情正在进行中,例如Mono对使用SIMD扩展的快速浮点数学的新支持(当然仅限x86): http://tirania.org/blog/archive/2008/Nov-03.html

答案 8 :(得分:3)

很惊讶没人提到移动游戏的可能性。对于像Half-Life和Halo这样的人来说,我很快就看不到任何与C ++竞争的托管代码,但是对于不那么密集的移动设备游戏来说,它似乎很有用。

答案 9 :(得分:3)

作为这个问题的后续,我开始研究一些用C ++编写的基于OpenGL的3D引擎(CrystalSpace,Irrlicht,Panda3D),它们看起来都很稳固。关于Panda3D的一个有趣的注意事项是它是用C ++编写的,但你使用它的主要方式是通过Python。在我看来,就用C ++编写的快速引擎和Python中的编程简易性而言,这种方法可以提供两全其美的优势。我将提出另一个比较这些引擎的问题。谢谢你的回复。

答案 10 :(得分:1)

嗯,在这些之间我认为C#/ XNA是基于图书馆支持的明显赢家,并且鉴于微软在DirectX方面的经验确实很成熟。话虽这么说,我不认为C#/ XNA取代C ++作为严肃的3D游戏编程(即大型开发公司)的通用语言很长一段时间,如果有的话。

答案 11 :(得分:1)

不仅要考虑工作室,还要考虑观众。有可能只要索尼和任天堂在一起,他们就不太可能移动C#/ XNA平台。至少对任天堂而言,当你拥有他们目前所做的大众市场吸引力时,他们将继续决定他们的开发平台。

我喜欢XNA,因为我现在可以为我的Zune编写应用程序,但是用于广泛的游戏开发平台的C ++将会存在很长时间。可能会有很多新的独立开发者涌入微软设​​备,但我们还远远看不到全面使用XNA。

答案 12 :(得分:-1)

Lua应该是您感兴趣的,因为您可以将其嵌入C#并从LuaScript访问您的对象。