为什么Java没有更广泛地用于游戏开发?[关闭]


77

我不是游戏开发者,也不是任何人,但是我知道Java在游戏开发中的使用并不广泛。Java对于大多数游戏来说应该足够快,所以要抓住什么呢?我可以想到一些原因:

  • 缺乏具有Java专业知识的游戏开发人员
  • 缺乏良好的游戏开发框架
  • 程序员不想接受Java作为游戏编程语言。大多数人只接受C ++吗?
  • 不支持游戏机(尽管PC市场仍然存在)

当然可以是其他东西。谁能比我更好地了解这个业务,可以解释一下为什么Java在游戏开发方面没有发展势头吗?


37
现在,等待所有“ Java速度慢,C ++速度快”的答案,实际上只能以过于广泛和完全正确的方式触及问题的表面。请注意,以这种方式回答的人们几乎肯定不是专业游戏开发人员。
Ed S.

20
在事实上,Java 用于游戏开发; 即在移动市场。Java ME,Android。
user281377 2011年

21
为什么要使用它?Java为游戏开发人员提供了什么,而更广泛使用的语言却没有?Java为业务应用程序开发人员提供了极为丰富的生态系统,它克服了它作为一种语言的缺点,但是,在游戏开发方面,与许多替代方案相比,Java平台提供的工具很少。
back2dos

14
有趣的是,Minecraft是基于Java的。
乌里(Uri)

5
@Coder看起来C ++代码已经过优化,而Java代码却没有。因此,这是无效的比较。
Izkata 2012年

Answers:


94

几个原因:

  • 在过去,您需要“直接访问”才能获得性能和UI。这早于Java和C#等VM语言。
  • 大多数控制台(例如360,PS3)没有JVM,因此您无法重用PC版本中的代码。编译C ++代码以支持各种设备要容易得多。
  • 大多数主流游戏引擎(例如,虚幻引擎)都具有C ++绑定。有一些Java连接器(例如,用于OpenGL),但没有类似的连接器。
  • 对于PC游戏,DirectX实际上并没有强大的Java支持(如果有的话)。
  • 基于Web的游戏在JavaScript或Flash中运行。尽管可以使用GWT之类的东西,但是可以用Java编写它们。
  • iPhone运行Objective-C变体。

如今,Java主要用于Android游戏,这仅仅是因为Java是该平台的主要语言。


14
+1“大多数控制台(例如360,PS3)没有JVM,因此您无法重用PC版本中的代码。编译C ++代码以支持各种设备要容易得多”如果设备没有运行时,您将不会看到基于该不可用的运行时开发的游戏。Xbox 360和Windows Phone已管理.Net运行时,因此使用它们进行游戏开发是可能的,并且可能呈增长趋势。但是,由于运行时不在其他主要平台(PS3,在较小程度上是Wii)上,因此很难证明完全独立的代码库是合理的。实际上,这根本不是性能问题。
JustinC'3

2
它称为XNA,当前是.Net 2.0框架的子集。野外还有一些其他有趣的框架:MonoXNA,MonoTouch和XnaTouch等。
JustinC'3

7
使用JVM无法实现性能的可预测性。
克拉姆

5
非常好点。但是,我要添加一个事实,即GC可能导致意外的暂停/加载。如果这不是服务器应用程序的问题,那就是实时游戏。例如,这在《我的世界》中可见。
deadalnix 2012年

2
@Klaim malloc或也是不可能的new,因此,如果您担心的话,无论如何都将实现池化。与此无关,Java的一个大问题是它不支持值类型,这与C#不同。
瓦(Doval)

80

技术原因:

  • 大多数最好的3D游戏引擎都是用C / C ++编写的。这很重要,因为大多数游戏开发人员都不想在3D引擎上妥协,也不想从头开始编写一个。Java有jMonkeyEngine,它是开源的,实际上非常好,但是它仍然不能与Unreal Engine竞争。
  • 对于某些非常罕见的情况,使用C或汇编语言“接近金属”具有优势,特别是对于访问特殊的硬件功能。如今这并不重要,但是专业游戏开发人员仍然喜欢选择....
  • Java具有垃圾回收,托管运行时。在99%的时间中,这是一个巨大的优势,它无疑使编码更容易且更不容易出错,并且是Java如此受欢迎的主要原因之一。但是,确实会导致游戏偶尔出现延迟问题,因为垃圾回收周期可能会导致明显的暂停。对于较新的低延迟JVM而言,这已不再是一个问题,但对于图形化密集型游戏而言,这仍然是一个至关重要的问题,因为保持FPS至关重要。

非技术原因:

  • 专业游戏开发公司在C / C ++技能和技术上进行了大量投资。这产生了大量的惯性
  • 在很大程度上,非理性的观点认为Java很慢。可能在90年代是正确的,现在现在绝对不是-您可以使用Java编写盈利的商业3D游戏(RunescapeMinecraft怎么样?)
  • 一个相当公平的看法,即Java更专注于业务应用程序和Web,而不是游戏。随着Mobile的增长以及对更多跨平台开发的需求,这可能会改变,但是目前肯定是正确的。

有趣的是,游戏开发人员考虑使用Java的一些充分理由:

  • 可移植性 -随着目标平台数量的激增,Java凭借其无与伦比的创建真正的跨平台二进制文件的能力而变得越来越有吸引力
  • 图书馆生态系统 -除了3D游戏引擎这一非常重要的例外之外,Java在所有平台上都拥有最好的图书馆范围。网络,声音,AI,图像处理,键/值数据存储,您可以为该主题命名,并且可能有一个开源Java库。
  • 服务器端开发 -Java是服务器的强大语言/平台,并且随着越来越多的游戏包含大量的多玩家元素,服务器端将变得越来越重要。作为平台,Linux上的Java看起来非常引人注目。
  • JVM-可能是世界上设计最好的VM执行环境,它具有出色的垃圾收集,JIT编译器,并发支持等。它只会变得越来越好,而且随着游戏开发人员越来越多地开始在他们的游戏中使用动态语言,最佳的运行时环境。
  • 其他JVM语言 -Java是可靠的主力军,但是真正的创新是通过新的JVM语言(尤其是Scala,Clojure)进行的。这些语言获取Java / JVM平台的所有优点,再加上他们是非常强大的现代语言。

19
不,在视频游戏世界中,Java的可保留性不是更好。大多数控制台没有JVM。由于可移植性的原因,在视频游戏世界中,C ++比Java更受青睐。
deadalnix 2012年

5
为什么图书馆生态系统是Java的加分项?网络,声音,键值对-这不是问题;如今在任何地方都可以使用。我实际上会争辩说,使用C / C ++库(fann,OpenCV)更容易实现AI和图像处理。
MrFox 2013年

4
比FPS更重要的是,我也许会强调一致的帧速率。我可以让游戏以100FPS的速度运行,但是如果其中一些帧需要半秒钟,那将是无济于事的。即使GC快速,但如果引起明显的不规则现象,仍然是一个问题。(这尤其不能说明Java的性能,只是要记住的一个普遍问题)
Gankro

1
我用Java写了第一人称射击游戏,即使我不使用低延迟的游戏,垃圾收集器也没有遇到任何麻烦。无论如何,当没有在Java堆上分配内存时,要由我决定是否要在没有垃圾收集器的情况下进行处理,而我的大部分内存占用都来自VBO。换句话说,垃圾回收不是问题,因为它可以用于设计用途,并且不能处理GPU或本机堆(!= Java堆)上的大对象。不要怪罪砧座不是刷牙的有效手段。
gouessej

1
@deadalnix视频游戏世界不仅由游戏机组成。
gouessej

27

好的,此线程中存在很多错误信息。

我从事游戏行业已经25年了,对此我非常了解。我还非常了解游戏中的Java,因为他曾是Sun的Java Game技术推广人员并讲授Java性能编程专家。

在计算速度方面,Java在当今的许多科学计算基准中都击败了C ++。您可以用任何一种语言编写病理代码,如果您愿意,它们会导致性能下降,但总的来说,它们是同等水平的,并且使用了很长时间。

在内存使用方面,Java确实有一些开销。HelloWorld是Java中的4K程序。但是,在当今的多GB系统中,这些开销是毫无意义的。最后,Java确实有更多的启动时间。我不建议将Java用于短时运行的实用程序,例如Unix命令行命令。在这些情况下,启动将主导您的性能。但是,在游戏中,它的意义并不大。

正确编写的Java游戏代码不会遭受GC暂停。就像C / C ++代码一样,它确实需要一些活动的内存管理,但不需要C / C ++的级别。只要您将内存使用情况保留给长期存在的对象(在整个关卡或游戏中一直存在)和非常短暂的对象(矢量等,在计算后传递并迅速销毁),gc就不会是一个明显的问题。

在直接内存访问方面,Java拥有很长一段时间了。从Java 1.4开始,采用本机直接字节缓冲区的形式。由于缺少无符号整数类型,Java中的位纠缠可能会有些烦人,但是工作回合都是众所周知的,并且并不是很麻烦。

尽管其真正的Java从来没有Direct3D绑定,但这是因为Java技术努力实现可移植性。它具有两个OpenGL绑定(JOGL和LWJGL)和OpenAL绑定(JOAL),以及一个可移植的输入绑定(JInput),该绑定在幕后绑定到Windows上的DirectInput,OSX上的HID Manager和Linux绑定(我忘记了)。

确实,没有完整的游戏引擎像Java那样具有Java的特色,而C#却没有特色。另一方面,有两个很好的Scenegraph级别的APIS,它们可以在Windows,OSX和Linux上完全平台移植。两者均由Josh Slack编写,第一个称为JMonkey引擎,第二个称为Ardor3D。

最正确的说法是,在游戏开发中阻碍Java发展的两个最大因素是偏见和可移植性。后者是最大的问题。尽管您可以编写Java游戏并将其发布在Windows,OSX和Linux上,但从来没有控制台VM。这是由于Sun中层管理人员完全没有能力。实际上,我们中少数在游戏中从事Java开发的人与索尼达成了至少3次与Play达成交易的协议,以便在Playstation上获得虚拟机,而Sun中层管理人员却三度将其杀死。

当Sun调情客户端技术时,事实是Sun管理层从未获得过消费产品。这就是为什么Java作为Sun的客户端语言从未以任何形式成功的原因,以及为什么需要Google和Dalvik(类似于Android Java的VM)来使Java在任何地方都获得成功。

这就是为什么我今天用C#编写游戏。因为Mono到了Sun管理层拒绝的地方。


8

Java非常适合必须可靠运行的业务逻辑,服务器和独立于平台的代码。Java在游戏中不经常使用的原因有几个:

  • 边界检查和其他安全机制(这些天的边际性能差异)
  • 必须在C ++数据结构和Java数据结构之间转换(不能只在缓冲区之间复制内存)
  • 许多书籍和教程都随波逐流,因此很难找到非C ++游戏开发者的信息
  • 核心图形库(DirectX和OpenGL)以及许多现成的引擎都基于C / C ++
  • 许多游戏试图尽可能快地运行,以便它们可以添加更具视觉吸引力的功能

使用字节码语言(例如Java(编写JNI层)和.net(大量的编组/解组,api /结构属性))的C ++库并不容易。因此,它增加了很多工作,却收效甚微。

附带说明:一些游戏服务器使用Java。

类似的帖子在这里https : //stackoverflow.com/questions/1034458/why-arent-video-games-write-in-java


您不必自己编写JNI,只需使用JogAmp或任何类似的库即可。
gouessej

好点子。我在Java中使用过JOGL和JMonkeyEngine。我在C#中使用nvorbis / naudio / openal将XNA / MonoGame用于DirectX,将OpenTK用于OpenGL。它们非常适合中小型游戏,尤其是在使用着色器时。与C ++相比,生产率有了很大的提高。这样,您唯一真正的问题就是与任何基于GC的语言相同:防止/缓解GC。它会定期使帧速率停顿,因此您需要固定大小的数组,静态分配或长时间使用的缓冲区,这些停顿可在游戏停顿(菜单,加载,电影)时投入使用。
Graeme Wicksted

自2006年以来,我就一直使用JOGL,即使在台式机环境中的低端硬件上也没有这种问题。垃圾回收器不是罪魁祸首,因为最大的对象通常是在GPU RAM或本机堆中(通常是直接的NIO缓冲区),前者不是由“常规”垃圾回收管理的,而后者不是。由“普通”垃圾回收直接管理,因为它负责处理Java堆上的Java对象。开发人员可以有效地释放在本机堆上分配的内存。
gouessej

以我的拙见,问题出在程序员不以Java思维为基础的某些“优化”,这些优化使垃圾收集器无法完成其工作。如果您对链接到某些本地资源的一些无用的Java对象保留一些强引用,那么垃圾收集器将永远不会将其视为可回收的。堆外分配在某些情况下可能很有用,但是如果您滥用它,那么您的长寿命资源将保留在内存中,并且您将无法创建新对象。
gouessej

一些游戏程序员更喜欢在开始时分配巨大的缓冲区,在运行时对其进行切片,然后自行管理该内存,但是如果操作系统和Java花费更多时间来释放一些空间来创建新对象,他们可能会做的更糟。在Java中,避免内存泄漏并不困难,一种更可行的解决方案是仅跟踪未在Java堆上分配内存的对象,以在适当的时候释放它们(在暂停期间,当从一个级别切换到另一个级别时) ,...),与垃圾收集器无关。
gouessej

5

Java对于大多数游戏开发来说不够快。它比使用标准的C ++ / Assembly慢得多。这也是没有使用C#或VB完成更多游戏开发的原因。游戏开发人员需要并计划每个最后的时钟周期,以便他们可以进行物理计算,AI逻辑和环境交互等操作。

对于更简单的游戏,可以非常有效地使用Java。如果您想创建一个Tetris克隆或Bejeweled,或其他细节级别的东西,那么Java可以正常工作。但是Java不可能创建Halo,荣誉勋章,Command&Conquer等游戏并使其可玩。至少与现在一样。

您在问题中列出的原因也是有效的。我认为,除了缺乏具有Java专业知识的游戏开发人员外。手机和其他便携式设备上的许多游戏都是用Java编写的(包括大多数Android游戏),其中一些游戏非常出色。因此,我认为拥有Java知识的游戏开发人员的基础正不断壮大。

人们正在改变在一些更高级的游戏中使用这些高级语言的能力。例如,我最喜欢的游戏之一,Auran的Train Simulator,是用C#编写的大部分内容,效果很好。因此,基础不断扩大,并将继续发展。


17
您忽略了最重要的要点之一;绝大多数将使用的工具和API都是用C ++编写的,并将其重写以与Java或任何其他语言一起使用将需要大量工作。另外,您的概括“ [Java比使用C ++ / Assembly慢得多 ””太宽泛了以至于无法准确。汇编在PC游戏中的使用频率并不像您想象的那么频繁,因为一个好的编译器将比编写汇编器生成更有效的代码。但是,需要确定性的资源使用和正确使用硬件的能力。
Ed S.

15
与Minecraft相比,确实有人需要创建一个更好的Java功能示例。在有人可以用Java或C#创建等效的WoW或C&C或MOH或Starcraft之前,我将继续坚持我所说的。
BBlake 2011年

12
“汇编在PC游戏中的使用频率不如您想像的那样,因为好的编译器生成的代码可能比编写汇编器的效率更高。” 那是另一种概括。我还没有看到能比有经验的IA32汇编语言程序员生成更好的IA32机器语言的编译器。编译器为映射到目标计算机的抽象计算机生成代码。汇编语言程序员充分利用了底层处理器,包括机器习惯用法。
比特币2011年

10
不要忘记内存使用情况。内存使用可能比速度更重要。Java不是为像C ++这样的直接内存控制而设计的,并且垃圾收集器意味着同一任务的内存使用率总是比C ++高得多。
马修(Matthew)

9
这不是1985年。我们拥有超过640k的内存,优于50 mghz的处理器以及超过1.44 mbs的可移动存储。今天的游戏开发人员挑战与25年前不同。继续,为现代游戏找到一个手工制作的x86 /或ia64代码示例。某些神话完全是错误的。挑战在于可移植性,以及使用相对较旧的操作环境的下层客户端。最小公分母与引人注目的浸入式。
JustinC'3

5

现代游戏都是关于在专用硬件中发生的3D图形的。

甚至早在2002年,Jacob Marner就在他的报告“评估Java以进行游戏开发”中发现,Java除了对性能最依赖的部分外,还非常适用于游戏,并且由于语言和底层JVM的健壮性使其更便宜。用这种方式做到这一点。

http://java.coe.psu.ac.th/FreeOnline/Evaluating%20Java%20for%20Game%20Development.pdf

我个人认为,自从那时以来发生的进步,尤其是在3D图形方面,以及与OpenGL等人的出色绑定,这种劣势如今已经不那么明显了。

因此,问题一定在其他地方。可能的原因是Java运行时的大小(如今,在多DVD游戏中这已不再是一个大问题),而另一个原因是现有代码的惯性。众所周知,开始使用Java本机代码非常困难。第三个原因是从事游戏的明星开发者所熟悉的。第四是平台上是否有Java。

可以肯定的是-大多数游戏正在开始成为可编写脚本的脚本,而不是一开始就将它们全部刻录为C代码,并且您希望在脚本语言下获得最佳运行时间。如今,这实际上意味着CLR或JVM。


1
oddlabs.com/technology.php- “我们的开发基于LWJGL和Java的结合,这使得游戏可以在任何LWJGL支持的平台上运行而无需修改,并且速度可与依赖于平台的本机代码相提并论。”

十多年前,Jake2的表现优于Quake2。我们不再是2002
。– gouessej

4

游戏开发人员喜欢紧贴金属,并经常在组装时编写紧密的内部循环。无论是在一致的速度还是在内存使用方面,Java均未提供相同级别的可能性能(运行JIT会付出巨大的代价)。


4

我认为对于大多数人来说,限制因素是(缺少)优质游戏引擎的可用性。为了走得更远,我们需要看看为什么这些都不可用。

我会从另一个方向看一下。开发游戏引擎(例如)需要大量工作。谁能从开发一个人的时间和精力上受益呢?

在Java中/针对Java进行类似框架的开发的大多数明显候选人(例如IBM,Oracle)似乎对游戏的兴趣为零。游戏开发的明显候选人(例如Id,EA)似乎对Java几乎没有兴趣。

我能想到的似乎唯一合理的候选人几乎就是Google。Android的主要开发语言是Java,鼓励开发Android游戏可以为该平台带来真正的优势。

据我所知,他们还没有这样做(还?),这对几乎其他任何人都留下了相当严格的限制。在现代高性能游戏引擎中使用Java开发几乎没有什么办法,这意味着要付出很多额外的工作,(在我看来,这)产生很多收益的机会不大。


我认为您遇到了游戏引擎的重要问题-我认为这是Java未能赶上C / C ++的最大原因。开源有可能使游戏环境变得更加公平-jMonkeyEnginejmonkeyengine.com)给我留下了深刻的印象。
mikera

而且不要忘了游戏开发人员总体上(技术上)都非常保守,大多数大型(有影响力的)商店已经存在了数十年,并且都是以C(++)/ ASM为中心的,因此不会投资Java开发,因为当他们准备好使用整个C(++)/ ASM架构时,这意味着大量的时间,金钱和其他资源的预先投资。
jwenting 2011年

1

这个问题与以下方面的问题相当:

有什么能为您的汽车,船用发动机或喷气发动机提供动力的呢?

归结为可扩展性,避免错误,速度,内存签名,模块化以及许多其他方面。问题不应该是关于什么是行业标准更好的问题,而应该是关于“什么对我更好”的问题,如您所知道的或您对它的了解程度如何。如果成功了,那么它就成功了;如果您实际上可以卖出这个主意,那么它就可以了,谁知道您甚至可能会弯几把汤匙。


0

Java不是在考虑游戏开发的基础上开发的,而是Java被认为是一种“面向Web”的语言。

至于游戏开发,在Microsoft支持C#的情况下,Sun并不真正支持Java作为游戏开发语言。

我认为缺少令人信服的游戏开发框架是在这方面真正杀死Java的原因。


3
但是C ++并不是游戏语言,而是像C这样的系统编程语言。Sun实际上确实在Java作为游戏语言上做了一些努力,我认为他们正在与Sony合作将Java引入PS2或某事,但从未发生……
Anto

1
@Phobia:但它是为系统编程。
安托

1
@Phobia:我说,这一个通用编程语言,就像C ++。在您的回答中,您说Java并不是被设计为游戏编程语言,但您忘记了C ++也不是被设计为游戏语言。
安托

2
@Joe Blow:在有关C的维基百科页面上:“尽管C是为实现系统软件而设计的,但它也被广泛用于开发便携式应用软件。” 我认为这很清楚,不是吗?
安托

2
@恐惧我很抱歉您的个人偏好,但它们与讨论完全无关。此外,我不想争辩说,如今C ++几乎仅用于应用程序编程中。这不是此讨论的目的。您声称Java在设计时就考虑了Web编程。好吧,C ++在设计时就考虑了系统编程。它的设计师说。讨论完毕。
康拉德·鲁道夫

-1

将C更直接地粘合到全新的非常规硬件和驱动程序上更加容易。游戏程序员越早,越接近硬件,就越能胜过竞争游戏。后来的游戏程序员只是坚持使用与先前经过验证的游戏相同的方法和工具。

对于优化最新硬件不太重要的游戏(例如休闲手机游戏),以这种方式使用C的重要性不如Java更高的可移植性。


-4

对于某些人,原因与速度,库或可用性无关。这仅仅是因为语言本身。有些人根本不喜欢Java语言。其他人宁愿使用自己喜欢的编程语言,也不愿使用Java来制作游戏。


这读起来更像是一条评论,请参阅“ 如何回答
gna2015年

-8

当然可以是其他东西。谁能比我更好地了解这个业务,可以解释一下为什么Java在游戏开发方面没有发展势头吗?

这是一种解释语言,即慢。您正在处理作为硬件的图形和图形卡。什么是处理硬件的好语言?C ++,它相当低,您可以处理指针等。

如果您想抽出疯狂的图形(例如孤岛危机)以及您不打算为此做的Java。

不仅如此,Oracle拥有Java,而且公司可以起诉您的想法并不太好。尤其是当您要为JAVA构建自己的解释程序以针对游戏而不会因碎片化的FUD而受到起诉时。


1
你应该认真阅读有关JIT编译,并期待在一些基准,其中的Java放在对C ++
安托

1
谁把这个答案否决了?整个问题变得非常荒谬!真是的
Fattie

7
@乔答案是错误的。不解释Java。
康拉德·鲁道夫

3
@Anto忘记那些愚蠢的基准。C ++ 数量级的速度比Java快重要的地方,看到programmers.stackexchange.com/questions/29109/29136#29136programmers.stackexchange.com/questions/368/13888#13888
康拉德·鲁道夫

1
@Anto我想看什么?速度?C ++。内存使用情况?C ++。查看minecraft,尝试托管服务器,看看游戏占用了多少内存。Java比C ++消耗更多的内存。我想制作一个在线游戏在Java中是很难的。到目前为止,我所见过的每个基准测试Java都会占用更多的内存,而现在有了一个mmorpg游戏,其中的中央服务器使用Java编码只有在您忽略内存方面或更改MMORPG中的mass定义时才听起来不错。
mythicalprogrammer,
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.