为什么游戏开发人员首选C / C ++?


14

有人说它为开发人员提供了更多的控制权,但是可以通过C ++进行控制的到底是什么,而不能使用Java进行控制?

Answers:


21

Java在虚拟机中运行,而C ++直接在硬件上运行。这意味着您可以更好地控制内存的存储位置以及在C ++中使用内存进行的操作。

Java是一种垃圾回收语言。您无法直接控制自己的记忆。您可以分配新的内存块,但是无法控制删除时间。垃圾收集器检查每x帧分配的每个内存,并确定它是垃圾还是仍在使用。

对于游戏而言,这可能是灾难性的。垃圾收集器每隔几帧就会检查一次您所做的每个分配,以查看是否仍在使用它?谈论减速!

其次,我们使用的大多数库都是用C或C ++编写的。我说的是Scaleform,Havok物理引擎,PhysX,SpeedTree等。所有专业软件包,在行业中广泛使用。如果另一种语言想成为国王,它会更好地支持他们。

我个人认为Java对于桌面应用程序和应用程序确实很不错,但对于游戏却不是。Java为开发人员提供了许多不错的工具,并且从理论上讲,它可以在具有Java虚拟机实现的任何平台上运行,但是我仍然更喜欢C ++,因为我需要对内存进行控制。尤其是当您开始使用奇异的数据结构(红黑树,双向链表等)时,它有助于保持所有内存分配的良好概览。

我并不是说:不要使用Java。我的意思是:考虑一下为什么要使用Java。Minecraft是用Java构建的,因此当然可以用Java构建游戏。但是,如果它是用C ++构建的,那会是更好的游戏吗?好吧,要使其在三大平台(Windows,MacOS,Linux)上运行当然不是那么便宜,但是即使如此,它在开发中也遇到了许多特定于平台的错误,Java无法消除这些错误过度。

现在有大量的C ++框架供初级程序员使用。确实没有任何不学习的借口,特别是如果您想进一步发展该行业。


1
只是一个小问题,但在大多数操作环境下,本机代码在虚拟机中运行。Java在虚拟机内部的虚拟机中运行。
Skyler Saleh 2012年

1
@RTS:调用op-> micro-op转换为虚拟机有点困难,如果您正在这样做的话。

不,我说的是现代操作系统将所有应用程序放入的虚拟机,以实现安全的多任务处理。在没有微操作(RISC)的体系结构上运行的OS上会发生这种情况。这包括虚拟内存,软件中断,用于并发硬件访问的系统,操作系统调度程序和寄存器文件的处理。
Skyler Saleh 2012年

@RTS我不确定任务隔离是否真的可以作为VM。它是带有内置保护的RM(Real Machine)。在fetch / exec之间没有明显的指令抽象层。编译器和链接器根据需要生成可重定位的代码。CPU为此提供了大部分的硬件支持-消除了“虚拟”方面。
3Dave 2012年

2

简短的答案:C ++可以编译为本机代码,因此性能取决于开发人员,而不是运行时或VM。

长答案:

C ++“更快”与C ++无关。目前,它是可为多种平台生成独立的本机代码的工具所支持的极少数可用语言之一。

过去,您可以使用C,C ++,BASIC / 2,Delphi等,并获得高效,独立的可执行文件。语言的选择是个人喜好和市场力量的问题。

这些天来,“ C ++更快”的假设基本上是一种自我实现的预言,尽管LLVM可以很好地改变它,因为它可以使解析器中的所有内容都变得像过去一样。

Borland说得对:解析了多种语言,首先应用了优化,然后传递给通用的后端编译器和链接器。实际上,这是LLVM的主要成就之一。

Java的结构使得没有JVM很难实现。奇怪的是,通常并错误地假定C#大致等效于Java,它已经在包括iOS在内的多个平台上编译为本机代码。

我的圣诞节清单顶部?一个时光机,可以返回并向C ++添加属性,真正的异常处理和实际的WORKING多态性,并摆脱解析器可以自行找出的f“ d向上箭头语法。前,因为它是愚蠢的。


您是说间接成员访问(如h-> x)?删除它会使句柄和智能指针类型的使用减少。如果您争用仅针对原始指针进行更改,则只会降低语言的一致性。
Lars Viklund

1
C ++的多态性有什么用?
Casey 2012年

@LarsViklund是的,这就是我的意思。但是,尽管地址,取消引用和成员运算符(&,*,:::-> ...)都有不同的含义,但在大多数情况下,有可能从上下文推断出错误的结果。可以像其他语言一样预先简化事情。这是一个较小的症结,但有可能增加代码复杂性(并因此增加开发时间和成本)。
3Dave 2012年
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.