与C ++竞争游戏编程


21

我很好奇为什么C ++在游戏开发中如此流行,而不是其他语言。我知道您可以使用它创建非常快速的代码,但是究竟是什么使它流行呢?

仅仅是因为它速度快吗?它是语言的其他功能吗,例如OO范例或可移植性?是因为所有随时间推移创建的库吗?还是所有这些(和其他)原因的某种组合?

如果有人可以帮我解决这个问题,我会很高兴的。:-)


7
速度对我来说是足够的理由,尤其是因为每个人对语言的抱怨对我来说都不是很有意义。
本杰明·林德利

快速猜测:大多数游戏都是为Windows编写的。Microsoft已大力支持C和C ++语言。最后,由于OOP和模板元编程,因此首选C ++。

@马特谢谢,不知道它的存在。我可以将主题移到那里,还是应该删除该主题然后在那重新创建?

这已经被问过好几次了。
Zan Lynx

1
@Benjamin:那我敢说您还没有用C ++编写足够的东西,或者您从未使用过像Python这样的更具表现力的语言(甚至是带有LINQ的C#)。但是,即使出于某种疯狂的原因,您更愿意为许多其他语言在1中编写的代码编写20行代码,C ++ 极差的 语法意味着程序编译所需的时间大大超过了它们,并且使用了适当的IDE工具(重构等)。如果不是不可能的话,创建起来会更困难。
BlueRaja-Danny Pflughoeft

Answers:


29

众多原因:

  • 您错过的最重要的东西:它是便携式的,简化了将游戏引擎移植到iOS,XBOX,PS3等任何设备的过程
  • 它很快
  • 所有SDK均原生支持
  • 有很多图书馆
  • 每个编写游戏的人都知道,因此很容易为您的团队雇用经验丰富的游戏开发人员
  • 嵌入像Lua这样的游戏引擎脚本语言很简单

好了,谢谢大家的回答,您已经满足了我的想法。:-)
KasMA1990

14

除了@Graham提出的内容外,还有其他一些原因,我想提及。

  • 旧版代码-许多工作室都有很多C ++代码,您可以参考库。
  • C ++实际上是一个高级汇编程序,可以直接访问硬件(至少可以直接在操作系统之上运行),而且速度非常快。如果需要,可以在C ++中直接使用汇编语言进行指令级控制(并非总是如此,这在Java,C#,Python等中是不可能的)
  • DirectX和OpenGL本机支持C ++,大多数其他语言都通过中间层与底层库“绑定”,这并不是说它们不够快或不能做很多相同的事情,但是它在两者之间增加了一层软件。您的游戏和硬件。
  • 正如@Graham所提到的那样,许多程序员都知道它,因此与卡在.NET Framework上的C#(存在Mono)相比,它易于找到有经验的开发人员,并且也非常可移植(存在Mono,但通常落后于Microsoft实现的一代人)。 )

你不是说低级的吗?
2011年

5
C ++是一种low-level语言;而是high-levelIMO 的汇编器
Nate

3
我不同意。C ++是一种高级语言,其内置功能可依赖于C(这是一种低级语言)。
foo

7
C ++和C一样都是高级语言。汇编是低级语言。现在,C ++比C更高,就像C#高于C ++和Ruby / Python高于C#。
AA Grapsas 2011年

4
为什么不推荐使用旧代码(不推荐使用)?“旧版代码”仅表示它很旧,而不是很糟糕。

8

原始速度是主要原因,但实际上这不是一个非此即彼的决定,因此许多游戏公司开始在游戏的某些部分中使用其他语言。某些任务要求计算机尽可能快地工作(例如,核心渲染例程),但是游戏代码中的许多任务并不需要那么快地运行(例如,当玩家单击门时将门打开),这意味着它为这些部分使用更简单(因此更快地编写程序)的语言是很聪明的。这就是为什么许多游戏引擎都是用C ++编写的,但是嵌入了诸如Lua之类的脚本语言来编写游戏代码的原因。

棘手的事情是,在选择编程语言时,计算机的效率和程序员的效率之间存在一个整体的权衡。也就是说,对您而言更重要的是计算机运行代码的速度或程序员编写代码的速度如何?


3

在C ++中,您可以分配函数结束后消失的局部变量。通常,这些是在堆栈上分配的。

堆栈变量不会导致碎片和开销的动态内存分配问题。在堆栈上分配空间既快速又容易(只需调整指针)。动态内存分配通常涉及在容器中搜索足够的内存块,标记内存,然后将其标记为已占用。解除分配涉及将内存块添加到容器,并可能将其与现有块合并。比改变指针要多得多的开销。

Java和C#动态地分配内存,原始类型除外。这些语言取决于运行时环境,该环境将标记要删除的变量,然后以随机(未计划的)时间间隔运行垃圾回收器以回收内存。通常,程序员无法控制何时将变量标记为删除或何时回收(回收使用的内存是大多数C ++和Java程序员都不会遇到的高级主题)。

C ++的速度主要是由于其直接转换为可执行代码。Java和C#被编译为中间代码,然后由虚拟机解释。通常,解释性语言的性能要比直接翻译的语言慢。


1
-1(如果可以的话)-Java和C#都在堆栈上分配了本地基元,在C#中,您可以创建stack-allocated structs。更重要的一点,非常非常的速度小幅增长这个网你是不是足够的理由比其他一种语言。真正的原因由@Graham Perks陈述:这是游戏开发人员应该知道的,因此这是新游戏开发人员学习的内容以及新SDK的目标。有许多语言(例如Go),它们的速度或快或慢,而编写起来几乎不那么麻烦。
BlueRaja-Danny Pflughoeft 2011年

C ++在堆栈分配方面不是很好。实际上,很难在堆栈上分配与STL兼容的对象。例如,我使用的最后一个大型引擎是C语言,我们有一个字符串,可以在栈上以某个固定大小(通常为1K)开始。如果超过了它,它将透明地移动到堆中。您可以使用C ++中的std :: string自定义分配器来做一些类似的事情,但是正确的代码非常棘手。

1
@Joe Wreschnig:C ++在堆栈分配方面非常出色,只需转储汇编语言列表即可。但是,大多数编译器供应商不会为堆栈分配大量内存。对经验丰富的C ++程序员的普遍理解是,巨大的对象是动态分配(堆)而不是本地存储(堆栈)。随着堆栈和堆向彼此靠近,堆栈上的巨大对象可能在某些平台上溢出到堆中。
Thomas Matthews

1
对更有经验的C ++程序员(尤其是游戏机上的C ++程序员)的普遍理解是,不会使堆栈溢出的所有内容都是堆栈分配或预分配的。C使这很容易,因为分配器不是对象结构类型的一部分。这也使得有可能错误地释放某些东西,但是根据我的经验,与搞砸与stdlib兼容的分配器实现/兼容性的人相比,这是一个罕见的问题。也有一些技巧与布局新的,但同样,这比C中的等价复杂

2
不会。C++的速度优势是由于它能够使用您自己的自定义编写的内存管理器进行分配。每种理智的语言都会在堆栈上分配本地人。
没关系

3

游戏曾经是用机器语言编写的,因为它们具有没有编译器的奇特硬件。硬件还缺少C程序员认为理所当然的功能,例如高效的16位整数数学。

一旦将游戏安装在熟悉的硬件上,便可以使用C编译器,并在很短的时间内用C编写所有游戏。

C ++似乎是一个好主意,现在大多数游戏都是C ++,但是工程师现在正在抱怨回归C,这实际上可能会发生。我很想从事C语言的游戏,许多同事也是如此。我认为C ++没有新功能可以改善游戏。

现在看来,计算机的速度比几年前快了1000倍,一种高级语言会减少开发时间($),从而使C语言过时。

之所以没有发生这种情况,是因为游戏购买者知道硬件要好1000倍,并希望用自己的钱换成外观和听觉要好1000倍的游戏。这消除了高级语言将消耗的系统松弛。

游戏中的性能要求是残酷的。一个新的图形帧必须在33毫秒(或16毫秒!)之内渲染,并且不能失败。必须考虑硬件所做的一切,以便可以满足此预算。任何一种在程序员无法理解或期望的硬件上不起作用并且无法正常工作的语言都将很难满足这一预算。这是对任何高级事物的自动减号。

游戏程序员不仅使用低级语言工作,而且还避免使用高级数据结构和算法。游戏通常没有链表,很少有树。尽可能避免使用指针*。任何时间超过O(N)或O(1)空间的算法都不会得到广泛的应用。

*如果指针不会导致高速缓存未命中,那么为什么要花费32位存储它呢?如果指针确实导致高速缓存未命中,则最好摆脱该高速缓存未命中。


1
“我认为C ++没有新功能可以改善游戏。” 大声笑?哎呀 human具有导数playerenemy?的类
orlp 2011年

2
@nightcracker:基本的is-a继承在C中工作正常;无论如何,出于性能和整洁的原因,使用has-a可以更好地实现您描述的关系。

3
越来越多的人认为C ++的OOP功能不适用于游戏,因为这些功能是基于对缓存性能不利的假设进行的。
bmcnett 2011年

即使您认为C ++不能提供优于C的优势,您也应该肯定地认识到,返回C也不能提供优于C ++的优势。
丹·奥尔森,

@Dan返回C的好处是,诸如不使用模板或OOP之类的“最佳实践”是由编译时错误强制执行的,而不是像拐弯抹角地追逐初级程序员。同样,由于该语言更简单,大概编译器和调试器维护也更便宜。
bmcnett 2011年

3

每种编程语言在多种因素上都有其优缺点。这些因素的示例是:

  • 在特定平台上提高速度
  • 特定平台上的内存使用情况
  • 它更容易公开哪些功能
  • 它存在于什么平台上
  • 程序员必须考虑哪些因素

游戏程序员关心的最重要因素之一就是性能。他们想产生一种交互式的体验,这意味着它必须具有反应性,并能够输出尽可能多的有用(或有趣)数据。您想随时知道自己的健康状况,不想等待。而且,如果您单击一个按钮,那么您说的话会期望枪响或角色跳跃。稍有延迟会干扰这种交互性,因此您需要性能。

另一个重要因素是倾向于使用问题的语言而不是实现的语言进行编程。游戏程序员想要处理人类,兽人和赛车,而不是内存寄存器ED0。他们仍然需要在需要性能的情况下深入实现细节的选项,但是如果在大多数情况下他们可以在游戏世界中处理实体级别,那就太好了。他们有足够的担心去模拟游戏世界,而不必总是在意链表的工作原理。

C ++非常适合这两个主要因素。通过对象的表现力,您可以受益于汇编或C代码的性能优势。要了解为什么这自然适合游戏,请与其他一些语言选项进行比较:

  • 组装:这是原始动力。您编写的基本上就是CPU的工作。但是,在每个阶段,您都需要了解寄存器的操作及其效果,并且它永远不会像游戏世界中的实体那样。程序员必须对自己的代码和游戏中发生的事情进行心理上的对应。这可能是一个很大的精神负担。
  • C:这里的性能不错,但是我们可以利用专家的经验来完成标准的事情(例如分配内存,对字符串进行操作并使用标准的数学函数)。我们在这里更接近于表达性,但是这种语言或多或少会迫使您专注于实现,因为您实际上只能对普通数据类型进行操作。一切实际上都是char,int等。结构,指针和数组可以将事物保持在一起,但仍需考虑内部因素。
  • Java:我们超越了C ++,并涉足Java。Java进一步远离实现细节。实际上,很多时候您都无法访问较低级别的内容。Java出于实现跨平台的原因而将许多实现细节(例如,您正在使用的CPU或OS)抽象化了。您无法访问详细信息,因为它们不存在。您不需要为计算机编程,而可以为平台(Java平台,大多数计算机上都存在)编程。而且,与C ++相比,Java可以更好地处理问题的语言。折衷是您无法针对特定计算机进行优化。这是否在实际上有所不同取决于程序和计算机的细节。
  • 游戏脚本语言:我的意思是像UnrealScript或捆绑在游戏引擎上的自定义脚本语言。在这些目录中,您无权访问基础引擎。您可以将性能考量委派给引擎,而不必担心制作游戏。编写游戏更容易,而自己优化性能也不容易。
  • Haskell(或您最喜欢的晦涩语言):任何图灵完备的编程语言都等效。因此,尽管您可以用任何语言编写任何程序,但都需要权衡,一些客观,一些主观。像Haskell这样的语言更专注于以数学精神工作。它面向的问题与游戏中面临的问题有所不同。这并不意味着它不能或不应该用于游戏,只是它不容易适应它。

最后一点是,其中一些是历史和政治上的。在不同的编程语言之间发生了许多火焰之战。例如,C#可能同样适合游戏开发,但它是在C ++之后出现的。或者人们不喜欢它来自微软。有些人转向了C#,有些则没有。某些人仍然使用BASIC,Pascal和C编写游戏。无论程序员喜欢什么,他们都会坚持。游戏程序员大多对C ++感到满意,可能是因为他们与C和C ++一起成长,并且满足了他们的需求。如果计算机行业处于Java的性能和普及程度足以满足人们需求的状态,那么Java可能会成为事实上的标准游戏开发语言。


2

遗产和动力。

曾几何时,代码是用汇编程序编写的,以实现最佳性能。随着计算能力的提高,编译语言变得更加可行,并且C提供了功能和生产率之间的最佳折衷,在最基本的层次上,它只不过是宏汇编程序而已。

C ++只是C语言的自然继承者。您不会丢掉任何以前的代码或知识,但有可能扩展到新的方法论中。C ++最终非常灵活,我还没有看到一种设计范例,该范例至少不能在C ++中进行仿真,同时能够保持对性能的几乎完全控制。


2

如果要为控制台进行开发,则别无选择:专业的SDK仅提供C ++版本。通常,他们还可以使用C语言访问大多数事物。

因为许多开发人员都是控制台+ PC,所以用相同的语言来完成其所有PC工作并直接共享技术是很有意义的。

因为那是专业行业赖以生存的地方,并且大多数人都希望参与其中,所以大多数游戏程序员都是C ++程序员。

因为所有这些都发生了,所以大多数引擎开发人员也是C ++开发人员,因此在评估专业级引擎时,几乎所有选择都是C ++。

这都是一个强大的自我维持引擎。破坏它不仅需要技术上的进步。


2

FWIW:C#在游戏开发中越来越受欢迎。参见Miguel de Icaza的博客文章。非常有趣的阅读,恕我直言。


2
像往常一样,Miguel在推崇自己喜欢的(通常是边际的)技术的同时,忽略了C#实际上已成为行业中的重要角色的方式,例如XNA。

2

尽管我相当反对C,C和C ++,但是他们确实拥有很少的其他语言所拥有的一件事就是对其运行平台的完全控制,您可以确定到底会一直在发生什么,没有GC,无故障。

如今,这并不那么重要,但是对于功能不足的平台来说可能如此。

在PC / Mac / Linux上,这可能是您最近遇到的最少可移植的语言,并且速度奖励不再有太大的区别-Minecraft(Java)流畅且可在非常小的平台(和任何OS)上运行具有单个可执行文件-我还没有看到一个低人力的indi C / C ++应用程序,它具有尽可能多的功能和很少的错误,更不用说可以在三个平台上工作了。

因此,在这一点上,我要说的是,大多数是惯性,而真正的游戏总是用C / C ++完成的概念,尽管“移植”到iPhone和游戏机的能力很重要(尽管我相当确定除了在Windows和XBox之间进行移植之外,游戏的用户界面还需要花费很多精力。


1
哦,我不知道这只对“动力不足”的平台重要。换个角度看,游戏始终是任何平台上性能的最前沿:任何新功能都会立即被吞噬。如果我们正在谈论专业游戏开发,那么性能几乎是主要关注的问题:如果不最大化机器必须提供的每个最后周期,就不会编写Unreal。每个 单; 周期。在每个级别上,从图形引擎和磁盘访问到您的UI循环。
克里斯·苏巴乔

@克里斯:我发现向非游戏程序员描述它的最好方法是,游戏是速度是竞争优势的领域。如果您的文字处理器在5秒钟内启动(其中MS Word花费10),或者在0.1秒钟内重排(其中Word花费0.2),则毫无价值。但是,如果您的游戏可以抽出甚至更多的10%片段或显示出更详细的角色,那将是巨大的竞争优势。

那么,除了汇编语言以外的任何代码都不会愚蠢吗?这肯定会至少快10%。在某个时候,您会呼吁权衡性能,以提高可维护性和开发速度。通常这些天来就是C ++。如果像Minecraft这样的跨平台功能具有更大的分量,那就太好了。
比尔K

嗯,但是汇编代码的速度更快是一个谬论:当前的芯片足够复杂,程序员很难始终如一地胜过编译器。只有在PS3上的SPU等更受约束的域中,GPU上的内部物理循环和着色器仍然具有明显的优势。C ++确实是当前的最佳选择,但要注意的是OOP并不总是最好的选择:正在进行中的Arrays Struct与Structs Array讨论并非完全是语言讨论,但是C ++显然会自然地带您进入AoS。有时...你真的只是想C.
克里斯Subagio

汇编程序和C / C ++之间的程序员效率步骤也比C和C ++或C ++和C#/ Java之间的程序员效率步骤高一个数量级。Fred Brooks在25年前指出了这一点。
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.