为什么只用Java编写几个video游戏?

为什么用Java编写的商业化的3Dvideo游戏(不是随机的开源2D游戏)呢? 从理论上讲,这非常有意义:除了其他方面,例如大量的Java库以及内置的垃圾收集,您几乎可以免费获得生产力提升和跨平台的应用程序(尽pipe我承认我“我不确定后者是不是一件好事)。 那为什么很less用? 我只能想到一些为Java平台编写的热门商业游戏。

是因为performance吗? 如果是这样的话,大部分的繁重工作不会由GPU完成吗?

游戏发展的世界是一个有趣的游戏:一方面,他们经常很快接受新的想法,另一方面,他们仍然处于石器时代。

事实是,在切换到.NET / Java /除C / C ++以外的其他任何东西中都没有那么多的动机。

大多数游戏公司从其他公司许可部分游戏引擎。 这些部分是用C ++编写的,虽然你可能有权访问源代码,所以你可以将它移植,这需要花费很多的努力(当然,许可证需要允许)。

而且,C ++中已经存在大量的遗留代码。 如果以前项目的代码可以重复使用(比如说,如果你正在编写续集),那么更重要的是坚持用相同的语言,而不是用新的语言重写它(更重要的是,因为你可能会重新引入一吨你需要花费时间熨烫的错误。

最后,反正用100%C ++编写游戏是很less见的 – 很多是使用脚本语言完成的,不pipe它们是自定义还是只是整合现有的语言(Lua现在是最stream行的语言之一)。

就垃圾收集而言,这可能有点问题。 问题不在于它存在,而在于它是如何工作的 – 垃圾收集器必须是非阻塞的(或者至less保证只能非常短暂地阻塞),因为让游戏冻结10秒是不可接受的它会扫描所有分配的内存以查看可以释放的内容。 我知道Java在接近耗尽内存时往往会扼杀GC(对于某些游戏而言,它会)。

你可以做的事情也受到一些限制:由于运行时间的开销,你不能充分利用硬件。 想象一下Crysis是用Java编写的…即使这是唯一可见的区别,它也不会是相同的(我也很确定你需要一个Core i7来运行它)。

这并不意味着这些语言在游戏开发中没有自己的位置 – 不,我不只是指工具编程。 对于大多数游戏来说,你不需要从C ++中获得额外的性能,包括3D游戏,如果你是从头开始编写的话,使用像XNA这样的东西是非常合理的 – 事实上,好机会。

就商业游戏而言, RuneScape算不算? 那可能是那里最成功的Java游戏。

我认为约翰·卡马克最好的说:

最大的问题是Java真的很慢。 在一个纯粹的CPU /内存/显示器/通信级别上,大多数现代手机应该是比Game Boy Advanced更好的游戏平台。 使用Java,在大多数手机上,您将会看到原始的4.77 mhz IBM PC的CPU性能,以及对所有内容的糟糕控制。 [… snip …]写入一次运行的任何地方。 哈。 哈哈哈哈哈。 我们现在只在四个平台上进行testing,而没有一对具有完全相同的怪癖。 所有的商业游戏都是针对每个(通常是100多个)平台进行调整和编译的。 可移植性不是可怕的性能的理由。

( 来源 )

当然,他正在谈论移动平台,但是我发现Java的整体来自C ++背景也遇到类似的问题。 我想以自己的方式能够分配堆栈/堆内存。

一方面,Java缺乏运算符重载,使得你必须处理的所有math问题都变得非常烦人,难以阅读。

所有你需要处理的matrix乘法和仿射vector,如果它们处于格式良好的mathexpression式而不是面向对象的expression式

product = vector.multiply(projectionMatrix).dotProduct(otherVector); 

这太糟糕了 math不应该是这样的。

我认为.NET(Java)有许多与Java相同的感知问题。 微软在向XNA的开发者营销方面做得更好:-)

小点第一:

  • Java的任何生产力提升都是假设的。 语法与C ++几乎完全相同,所以您只需从内存pipe理和标准库中节省开支。 由于垃圾收集,图书馆几乎没有提供游戏开发者和内存pipe理是一个有争议的问题。

  • 跨平台的“免费”不如你想象的那么好,因为很less有开发者想要使用OpenGL,而且几个关键平台可能缺乏一个好的Java实现或者其本地库的包装,无论是graphics,audio,networking等等。

但主要的问题是向后兼容。 游戏开发者从C迁移到C ++,而从汇编迁移到C,纯粹是因为迁移路线很顺利。 每一个都与之前的密切合作,他们以前的所有代码都可以通过单一的编译器以新语言使用。 因此,迁移速度如您所愿或缓慢。 例如,我们今天使用的一些旧的头文件仍然有#ifdef WATCOMC ,并且我不认为在十年或更长时间内有人使用过Watcom编译器。 旧代码有巨大的投资,每一位只是根据需要被replace。 如果您更改为与您的现有代码无法本地互操作的语言,那么从一个游戏到另一个游戏replace和升级零碎的过程就不那么实际了。 是的,C ++ / Java的互操作性是可能的,但是与简单地用C写一个“C”或者在C中embeddedasm块相比是非常不切实际的。

要正确地取代C ++作为游戏开发者所select的语言,它必须做以下两件事之一:

  1. 易于与现有的遗留代码进行互操作,从而保持投资并保持对现有库和工具的访问
  2. 显而易见,在生产力提升方面显示出足够的重要性,以至于重写所有自己的代码(或将接口重新devise为可从该语言使用的可重用组件)的成本已经超过了上述范围。

主观上,我不认为Java会遇到这两者之一。 如果有人勇敢地成为先驱,那么更高级的语言可能会遇到第二名。 (EVE Online可能是我们可以使用Python的最好例子,但是它使用了主要的Python语言的分支,许多C ++组件的性能,甚至在现代条件下也是相当低的游戏。

我正在玩模拟人生3,我做了一些周围的事情。 graphics引擎是C ++,而脚本和行为引擎是C#/ Mono。 所以,虽然C ++有时间要求,但其他的东西,比如交互,游戏逻辑,人工智能都是面向对象的托pipe语言。

  • 游戏引擎/库有没有好的端口?
  • 许多C / C ++开发人员,特别是Windows上的开发人员(大多数商业游戏都是编写的)都熟悉Visual Studio。 在IDE中没有比较。
  • 一般来说,Java已经被销售给了企业,因为它的打字很牢固,并且没有内存pipe理问题。
  • 是的,Java仍然有一个缓慢的感觉,内存pipe理很差,对于游戏来说,它可能不适合这个任务。 正如其他一些答案所述,垃圾收集在处理实时高性能需求时不会削减垃圾收集。 video游戏将CPU和GPU推到极限。

Java和其他虚拟机语言不被用于游戏的最大原因之一是垃圾收集。 .NET也是一样的。 垃圾收集已经有很长的路要走,并且在大多数types的应用程序中工作得很好。 为了做垃圾收集,你需要暂停和中断应用程序来收集垃圾。 发生收集时可能会导致周期性滞后。

Java对实时应用程序也有同样的问题。 当任务必须在特定的时间运行时,很难有一个自动化的任务,比如垃圾收集方面的。

Java并不是很慢。 Java不擅长处理实时任务。

一个很大的原因就是video游戏往往需要直接了解下面的硬件,而且对于许多架构来说实际上并没有很好的实现。 这是底层硬件体系结构的知识,使开发人员能够从游戏系统中挤出每盎司的性能。 为什么你会花时间把Java移植到游戏平台上,然后在游戏的最后写一个游戏呢?

编辑:这是说,它不仅仅是一个“速度”或“没有正确的库”问题。 这两件事情是一致的,但更重要的是“如何让系统像我的Java代码一样运行?没有任何好的Java编译器可以pipe理pipe道和向量就像我需要..“

性能问题是第一个原因。 当您看到Quake引擎( http://www.codemaestro.com/reviews/9 )中那种超优化的C ++代码时,您知道他们不会浪费时间在虚拟机上。

当然,也许有一些.NET游戏(哪一个呢?我感兴趣,是否有一些真正的CPU / GPU密集型游戏?),但我想更多的是因为很多人都是MS技术方面的专家,并且在微软推出时他们的新技术。

哦,跨平台只是不在电子游戏公司的脑海里。 Linux仅占市场的1%左右,Mac OS又多了几个百分点。 他们肯定认为不值得倾销像Windows这样的技术和图书馆,如DirectX。

你可以问为什么Web应用程序不是用C或C ++编写的。 Java的强大在于它的networking堆栈和面向对象的devise。 当然C和C ++也有。 但是在一个较低的抽象。 那没什么不好的,但是你不想每次重新发明轮子,是吗?

Java也没有直接的硬件访问,这意味着你坚持使用任何框架的API。

我的猜测是对性能和JVM优化不好的误解。 我说对性能有误解,因为有一些C ++游戏的Java端口比C ++对应的执行速度快(见Jake 2)。 恕我直言,真正的问题在于,很多Java程序员并没有把注意力集中在出色的性能上,而是因为它们易于使用,代码的可理解性和可维护性。 在C / C ++方面,你基本上是使用稍高一些的汇编语言进行编码,而且它的硬件接近于你在不用汇编或直接机器代码编写的情况下所能获得的硬件。

维基百科上的游戏引擎列表列出了许多游戏引擎以及编写它们的编程语言。

有几个Java游戏引擎列出。

点击一些链接会引导您使用Java编写的游戏和演示示例。 这里有一对夫妇:

  • Ardor3D
  • Bytonic软件

对于某些游戏和情况,Java的折衷可能是可以接受的。

.NET在处理强烈的3D性能方面肯定会遇到一些与Java相同的问题。 微软还在3Dgraphics处理方面投入了大量的时间和资金来开发图书馆。

(…就我个人而言,当谈到DirectX和.NET之间的魔力时,我也认为他们有一个很大的优势)

  1. Java很慢,大部分的繁重工作都不是由GPU来处理的。 还有animation,物理和人工智能命中CPU,所有这些都非常耗时。

  2. Java在游戏机上并不存在,控制台是商业游戏的主要目标。 如果您在PC上使用Java,则无法在合理的时间和预算内移植到控制台。

  3. 在Java开始stream行之前,游戏行业的许多经验丰富的编码人员一直在使用C和C ++。 以上两点可能对此有所贡献,但我预计很多专业游戏编码人员都不太了解Java。

  4. 其他人关于上述中间件的观点是很好的,所以我把它添加到我的答案中。 有很多专门为C / C ++编写的遗留代码和中间件,最后我检查了Java没有良好的互操作性。 对大多数公司使用Java会涉及到大量代码,其中大部分代码已经以某种方式付费。

其实,托pipe代码很有可能做3D游戏,问题是后端引擎。 有了.Net,在短时间内,微软就有了DirectX 9的Managed DirectX包装器。 这是现在XNA的抽象之前。

被赋予完全访问DirectX API的.Net游戏工作的一种享受。 我所知道的最好的例子是用VB.Net编写的www.entombed.co.uk。

不幸的是,在Java方面,它是严重缺乏的 – 主要是因为DirectX不适用于Java,游戏程序员知道并理解DirectX api – 为什么还要学习另一个api?

游戏营销是一个商业过程; 出版商希望获得可量化的低风险投资回报。 结果,焦点通常是技术噱头(有例外),消费者会购买产生可靠的回报 – 这往往是肤浅的视觉效果,如镜头眩光或更高的分辨率。 这些效果是可靠的,因为他们只是使用处理能力的增加 – 他们利用硬件/摩尔定律增加。 这意味着使用C / C ++ – java通常是从硬件抽象出来的,以利用这些好处。

我猜想速度仍然是问题。 跨平台将成为一个问题是不是因为你不知道你写代码时可用的3d卡? java有没有什么可以支持3Dfunction的自动发现? 而且我猜想有一些工具可以在wii,xbox和ps3之间轻松移植游戏,但是我敢打赌。

ps3有java,通过蓝光支持。 检查bd-j网站。

即使是在.Net平台上编写的游戏,也经常高速优化,如直接访问内存和总线。 .Net允许使用C / C ++并将其与更高级别的语言(如C#)混合使用。

游戏开发工作室通常与硬件供应商密切合作,硬件供应商可以访问其产品的低级接口。 这是一个世界,您必须使用ASM和C进行设备通信。 虚拟环境会减慢这些程序部分。

无论如何,现代3D游戏实际上使用更高级的语言。 通常,您会发现用Lua或Python等语言编写的游戏逻辑。 但是,典型3D游戏的核心(I / O,线程,任务调度)将在未来的25年中以低级语言编写,或者长期以来,设备不允许自己进行抽象和虚拟化。

我同意其他文章关于利用先前存在/许可的代码库,性能等元素。

我想补充的一件事是很难通过虚拟机来拉扯讨厌的DRM技巧。

另外我觉得有一个傲慢的组件,项目经理认为他们可以使用C ++编写稳定/可靠的代码,像所有的工具和资源拥有绝对的控制权,但是没有所有的负面因素使复杂的和消极的竞争,因为“我们”比他们更聪明“。

Jagex的Runescape是用Java编写的,“video游戏”标签可能并不是专门用来作为在线游戏,但它确实有一个不错的追随者。

它已经被讨论了很多,你甚至可以findWiki的原因… … –

  • C / C ++的游戏引擎和所有密集的东西。
  • Lua或Python在游戏中编写脚本。
  • Java – 性能非常糟糕,内存使用量很大+游戏控制台上没有这个function(它用于一些非常简单的游戏(是的,Runescape算在这里,不是“战地”或“孤岛危机”或者还有其他什么东西),因为有很多知道这种编程语言的程序员)。
  • C# – 巨大的内存使用(只用于一些非常简单的游戏,因为有相当多的程序员知道这种编程语言)。

我听到越来越多的Java程序员试图说服人们说Java不慢,在屏幕上绘制一个小部件并在小部件上绘制一些ASCII字符,通过networking接收和发送数据的速度并不慢推荐在这种情况下使用它(networking数据操作),而不是C / C ++)…但是,当涉及到严重的东西,如math计算,内存分配/操作和很多这些好东西时,

我记得在麻省理工学院网站上的一篇文章,他们展示了如果使用语言和编译器function,C / C ++可以做些什么:一个matrix乘法器(2个matrix),一个Java实现和一个C / C ++实现,具有C / C ++特性并且适当的编译器优化被激活,C / C ++实现比Java实现快约296 260倍。

我希望你现在明白为什么人们在游戏中使用C / C ++而不是Java,想象在Java中使用Crysis,在这个世界上不会有任何计算机可以处理这个问题。+垃圾收集对于那些只是摧毁图像的Widgets但它仍然在那里caching,需要清理,但不是游戏,当然,你会有更多的滞后每个垃圾回收激活。

编辑 :因为有人要求这篇文章,在这里,我在networking档案中search得到,我希望你满意… 麻省理工学院案例研究

另外,不,Java游戏仍然是一个可怕的想法。 就在几天前,一个我不会指名的大公司开始将他们的游戏客户端从Java重写到C ++,因为一个非常简单的游戏(就graphics而言)比较落后,并且使用function强大的nVidia GT 5xx和6xx代显卡加热i7笔记本电脑(不仅nVidia,这里的要点是,这个强大的卡,可以处理大多数新游戏的最大设置,不能处理这个游戏)和内存消耗是~2.5 – 2.6 GB拉姆。 对于这样简单的graphics,它需要一台机器的野兽。