为什么没有很多用Java编写的商业3D视频游戏(不是随机开放源2D游戏)?从理论上讲,这很有意义:您几乎免费地获得了生产力的提高和一个跨平台的应用程序,其中包括大量的Java库和内置的垃圾回收器(尽管我承认我我不确定后者是否是一件好事。那么为什么很少使用它呢?我只能想到为Java平台编写的几个流行的商业游戏。
是因为性能吗?如果是这样,GPU难道不是大部分的繁重工作吗?
为什么没有很多用Java编写的商业3D视频游戏(不是随机开放源2D游戏)?从理论上讲,这很有意义:您几乎免费地获得了生产力的提高和一个跨平台的应用程序,其中包括大量的Java库和内置的垃圾回收器(尽管我承认我我不确定后者是否是一件好事。那么为什么很少使用它呢?我只能想到为Java平台编写的几个流行的商业游戏。
是因为性能吗?如果是这样,GPU难道不是大部分的繁重工作吗?
Answers:
游戏开发世界是一个有趣的世界:一方面,他们通常很快就会接受新的想法,另一方面,他们仍然处在僵局。
事实是,切换到.NET / Java /除C / C ++之外的任何东西的动机很少。
大多数游戏公司从其他公司获得游戏引擎的部分许可。这些部分是用C ++编写的,尽管您可能可以访问源代码以便移植它,但是这需要很多工作(当然,许可证需要允许它)。
同样,C ++中已经存在许多旧代码。如果以前项目中的代码可以重复使用(例如,如果您正在编写续集),则更重要的是坚持使用相同的语言,而不是用新的语言重写(因为这样您可能会重新引入)大量的错误,您需要花费一些时间来解决。
最后,无论如何,用100%C ++编写游戏都是很罕见的-使用脚本语言可以完成很多工作,无论脚本是自定义的,还是只是集成现有的语言(Lua是当今最受欢迎的语言之一)。
就垃圾回收而言,这可能是个问题。问题不仅仅在于它存在,还在于它的工作原理-垃圾收集器必须是非阻塞的(或者至少保证仅非常短暂地阻塞),因为将游戏冻结10秒钟是完全不可接受的,它会扫描所有已分配的内存,以查看可以释放的内容。我知道Java在接近用尽内存时(在某些游戏中,它会)会在GC'ing中阻塞很多。
您在操作上还受到更多限制:由于运行时的开销,您无法充分利用硬件。想象一下Crysis是用Java编写的……即使这是唯一可见的区别,也不会是一样的(我也很确定您需要Core i7来运行它)。
这并不意味着这些语言没有在游戏开发中占有一席之地-不,我不仅指工具编程。对于大多数游戏,您不需要从C ++获得的额外性能(包括3D游戏),而且如果您是从头开始编写所有内容,那么使用XNA之类的东西就很有意义了-实际上,很有机会。
就商业游戏而言-RuneScape算在内吗?那很可能是最成功的Java游戏。
我认为John Carmack最好的说法是:
最大的问题是Java真的很慢。从纯cpu /内存/显示/通讯的角度来看,大多数现代手机应该比Game Boy Advanced更好的游戏平台。使用Java,在大多数电话上,您只剩下大约4.77 MHz原始IBM PC的CPU能力,并且无法控制所有内容。[... snip ...]写一次即可在任何地方运行。哈。哈哈哈哈哈。目前,我们仅在四个平台上进行测试,没有一个具有完全相同的怪癖。所有商业游戏都针对每个(通常为100多个)平台进行了调整和编译。可移植性并不是令人敬畏的性能的理由。
(来源)
当然,他在谈论移动平台,但是我发现Java整体上也存在类似的问题,这些问题都来自C ++背景。我想念能够按照我自己的意愿在堆栈/堆上分配内存。
一方面,Java缺乏运算符重载使得获得工作图形管道所需的所有数学工作变得非常非常烦人且难以阅读。
如果您要处理的所有矩阵乘法和仿射矢量都采用格式正确的数学表达式,而不是诸如面向对象的表达式,则易于遵循
product = vector.multiply(projectionMatrix).dotProduct(otherVector);
那太可怕了。数学看起来不应该那样。
我认为.NET具有与Java相同的许多感知问题。微软在使用XNA开发人员的市场营销方面做得更好:-)
次要分数:
Java带来的任何生产力提升都是假设性的。语法几乎与C ++相同,因此您实际上只是在依靠内存管理和标准库的节省。这些库几乎没有提供给游戏开发人员,并且由于垃圾回收,内存管理是一个有争议的问题。
跨平台“免费”并不如您想象的那样好,因为很少有开发人员想要使用OpenGL,并且几个关键平台可能缺少良好的Java实现或本机库的包装,无论是图形,音频,网络等。
但主要是问题是向后兼容。游戏开发人员从C迁移到C ++,而从汇编迁移到C,纯粹是因为迁移过程很顺利。每个版本都与先前版本紧密互操作,并且它们先前的所有代码通常都可以通过单个编译器以新语言使用。因此,迁移的速度和您想要的一样快。例如,我们今天使用的某些旧标题仍具有#ifdef WATCOMC,而且我认为十年甚至更长时间都没有人在这里使用过Watcom编译器。对旧代码进行了大量投资,并且只有在需要时才替换每个位。如果您更改为一种不会与现有代码进行本机互操作的语言,那么从一个游戏到另一个游戏的零碎替换升级过程实在不切实际。是的,C ++ / Java互操作性是可能的,但是与简单地编写“带有一点C ++的C”或将asm块嵌入C中相比,这是不切实际的。
要适当取代C ++作为游戏开发人员的首选语言,它必须执行以下两项操作之一:
从主观上讲,我认为Java不能满足这两种要求。如果有人足够勇于成为先驱者,那么高级语言可能会遇到第二种语言。(《 EVE Online》可能是我们拥有的Python可用的最佳示例,但它使用了主要的Python语言的分支,许多C ++组件来提高性能,甚至就现代而言,这对于一款要求不高的游戏也是如此。)
我在玩《模拟人生3》,还玩了一些。图形引擎是C ++,而脚本和行为引擎是C#/ Mono。因此,尽管C ++具有时间紧迫性,但诸如交互,游戏逻辑和AI之类的其他东西却是面向对象的托管语言。
Java和其他虚拟机语言未用于游戏的最大原因之一是垃圾收集。.NET也是如此。垃圾收集已经走了很长一段路,并且在大多数类型的应用程序中都非常有效。为了进行垃圾收集,您确实需要暂停并中断应用程序以收集垃圾。发生收集时,这可能导致周期性的滞后。
Java对于实时应用程序也有同样的问题。当任务必须在特定时间运行时,很难像垃圾回收这样的自动化任务来做到这一点。
不是说Java速度慢。Java不能很好地处理实时任务。
性能问题是首要原因。当您看到Quake引擎(http://www.codemaestro.com/reviews/9)中的一种超优化C ++代码时,您会知道它们不会浪费时间在虚拟机上。
当然,可能有一些.NET游戏(哪些?我很感兴趣。是否确实有一些CPU / GPU密集型的游戏?),但我想它的原因更多,因为很多人都是MS技术方面的专家,并且在发布时就跟随Microsoft他们的新技术。
哦,跨平台只是不在视频游戏公司的脑海中。Linux仅占市场的1%,Mac OS仅占市场的百分之几。他们肯定认为不值得抛弃仅Windows技术和DirectX之类的库。
您可以问为什么Web应用程序也不用C或C ++编写。Java的强大之处在于其网络堆栈和面向对象的设计。当然,C和C ++也有。但是在较低的抽象上。那没什么消极的,但是你不想每次都重新发明轮子,是吗?
Java也没有直接的硬件访问权限,这意味着您被任何框架的API所困扰。
当涉及到强大的3D性能时,.NET肯定会遇到与Java相同的问题。在处理3D繁重的操作方面,微软还在库的开发上投入了更多的时间和金钱。
(...就我个人而言,我还认为他们在DirectX和.NET之间的魔术方面有优势)
Java很慢,大部分繁重的工作不是由GPU处理的。仍然有动画,物理和AI冲击CPU,所有这些都非常耗时。
Java在控制台上不存在,控制台是商业游戏的主要目标。如果在PC上使用Java,则将消除在合理的时间和预算内移植到控制台的能力。
在Java流行之前,游戏行业中许多经验丰富的编码人员已经使用C和C ++。以上两点可能有助于做到这一点,但我希望许多专业游戏编码人员真的不太了解Java。
上面关于中间件的其他人的观点是一个很好的观点,因此我将其添加到我的答案中。有很多专门用于与C / C ++链接的遗留代码和中间件,最后我检查了Java是否具有良好的互操作性。对于大多数公司而言,使用Java会涉及抛出很多代码,其中许多代码已经以某种方式付了钱。
Jagex的Runescape是用Java编写的,“视频游戏”标签可能没有专门应用于在线游戏,但确实有不错的关注者。
已经讨论了很多,即使在Wiki上您也可以找到原因...
而且我听到越来越多的Java程序员试图说服人们Java并不慢,在屏幕上绘制窗口小部件并在窗口小部件上绘制一些ASCII字符以通过网络接收和发送数据并不慢。建议在这种情况下(网络数据操作)而不是C / C ++使用它。)但是在涉及诸如数学计算,内存分配/操作之类的重要工作时,它确实非常慢。
我记得在MIT网站上有一篇文章,其中展示了如果您使用语言和编译器功能,C / C ++可以做什么:矩阵乘法器(2个矩阵),Java中的1种实现和C / C ++中的1种实现以及C / C ++特性并激活了适当的编译器优化,C / C ++实现比Java实现快296 260倍。
我希望您现在能理解为什么人们在游戏中使用C / C ++而不是Java,想象一下Java中的《孤岛危机》,在这个世界上将没有任何计算机可以处理此问题……+垃圾收集对于仅破坏了图像的小部件来说还可以但它仍被缓存在其中,需要清理,但对于游戏来说不需要清理,可以肯定的是,每次垃圾回收激活都会有更多的滞后。
编辑:因为有人要这篇文章,在这里,我在网络档案中搜索了该内容,希望您满意... MIT案例研究
而且,不,用于游戏的Java仍然是一个糟糕的主意。几天前,一家我不愿透露姓名的大公司开始将他们的游戏客户端从Java 重写为C ++,因为一个非常简单的游戏(就图形而言)落后并给配备强大nVidia GT 5xx和6xx代显卡的i7笔记本电脑供热(不仅是nVidia,关键是这种功能强大的卡可以处理大多数新游戏的Max设置,而不能处理该游戏),并且内存消耗约为2.5-2.6 GB Ram。对于这样简单的图形,它需要一台机器。