23

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

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

就个人而言,我在为新项目使用 C#/XNA 和通过 jMonkeyEngine 使用 Java 之间纠结。我非常希望我的游戏可以移植到多个平台,而我知道的唯一能够实现这一点的语言是 C# 和 Java。我很想看到一个由 OpenGL 提供支持并在 Mono 上运行的 XNA 代码库的实现,但我认为这只是一厢情愿的想法。

我很想知道其他人在用 C++ 以外的东西构建 3D 游戏时的经历。

4

13 回答 13

66

我认为 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 派生的,C 是在 70 年代初提出的。所以 C++ 在很多方面都已经过时了。最烦人的可能是预处理器,它会破坏透明度并导致编译时间过长。一个最先进的 C++ 游戏引擎的平均编译时间为 30-60 分钟。在这种情况下,您可以编译人类曾经制作的每一个 C# 和 Java 项目。缺乏自我反思和动态代码创建也是一个缺点。克服这些缺点通常需要花费大量的开发时间。

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

目前,我的建议是:如果你想制作一个 AAA 多平台游戏,除了 C++ 游戏的运行部分,你别无选择。考虑在工具端使用 C#。有效地连接托管和非托管代码有点棘手,但从长远来看,值得您为此付出努力。如果你做一个爱好项目或一个 B 标题,其中性能不如开发成本/时间重要,那么忘记 C++,只使用 C# 来做所有事情,并花一些额外的时间来优化数学。

于 2008-12-17T10:13:04.317 回答
17

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

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

C# 是用于游戏开发的好语言。游戏开发产生需要声音、高级图形、人工智能、物理等的应用程序。所有这些都需要强大且相当快速的语言环境。虽然大多数顶级 PC 和主机游戏都是用 C++ 编写的,但 C# 有一个路线图,可能会将 C++ 抛在后面。C++0x 即将到来的变化无疑会在一段时间内重新振兴 C++,但 C# 看起来已经准备好超越它。

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

学习 C++,最好学习 OpenGL :) 一旦你了解了 OpenGL,你就可以很容易地学习 DirectX。

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

于 2008-12-10T13:52:03.377 回答
13

虽然前一段时间 XNA Professional 发布了,但微软现在似乎专注于 Express 版本(尽管它失去了名称中的“Express”),这似乎是针对爱好者市场而不是商业市场。除其他外,这在很大程度上使 XBox 360 社区受益,因为他们现在允许爱好者开发者为 Windows 和 XBox 360 开发他们的游戏,然后在 XBox 网络上销售他们的游戏,这是一件好事。

我真的很想看到 XNA 在职业世界中获得动力,但这不会发生,除非它可用于其他主要游戏平台(PS3 和 Wii)。问题不仅在于 XNA 框架/API,还在于语言/框架要求,所以你甚至不能用 C# 编写游戏,然后在 Microsoft 平台上使用 XNA 和在其他平台上使用 OpenGL。

XNA 的性能配置文件也针对业余爱好者市场而非商业市场,尽管性能似乎相当不错,并且在野外也有令人印象深刻的演示。

编辑:

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

于 2008-12-10T14:11:22.013 回答
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很棒。

于 2008-12-10T14:27:04.413 回答
10

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

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

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

于 2009-01-02T07:43:45.227 回答
9

我不是游戏开发者(除非你算上我在 1982 年用 Atari 6502 汇编语言编写的黑白棋游戏),但我确实有很多用 Assembly -> C -> Objective-C 编写商业应用软件的经验(任何人都记得下一个立方体?)-> C++ -> Java,现在是 C#。

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

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

如果 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 上运行的严肃游戏玩家的真正优惠。

Better yet, be the person to create an excellent gaming library which allows for easy targeting of both WPF and Silverlight 3 (or Silverlight 2 if you don't need hardware assisted 3D rendering).

While I have seen no official announcement, it is hard to believe that the next generation of XBox will not support Silverlight. Of course, I would not look for it on Sony or Nintendo gaming systems.

于 2009-02-15T20:45:35.733 回答
5

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

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

为了回答您的问题,大气:

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

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

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

-我认为目前获得工作的跨平台游戏引擎的阻力最小的路径是pyglet。与 java 或 C++ 相比,易用性可能会以速度为代价。

于 2008-12-10T14:39:23.190 回答
5

只需添加到对话中... C#/.NET 在其他非微软平台上肯定是可用的。

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

此外,对于任何想知道性能的人......很多很棒的事情正在开发中,例如 Mono 使用他们的 SIMD 扩展(当然,现在仅限 x86)对快速浮点数学的新支持:http: //tirania.org /blog/archive/2008/Nov-03.html

于 2008-12-10T18:05:47.530 回答
3

令人惊讶的是,没有人提到移动游戏的可能性。我看不到任何托管代码在短期内与 C++ 竞争半条命和光环之类的游戏,但对于不太密集的移动设备游戏来说,它似乎有腿。

于 2008-12-10T14:44:43.037 回答
3

作为这个问题的后续,我开始研究一些用 C++ 编写的基于 OpenGL 的 3D 引擎(CrystalSpace、Irrlicht、Panda3D),它们看起来都相当可靠。关于 Panda3D 的一个有趣说明是它是用 C++ 编写的,但您使用它的主要方式是通过 Python。在我看来,这种方法可以兼得两全其美,因为它是一个用 C++ 编写的快速引擎,并结合了 Python 编程的易用性。我将提出另一个比较这些引擎的问题。感谢您的回复。

于 2008-12-13T15:07:10.360 回答
1

好吧,在这两者之间,我认为 C#/XNA 显然是基于库支持的赢家,而且考虑到微软在 DirectX 方面的经验,它确实是成熟的。话虽如此,我认为 C#/XNA 不会在很长一段时间内(如果有的话)取代 C++ 成为严肃的 3D 游戏编程(即大型开发公司)的通用语言。

于 2008-12-10T13:48:28.923 回答
1

不仅要考虑工作室,还要考虑观众。只要有索尼和任天堂存在,他们就不太可能迁移 C#/XNA 平台。至少对于任天堂来说,当你拥有他们目前的大众市场吸引力时,他们将继续支配他们的开发平台。

我喜欢 XNA,因为我现在可以为我的 Zune 编写应用程序,但是用于游戏开发平台的 C++ 将存在很长时间。微软设备可能会有新的独立开发人员涌入,但我们距离看到 XNA 被全面使用(如果有的话)还有很长的路要走。

于 2008-12-10T13:59:35.423 回答
-1

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

于 2009-02-15T19:43:20.190 回答