C#/.NET作为新的游戏开发平台是否可行?

23

长期以来,C++一直是主导游戏开发的语言。有许多AAA级别的3D引擎可用,适合任何预算。

我的问题是,随着XNA的崛起,C#和.NET框架是否已经足够好地定位为新的标准游戏开发平台?显然,XNA框架固有的跨平台特性(Windows、Xbox、Zune)具有其优势,但这些优势足以吸引大型游戏开发工作室改变方向吗?

就我个人而言,我在使用C#/XNA或使用jMonkeyEngine的Java之间徘徊。我非常希望我的游戏能够在多个平台上运行,而我唯一熟练掌握的语言就是C#和Java。我想看到一种由OpenGL驱动并可以在Mono上运行的XNA代码库实现,但我认为这只是一厢情愿的想法。

我很想听听其他人在使用除C++外的其他语言构建3D游戏时的经验。

13个回答

66

我认为C++在未来十年内会像汇编语言一样过时。我是一名专业的游戏程序员,已经有15年以上的工作经验。在90年代初期,很多人认为C语言对于游戏来说不够高效。到了90年代末期,同样的人们认为C语言可以,但C++对于类似游戏等性能关键的应用程序来说太慢了。现在,C++已成为标准的高性能语言,人们争论其他语言太慢了。与此同时,今天的游戏使用脚本语言如Lua、Python或Unrealscript来处理游戏逻辑,这些语言比C#或Java慢十倍。

C++在游戏中进行数学计算时更快。用C#或Java进行线性代数运算非常缓慢。然而,这只是游戏的一部分(10-25%)。当涉及到游戏逻辑瓶颈时,内存访问是最耗费时间的,因此使用另一种语言并不能显著降低性能。游戏的工具方面,以前占到50-80%的代码,实际上并不需要使用C++,使用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#,并花费一些额外的时间来优化数学计算。


3
好的洞察力/文章。现今游戏使用多种语言,核心数学计算一般使用 C++,而游戏逻辑则使用其他脚本语言。虽然我不同意 C++ 是一种旧语言的说法,它一直在不断更新和改进,只是被认为老旧,并没有实质问题。 - Dominik Grabiec
许多C++编译时间都是模板化的,据我所知。然而,你说得对,预处理器确实没有帮助。 - user7116
2
我认为C++在游戏中的未来很大程度上取决于C++0x在行业中的采用情况。 - Jasper Bekkers

17
大型游戏公司可能不会很快采用XNA。一些独立开发者正在使用它,但它肯定有潜力最终取得巨大成功并淘汰C++。
XNA提供了许多可用于游戏开发的类,但许多人通常选择使用一个完整的游戏引擎。虽然对于初学者来说,XNA是一个比较好的入门工具,如果你是新手游戏编程方面。
C#是开发游戏的好语言。游戏开发需要声音、高级图形、人工智能、物理等应用程序,所有这些都需要强大且相当快速的语言环境。虽然大多数顶级PC和控制台游戏都是用C++编写的,但C#有一个路线图,很可能会淘汰C++。即将到来的C++0x的变化无疑将再次振兴C++,但C#看起来已经准备超越它了。
如果你真的想成为一个游戏开发者,我建议你至少学习C++并编写自己的游戏引擎。使用预制的游戏引擎很容易,你可以编写出“可以”的代码,但你将遇到许多限制,你将不能编写越过这些限制的代码。你实际上将被限制在游戏引擎的能力范围内(除非你可以访问源代码,然后对其进行修改以满足自己的需要)。
学习C++和最好是OpenGL :) 一旦你了解了OpenGL,你就可以很容易地学习DirectX。
一旦你了解了C++,C#就变得很简单了。

关于托管DirectX,有没有使用托管DirectX完全编写的托管代码的零售游戏?这是我一直想知道的.... - BFree
@Brock Woolf:XNA不过是一个托管的DirectX包装器,虽然是一个很大的包装器。如果你说“每个XNA游戏都是相同的可怕FPS”,难道你不会把它和Game Studio 3D之类的东西混淆吗?XNA不是一个游戏引擎。 - OregonGhost
所有现代游戏都是用C++编写的吗?这里的“所有”是指数量较少的情况,且“现代”有很多限制。越来越多的游戏使用Flash编写,这是一个明显的例外。游戏开发远不止于主机游戏。 - Robert Rossney
1
@BFree:我知道《竞技场之战》,这是一款使用托管dx编写的相当不错的商业RTS游戏。http://uk.pc.ign.com/objects/692/692397.html - Adam Naylor
当然,例外是用Flash编写的互联网游戏,它们本来就不是真正的游戏。- 不是真正的游戏?嗯? - Codebrain
显示剩余4条评论

13
虽然一段时间之前XNA Professional被宣布,但现在微软似乎把重点放在Express版本上(虽然名称中失去了“Express”),这似乎是针对业余爱好者市场而不是商业市场。其中一个好处是,这大大有利于Xbox 360社区,因为他们现在允许业余开发人员为Windows和Xbox 360开发游戏,然后在XBox网络上销售自己的游戏,这是件好事。
我很想看到XNA在专业世界中增加动力,但这不会发生,除非它可用于其他主要游戏平台(PS3和Wii)。问题不仅是XNA框架/API,还包括语言/框架需求,因此您甚至不能使用C#编写游戏,然后在Microsoft平台上使用XNA,在其他平台上使用OpenGL。
XNA的性能概况也面向业余爱好者市场而不是商业市场,尽管性能似乎相当不错,并且有令人印象深刻的演示。
编辑:
如果您的问题实际上是“我是否应该现在使用XNA来开展我的预算远低于一百万美元的项目”,我的答案肯定是肯定的。去试试它,它是免费的。而且它很强大。

是的,一个很好的例子就是游戏(Sharky's Air legends)http://sharky.bluecog.co.nz/。这位开发者利用业余时间使用XNA制作了一款游戏,现在它已经被发布了。 - Dominik Grabiec

10
我在90年代末曾在Newfire工作过。在资金耗尽之前,我们有一个引擎可以呈现10,000平方公里、分辨率为10厘米的沉浸式世界。您可以一次性将大量玩家带入其中,并持久性地改变景观。这个引擎可以在配备Voodoo 2卡的P200上以帧速率运行。
引擎的大部分都是用精心调整的C++编写的。所有游戏代码都是用C或C++或Java编写的。我还有原型代码,可以使用下推自动机定义对象行为,并能够进行非常不错的人工智能,几乎不占用CPU时间。游戏逻辑的执行被渲染所掩盖。
有一次,我在Java中使用我们的软件渲染器演示了康威生命游戏。细胞是放置在平面上的立方体,随着它们的年龄增长,会出现或消失并改变颜色。虽然游戏以每秒4代的固定速率运行,但3D显示器以20多FPS的速度运行,在配备软件渲染器的P200上运行。
因此,答案并不是绝对的C++。像任何问题域一样,答案是在该域内最有效的语言。对于渲染引擎,C++表现很好,但对于实际的游戏逻辑和规则,许多语言都表现良好,如Python、C#和Java。

是的,然而你的论点基于大约10年前(或更早)的事实。如今,在游戏中使用的是C++,可能还有一些内联汇编和GLSL/HLSL。 - Brock Woolf
现在游戏使用Lua作为编写规则等的语言,但游戏核心仍然是用C ++编写的。 - gbjbaanb

10

如一位发帖者所述,XNA目前仅限于Microsoft平台,但您仍然可以使用C#、.NET和任何.NET编程语言以跨平台的方式开发游戏。

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

还有一个商业游戏平台叫做Unity3D,它使用Mono取得了巨大成功。他们是一个游戏IDE,超越了XNA作为游戏开发环境:物理、图形、灯光、模型、碰撞都在本地C++代码中处理,而所有游戏逻辑(AI、相机控制、视图等)都由托管代码处理,通常使用C#或UnityScript编写(这是一个强类型JavaScript实现,给您带来了最好的两个世界:JavaScript语法,但强类型提高了性能)。


此外,Unity3D还有一个免费版本供独立开发者使用:http://unity3d.com/unity/download/. - user93202

9

我不是游戏开发人员(除非你把我在大约1982年用Atari 6502汇编语言编写的翻转棋游戏算作),但我有很多写商业应用软件的经验,从汇编语言 -> C -> Objective-C(还有人记得Next Cube吗?)-> C++ -> Java,现在是C#。

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

在我看来,因为性能而选择C++而不是C#的论点并不像有些人所说的那么简单。我工作的软件对性能至关重要。我们与编译为本地代码的产品竞争(可能是用C / C++ / Assembly编写的),我们在性能上获胜,以至于我们的竞争对手甚至会在某些应用程序中使用我们的软件而不是他们自己的软件。

如果C ++比C#更快,那怎么可能呢?根据我的经验,答案是对于任何复杂的系统,架构和算法比语言更重要(假设潜在性能大致相同-对于C ++和C#肯定是如此)。即使我作为全职C ++开发人员的时间比使用C#的时间长,但我在C#比在C ++中更具生产力。这意味着我可以花更多时间重构和完善我的架构和算法,而以前则不能。
现在,有时我必须承认我很想用C ++重写应用程序的核心引擎,因为我知道我可以使其运行更快并且使用更少的内存。到目前为止,我已经抵制了这种冲动,因为我相信生产力的下降意味着只是时间问题,我的C ++代码库会比我留在C#时更慢。
我相信游戏开发转向C#和/或Java和/或其他更具生产力的语言只是时间问题。使用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。当然,我不会在Sony或Nintendo游戏系统上寻找它。

5
我认为当人们谈论XNA、Java游戏框架、pygame或其他相关内容时,会出现一种BS精英主义。是的,专业游戏公司将长期使用C++。但Atmospherian正在寻求自己项目的解决方案,所以我假设他是个业余爱好者(如果他是Epic的CEO之类的人,我怀疑他会在SO上发帖)。
无论如何,仅因为你不能用它编写FarCry并不意味着它是一个毫无价值的框架。大型工作室级别的游戏需要数百万美元和数十人,但XNA/Java/pygame等使业余爱好者能够完成一些非常棒的东西。业余游戏和大型工作室游戏是两个不同的存在,并需要不同的工具。
回答你的问题,Atmospherian:
- 是的,XNA可以做出一些很酷的东西,人们已经用它制作了一些很棒的游戏。
- 如果你想让XNA跨平台并与Mono一起使用,我认为这在技术上是可能的,但我不会抱有太高的期望。
- 如果你想在游戏行业找到工作,你需要学习C++。

-我认为目前实现跨平台游戏引擎的最佳选择是pyglet。与Java或C++相比,易用性可能会牺牲一些速度。


5

只需加入对话……C#/.NET 当然也可在非微软平台上使用。

在这两个框架中,你可以针对Linux、Mac、Wii进行开发……如果有足够的资金或者兴趣,他们也能使Mono运行在PS3上。此时,你就可以使用C#来编写所有主要的游戏平台了(虽然可能不能用XNA)。

此外,对于任何关心性能的人,许多伟大的工作正在进行中,例如Mono的新支持,利用它们的SIMD扩展实现快速浮点运算(目前仅限x86): http://tirania.org/blog/archive/2008/Nov-03.html


3

我很惊讶没有人提到移动游戏的可能性。我认为在类似Half-Life和Halo这样的高性能游戏方面,我看不到任何托管代码能与C++竞争,但对于 less-intensive移动设备游戏来说,它似乎有着广阔的市场。


3
作为对这个问题的跟进,我开始研究一些用C++编写的基于OpenGL的3D引擎(CrystalSpace、Irrlicht、Panda3D),它们看起来都相当可靠。有趣的是,Panda3D是用C++编写的,但你主要通过Python使用它。在我看来,这种方法会将快速的C++引擎与Python的易编程性结合起来,从而获得最佳的两个世界。我将提出另一个问题,比较这些引擎。感谢回复。

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