我很好奇为什么C ++在游戏开发中如此流行,而不是其他语言。我知道您可以使用它创建非常快速的代码,但是究竟是什么使它流行呢?
仅仅是因为它速度快吗?它是语言的其他功能吗,例如OO范例或可移植性?是因为所有随时间推移创建的库吗?还是所有这些(和其他)原因的某种组合?
如果有人可以帮我解决这个问题,我会很高兴的。:-)
我很好奇为什么C ++在游戏开发中如此流行,而不是其他语言。我知道您可以使用它创建非常快速的代码,但是究竟是什么使它流行呢?
仅仅是因为它速度快吗?它是语言的其他功能吗,例如OO范例或可移植性?是因为所有随时间推移创建的库吗?还是所有这些(和其他)原因的某种组合?
如果有人可以帮我解决这个问题,我会很高兴的。:-)
Answers:
众多原因:
除了@Graham提出的内容外,还有其他一些原因,我想提及。
low-level
语言;而是high-level
IMO 的汇编器
在C ++中,您可以分配函数结束后消失的局部变量。通常,这些是在堆栈上分配的。
堆栈变量不会导致碎片和开销的动态内存分配问题。在堆栈上分配空间既快速又容易(只需调整指针)。动态内存分配通常涉及在容器中搜索足够的内存块,标记内存,然后将其标记为已占用。解除分配涉及将内存块添加到容器,并可能将其与现有块合并。比改变指针要多得多的开销。
Java和C#动态地分配内存,原始类型除外。这些语言取决于运行时环境,该环境将标记要删除的变量,然后以随机(未计划的)时间间隔运行垃圾回收器以回收内存。通常,程序员无法控制何时将变量标记为删除或何时回收(回收使用的内存是大多数C ++和Java程序员都不会遇到的高级主题)。
C ++的速度主要是由于其直接转换为可执行代码。Java和C#被编译为中间代码,然后由虚拟机解释。通常,解释性语言的性能要比直接翻译的语言慢。
structs
。更重要的一点,非常非常的速度小幅增长这个网你是不是近足够的理由比其他一种语言。真正的原因由@Graham Perks陈述:这是游戏开发人员应该知道的,因此这是新游戏开发人员学习的内容以及新SDK的目标。有许多语言(例如Go),它们的速度或快或慢,而编写起来几乎不那么麻烦。
游戏曾经是用机器语言编写的,因为它们具有没有编译器的奇特硬件。硬件还缺少C程序员认为理所当然的功能,例如高效的16位整数数学。
一旦将游戏安装在熟悉的硬件上,便可以使用C编译器,并在很短的时间内用C编写所有游戏。
C ++似乎是一个好主意,现在大多数游戏都是C ++,但是工程师现在正在抱怨回归C,这实际上可能会发生。我很想从事C语言的游戏,许多同事也是如此。我认为C ++没有新功能可以改善游戏。
现在看来,计算机的速度比几年前快了1000倍,一种高级语言会减少开发时间($),从而使C语言过时。
之所以没有发生这种情况,是因为游戏购买者知道硬件要好1000倍,并希望用自己的钱换成外观和听觉要好1000倍的游戏。这消除了高级语言将消耗的系统松弛。
游戏中的性能要求是残酷的。一个新的图形帧必须在33毫秒(或16毫秒!)之内渲染,并且不能失败。必须考虑硬件所做的一切,以便可以满足此预算。任何一种在程序员无法理解或期望的硬件上不起作用并且无法正常工作的语言都将很难满足这一预算。这是对任何高级事物的自动减号。
游戏程序员不仅使用低级语言工作,而且还避免使用高级数据结构和算法。游戏通常没有链表,很少有树。尽可能避免使用指针*。任何时间超过O(N)或O(1)空间的算法都不会得到广泛的应用。
*如果指针不会导致高速缓存未命中,那么为什么要花费32位存储它呢?如果指针确实导致高速缓存未命中,则最好摆脱该高速缓存未命中。
human
具有导数player
和enemy
?的类
每种编程语言在多种因素上都有其优缺点。这些因素的示例是:
游戏程序员关心的最重要因素之一就是性能。他们想产生一种交互式的体验,这意味着它必须具有反应性,并能够输出尽可能多的有用(或有趣)数据。您想随时知道自己的健康状况,不想等待。而且,如果您单击一个按钮,那么您说的话会期望枪响或角色跳跃。稍有延迟会干扰这种交互性,因此您需要性能。
另一个重要因素是倾向于使用问题的语言而不是实现的语言进行编程。游戏程序员想要处理人类,兽人和赛车,而不是内存寄存器ED0。他们仍然需要在需要性能的情况下深入实现细节的选项,但是如果在大多数情况下他们可以在游戏世界中处理实体级别,那就太好了。他们有足够的担心去模拟游戏世界,而不必总是在意链表的工作原理。
C ++非常适合这两个主要因素。通过对象的表现力,您可以受益于汇编或C代码的性能优势。要了解为什么这自然适合游戏,请与其他一些语言选项进行比较:
最后一点是,其中一些是历史和政治上的。在不同的编程语言之间发生了许多火焰之战。例如,C#可能同样适合游戏开发,但它是在C ++之后出现的。或者人们不喜欢它来自微软。有些人转向了C#,有些则没有。某些人仍然使用BASIC,Pascal和C编写游戏。无论程序员喜欢什么,他们都会坚持。游戏程序员大多对C ++感到满意,可能是因为他们与C和C ++一起成长,并且满足了他们的需求。如果计算机行业处于Java的性能和普及程度足以满足人们需求的状态,那么Java可能会成为事实上的标准游戏开发语言。
尽管我相当反对C,C和C ++,但是他们确实拥有很少的其他语言所拥有的一件事就是对其运行平台的完全控制,您可以确定到底会一直在发生什么,没有GC,无故障。
如今,这并不那么重要,但是对于功能不足的平台来说可能如此。
在PC / Mac / Linux上,这可能是您最近遇到的最少可移植的语言,并且速度奖励不再有太大的区别-Minecraft(Java)流畅且可在非常小的平台(和任何OS)上运行具有单个可执行文件-我还没有看到一个低人力的indi C / C ++应用程序,它具有尽可能多的功能和很少的错误,更不用说可以在三个平台上工作了。
因此,在这一点上,我要说的是,大多数是惯性,而真正的游戏总是用C / C ++完成的概念,尽管“移植”到iPhone和游戏机的能力很重要(尽管我相当确定除了在Windows和XBox之间进行移植之外,游戏的用户界面还需要花费很多精力。