在行业游戏中,C ++会被C#取代吗?


23

在行业游戏中,我的意思是像Quake,CoD等。


7
如果您简要解释是什么使您产生了这个想法,这将有所帮助,因为至少可以说这是一个非常奇怪的想法。
康拉德·鲁道夫

2
考虑到地震是在C .. ;-)中完成的
共产党鸭子

我本人只是想知道这个问题!
杰夫,

2
听起来像“行业游戏”,您的意思是通常所说的“ AAA游戏”。
混乱

Answers:


53

从某种意义上说,C ++确实被取代了-不仅被C#取代,而且被其他许多语言取代。但是,如果您要问,它将完全替换吗?那么答案肯定是“ 否”

这是因为C ++传统上以两种方式使用。首先,创建游戏引擎:加载资源的低级组件,在物理模拟中将多边形推入屏幕并处理数字。其次,对游戏逻辑进行编码:制定游戏规则的实际规则。

第二种功能不需要C ++的强项(例如,对底层细节的完全控制),但是会受到其弱点(例如,易于出错的手工编码内存管理)的困扰。在第二种能力下,C ++被不同的脚本语言所取代。许多开发人员都使用Lua。有些使用Python。但是,如果可以使用.NET或Mono形式的CLI平台,那么它会提供出色的脚本宿主主机。这些平台非常快速,可靠,并提供了广泛使用的语言(C#)和全面的基类库。让我们不要忘记工具:MS Visual Studio和SharpDevelop / MonoDevelop可能不是世界上最好的IDE,但是它们相当不错。

也就是说,游戏引擎不会用C#(或Lua或Python)编写。为什么?因为它们不够快。

与许多流行的看法相反,当今最大的性能下降是由于内存延迟。这意味着访问内存是一项严肃的工作。而且托管语言不允许用户控制内存访问-这就是为什么首先对其进行“托管”的原因。因此,没有托管语言将允许编写真正快速的游戏引擎。实际上,我能想到的所有大型“ C#”引擎-XNA,MOGRE,Unity-都基于本机 C ++代码。但允许使用C#编写游戏逻辑。

综上所述:将使用C#代替C ++或其他语言。但是,它永远不会取代C ++,至少直到有人发明了无延迟的即时访问内存。


16
+1 Visual Studio是一个非常好的IDE。即使这是黑暗的一面……
Michael Coleman

1
Bah,以我的经验,C#的仿真速度还不够快,但这并不能阻止人们尝试。
2011年

@Nevermind什么是“托管语言”?
Quazi Irfan

3
@iamcreasy广义上讲,“托管语言”是指在虚拟机上运行的语言,其中包括某种形式的垃圾收集和/或内存管理。更严格地说,托管语言是针对(通用)运行时(某种实现)的语言,但我的回答不仅适用于它们。
没关系

您认为引用计数的GC方案是否属于la Vala?
weberc2

6

语言选择在很大程度上取决于平台。目前看来,除了Microsoft平台以外,几乎没有其他任何东西实际上需要.NET作为实现。

传统观点认为,小型平台需要靠近金属才能发挥作用,但另一方面,托管平台更安全。这可能是Windows Phone 7强制您使用.NET的原因。

如果新的Xbox需要托管平台,肯定会很有趣。如果电话的硬件可以处理(并且可以),我当然可以看到他们在完整尺寸的控制台上使用它。如果不使用脚本语言编写所有游戏代码,则编写跨平台游戏将更加困难,这将极大地激起控制台生态系统。如果真是这样,那么C#不会取代 C ++,但它会携手并进。

现在,您可以将Mono用作脚本后端(类似于Unity所做的事情),但是我可以想象,大多数引擎制造商要么想要自己动手,要么使用比C#更紧凑的东西(如Lua或Python)。

无论哪种方式,这都是关于正确工作的正确工具。实际上,无论如何,您都应该学习两种语言,因为C#使某些事情(工具开发,服务器开发等)变得更容易,并且在某些情况下您只能使用C ++。


截止到现在,三年后的今天,用于游戏开发的C#状态有了很大的发展。Mono-Project收购了XNA Game Studio,并将其更名为MonoGame。SharpDX,SlimDX和OpenTK都是非常不错的opengl / directx包装器。C#中甚至出现了一些物理引擎。Mono / MonoGame允许您一次构建一个游戏并将其自动移植到android,linux,mac os,ios,xbox 360,ps3,ps4和wii。
瑞安·曼

3

不太可能。C ++的优点是级别较低,因此开发人员实际上可以调整最细微的细节以获得最佳性能。

使用C#和.NET,您有非常有用的垃圾回收,但是当使用内存和资源有限的平台(便携式控制台,在某种程度上是家用控制台)时,您需要对内存进行尽可能多的控制才能充分利用内存资源。允许托管语言为您分配和释放内存很可能会引起很多问题。

速度也是一个问题(尽管可能不是这样)。随着时间的流逝,我确信可以使托管语言的性能与C ++编译器相当。

总的来说,以我的经验来看,游戏开发人员在内存,CPU时间和资源(尽可能地提高性能)方面往往是控制怪胎,这就是为什么C / C ++是主要使用的语言的原因。


2

AFAIK .NET GC仍然遭受停止使用世界级算法的困扰。尽管这可能适用于多种应用程序,但对于游戏等实时应用程序来说却是不可接受的。

实际上,要在GC上取得一些突破,就很难有效地将托管语言用于实时程序。


1

否。依靠.NET可能意味着需要对没有可用框架的平台(如PS3)进行大量重写,并且性能劣势在PC或Live Arcade游戏上可能是完全可以接受的,但是大型游戏将需要所有废品。从其控制台获得的性能足以足够快地运行。不仅如此,C ++中存在着庞大的现有代码库,即使他们愿意,也没有人能够负担得起升级。C ++属于游戏行业,它将长期存在。


尽管存在惯性,但是C ++代码库本身并不那么古老-也许最多10年。在此期间,它们中的几乎所有代码都经过了替换-包括3D加速器,可编程管线,数据驱动的体系结构和脚本支持。如果AAA开发人员想要完全迁移到C#,他们可能可以在三款游戏的空间内以最低的成本实现它-首先将其用作工具和脚本宿主,其次将游戏逻辑层移至其中,并使用第三种端口渲染器使用托管的DX / GL包装器。

1
Mono确实有针对PS3的商业.NET解决方案。
丹·奥尔森,

其次,如果您使用C#针对Mono或monogame(xna替代)构建游戏,则可以将其移植到内置的ps3 / ps4,wii,xbox 360,android,max os等。–
Ryan Mann

0

在计算机能力匮乏的时代,所有事情都需要用C或C ++进行编程,这仅仅是因为垃圾收集的语言使内存控制权脱离了程序员,因此性能可能会下降。

如今,计算机的速度更快,但是正如Knuth所说的,简而言之,优化可能是邪恶的:

  • 显然,底层的核心功能需要优化,因为计算3D几何,物理,碰撞,光照可以迅速使现有的最佳处理器膨胀。您可以很容易地看出,机器上视觉质量的提高几乎总是会严重影响性能。

  • 现在,还有其他功能,例如游戏状态,AI,声音,输入,网络,这些功能在游戏中仍然很重要,但几乎不会占用太多计算机资源。大多数时候,这些功能不必进行优化。这就是脚本语言和垃圾收集语言的目标:您不必考虑内存一致性和应用程序组织,因为如果您不编写底层代码,则使用这些语言编写的代码将永远不会瓶颈。

2例

  • 用卡车运输500kg的家具。
  • 用船运送30吨物料。

两者的距离均为500公里。

在这两种情况下,知道您不能使船或卡车移动得更快,使装/卸过程更快以缩短整个运输时间是否重要?

答案是:与卡车无关紧要,但与船无关,因为您已经通过与船一起移动库存进行了很多工作。

我不知道您是否理解这个隐喻,但是从某种意义上说,它可以让您想象数学问题,这比理解答案更重要。

如果您已经有使用C / C ++编程的引擎,则脚本语言可以使游戏更快:3D引擎解决了底层问题,现在您必须使用脚本来制作游戏。

但是请记住:您绝对永远无法替换低级编译语言EVER。静态类型的编译语言是性能的核心,您不能排除它们是内核,3D引擎还是图形卡驱动程序。

但是,当然,如果您的游戏在图形上很简单并且不需要大量的矢量计算,则您可以专注于游戏玩法而无需进行优化,因为在这种情况下,由于您的计算机运行速度非常快,因此您无需再进行优化为了那个原因

除非您计划在DS上端口ir。但是我会停在那里。


1
迄今为止,“优化可能是邪恶的”,这是我所读过的最无用的变异版本。

好吧,我正在解释它,这就是为什么我发现引用他的整个声明毫无用处的原因,这是一个很长的句子,并没有真正的解释...最重要的是,我们在谈论游戏,这是不一样的Knuth想谈谈更广泛的软件。
jokoon 2011年

您提到输入几乎不会占用许多计算机资源。我想指出的是,随着玩家与游戏之间的联系越来越紧密,这变得越来越不真实。例如,kinect。这是一种输入形式,但是需要大量的计算资源才能使用。
Ponkadoodle

0

瞧,我知道这是种咆哮,但我不仅仅是在分裂头发。我觉得大多数程序员并没有真正把它们放在一起。语言本身与运行速度/性能无关。这是编译器/框架。您最好将gcc反对cl(2010年前的Microsoft编译器)或msbuild(2010的当前c ++编译器)。这些编译器的每个发行版都会变得更好,因此您还必须将它们与自身的早期版本进行比较。.net给我留下了很深刻的印象,它的性能很好,但是即使性能稍好一点,我也看不到它能取代它,原因之一是:可移植性。

AAA游戏想在Windows,Linux,Mac,XBox,PS3,Nintendo等平台上使用。


当然,编译器的实现起了一定的作用,但是不同的语言为编译器驱动的优化提供了不同的能力,而程序员为绕过常用的语言规则并直接与硬件对话则提供了不同的能力。语言和目标本身与性能有很大关系。

语言可能与运行速度/性能有很大关系,因为语法和标准库将支持不同的方法。例如,一种语言,由于它们的所有对象都是指针而很难使用连续内存数组,因此,相比于可以有效使用数组或向量的一种语言,它对缓存的影响更大。
Kylotan

+1非常好,您可以在不侮辱愚蠢的人的情况下提出,他们不知道自己是谁。
Fire Crow,

除了今天,您可以针对mono进行构建,并将其移植到几乎所有内容。例如,它现在具有高度的便携性。
瑞安·曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.