使用C++或C#进行游戏开发?

14

什么是编写游戏项目的最佳编程语言,为什么?

为什么游戏编程世界被C++所主导?

7个回答

33

这是一个比较困难的问题。从大多数情况来看,C++是一种更适合编程游戏的语言,因为它提供了很多直接控制内存管理的选项,可以更加精细地调整性能。这个事实以及C++比C#存在更长时间,使其在游戏行业中占主导地位。

然而,如今,随着.NET平台和C#日渐成熟,不容易排除它作为游戏编程领域中的强有力竞争者的地位。我认为对于近期来说特别如此,因为.NET 4.0和C# 4.0将带来全新的多线程和并发编程时代,可以给他们的平台带来巨大的性能提升。随着多核CPU席卷桌面计算机世界,而高度核心化的CPU也只是距离不远,使用.NET和C# 4.0开发多线程应用程序的方便性将挑战C++的地位。

最终,这将完全取决于你认为需要多少控制内存管理,以及这种控制是否值得在大规模并行游戏领域付出努力。如果你需要这种控制,并认为能够处理以C++编写高度并行的游戏,那么你可能会从中获得一些好处。否则,我认为C# 4.0将是更好的选择。


2011更新:

值得注意的是,现在距离我最初撰写本文已经两年了。Silverlight游戏,尤其是Windows Phone 7上的Silverlight,已成为一个庞大且快速增长的平台,开发出了许多先进的游戏。自2010年11月该平台首次推出以来,WP7上的游戏已经爆炸式增长,已经有比竞争平台更多的游戏被开发出来。鉴于移动设备的普及程度和人们玩游戏的流行程度,我认为这是C#作为游戏开发语言的强大和能力的强有力证明。相当多的WP7游戏都是完全3D的图形密集型游戏。


6
如果你的目标是进入游戏行业(指非独立或主机平台),那么我想说的是,你目前别无选择,只能使用C++。XNA套件对于大多数行业游戏来说并不足够。 - Klaim
此外,不要忘记你不能使用C#进行PS3或Wii的编程(除非你在C++之上使用它作为脚本语言)。因此,学习C#而不是C++会限制你的就业选择。 - mbrodersen
2
从C++转到C#也容易得多。C++教授你像指针和内存管理这样的硬核知识。而C#更像是在沙盒中玩耍。 - mbrodersen
我认为在PS3或Wii上创建CLR是完全可能的,没有任何理由不行。一旦C#成为游戏开发的主要竞争者,我毫不怀疑将会出现一个新的市场,专门为C#运行时服务。@Klaim:我根本不认为XNA是C#游戏开发中的因素。相反,一旦C#成为竞争者,像ID、CryTek等公司的引擎将会占据主导地位。与即将编写的内容相比,XNA只是一个沙盒。 - jrista
9
两年后的更新加一赞 :) - Zavael

5
对于商业/大型游戏项目,C++可能是最好的选择。然而,如果您想制作较小的独立游戏,您可以选择C#Java
我用C++做了几个小游戏,用过XNA Framework做了一个C#小游戏,仅出于好奇。目前,我正在使用Java和LWJGL (轻量级Java游戏库)开发一个平台游戏。你猜怎么着?它完全正常运行,而且跨平台兼容性几乎是免费的!我开始使用Java启动这个项目的原因是想看看能否使用Java而不是我通常使用的C++创建一个漂亮的OpenGL加速游戏。到目前为止,对我来说它非常好用,我真的很惊讶。=)老实说,我有点厌倦了C ++,编写Java代码对我来说感觉更加高效(非常感谢Eclipse IDE!)。
所以,对于较小的游戏项目,您绝对可以使用Java或C#取得成功,无需使用C++,除非您正在做需要100%可能性能的事情。XNA可能是最容易入门的选择,尽管对我来说,我很可能不会再次使用它,因为它基本上只适用于Windows(加上Xbox 360)。

1
Java做游戏?嗯...当然可以:国际象棋,奥赛罗,2D平台游戏等等... - jpinto3912
3
如果那是一种批评的话,象棋实际上是最难进行计算的游戏之一。否则为什么IBM会专门建造一台电脑来玩它呢? - CurtainDog

3

3
多年前,将游戏开发者从汇编语言转换到C语言花费了很多时间,然后又花费了更多的时间让整个行业使用C++。原因始终如一...“C太慢了”、“对象也太慢了”。在C++中,代码(引擎、之前的游戏等)和人才上都有巨大的投入。这需要很长时间才能实现转变 - 就像以前一样。将来,游戏会用托管代码开发,但这需要时间。
与此同时,也有用C#编写的.NET引擎。 (点击链接查看)

还有两个基于商业XNA引擎的游戏引擎,能够产生令人印象深刻的视觉效果: Visual3D.NET: http://game-engine.visual3d.net/ Sunburn: http://www.synapsegaming.com/products/sunburn - JulianR
C# 的瓶颈在于它不是一种跨平台语言。你不能仅使用 C# 来开发 PS3 或 Wii 游戏。 - mbrodersen
@MB:嗯,“托管代码”并不意味着C#或单一平台。你在我的回答中读入了一些不存在的东西。 - JP Alioto

2
我认为,当你创建自己的游戏时,被 CPU 瓶颈限制(唯一与语言选择有关的方面)是你最不需要担心的事情。更容易受到 GPU 的瓶颈限制。现在的最低配备已经有 2 核了,如果你能实现完美的工作负载分配来利用 CPU 的 2 或 4 核,我会觉得非常惊讶,因为这就需要一个理想的负载分配。
通常,我运行一个游戏(大概写成 C++)时发现它最多只使用了我的 CPU 的 50%-60%。那么你能说你使用的语言存在瓶颈吗?还是算法的瓶颈导致你无法跨越一个以上的 CPU 核心?即使在单核心的极限情况下,通过优化算法,你仍然可以(在理论上)将性能提升一倍,然后才能真正地说你受到语言的限制。
随着 8、16 和 32 核心的出现,这种情况只会增加。你绝对不希望你的游戏只能使用 32 个核心中的一个。
C# 在游戏开发中没有得到广泛应用的真正原因是:对于那些已经在 C++ 代码上投入了大量资金的游戏工作室来说,没有足够强有力的理由去切换到 C#。不仅是他们的代码,还有他们的开发者已经非常擅长 C++,所以如果因为“易用性”而切换到 C# 就有些奇怪了,这意味着要克服很多新的挑战,并花费大量的资金重写现有的代码。即使你完成了所有这些,你得到的也只是一段只支持 PC(使用 Mono 支持 Linux)和 Xbox 360 的新代码。没有 PS3,没有 Wii。这意味着你的收益微乎其微且自我限制。

2
即使到今天,仍然存在游戏受到 CPU 限制的情况。将状态更改和绘制调用发送到 GPU 会占用大量的 CPU 时间,这一点令人惊讶。即使在今天,领先游戏的开发团队仍花费大量时间来优化 CPU。 - mbrodersen
你真的很棒,你的观点令人满意。 100:谢谢; 跳转到100; - Sherif
回答得好...你熟悉老游戏Zone 66吗?在我看来,任何不控制操作系统的游戏都不够优化。;) - CurtainDog
哦,拜托。如果你的游戏是单线程的,那么你就无法利用多核CPU的100%,因为你只使用一个核心。而使游戏多线程会因同步问题而大大增加复杂性(是的,有很多人使用单核CPU),所以你应该检查核心利用率(假设CPU亲和力已设置为游戏进程)。 CPU瓶颈绝不是语言问题。在执行之前,C#被编译成本地代码,因此至少数学运算与C++并驾齐驱(我测试过)。 - n0rd
这两种语言的真正区别在于资源管理。在C++中,它是显式的。在C#中,它试图是隐式的,而这就是问题所在。当你运行游戏并在关键时刻出现减速时,因为垃圾收集器决定进行一些清理,或者如果你的进程需要几个G的内存(只使用其中一半),因为GC认为现在不是释放内存的好时机,你的游戏会频繁交换,那么你确实有一个问题。 - n0rd
显示剩余3条评论

1
如果你使用C ++,你将拥有一个更大的代码库,尽管这对于大多数游戏来说并不重要(除了3D游戏或需要物理引擎等库的游戏)。根据你对C#的经验(或者你对C++的经验少还是多),C#可能更容易编写。
此外,考虑使用一些类似于XNA Game Studio之类的游戏创建工具,它们通常可以为你提供各种常规帮助。

-1
“性能”只是一个误导。是的,游戏是大多数消费者运行的最苛刻的应用程序之一。然而,大部分重活儿可以由专用硬件完成,这将在任何语言中每周击败软件解决方案。Flash游戏的普及应足以证明,在大多数情况下,我们有充足的性能可用(现在我们有一些不错的实现,我想我们很快也会看到用Javascript编写的游戏)。
我认为,主要是因为许多其他语言被标榜为商业、学术或统计语言,并且开发人员整体上并没有真正感到有必要挑战这些假设。

2
如果你想要开发像《Crysis》、《半条命》、《侠盗猎车手》等领先游戏,那就不能这样操作。开发团队通常会花费大量时间来优化代码、艺术资源等,以使游戏在尽可能快的情况下运行,尤其是在游戏机上。 - mbrodersen

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