最近我一直在研究游戏开发,我的第一种编程语言是Java。在玩了许多用c++开发的惊人游戏后,我想知道为什么游戏行业没有大量使用Java。我看了jMonkeyEngine 3和其他一些游戏引擎环境,但我看到的截图远不如《极品飞车 热力追踪》和育碧的《刺客信条》那样逼真。
为什么Java不能制作出这样的工业级别游戏呢?是艺术设计的问题吗?
Java和C#都有自动垃圾回收机制,而c++没有。程序员必须更加注意内存使用,以避免悬空指针等问题。
谢谢大家。
最近我一直在研究游戏开发,我的第一种编程语言是Java。在玩了许多用c++开发的惊人游戏后,我想知道为什么游戏行业没有大量使用Java。我看了jMonkeyEngine 3和其他一些游戏引擎环境,但我看到的截图远不如《极品飞车 热力追踪》和育碧的《刺客信条》那样逼真。
为什么Java不能制作出这样的工业级别游戏呢?是艺术设计的问题吗?
Java和C#都有自动垃圾回收机制,而c++没有。程序员必须更加注意内存使用,以避免悬空指针等问题。
谢谢大家。
许多其他游戏和引擎都有一个运行时,支持在高性能渲染和网络平台(用C/C++编写)之上构建的托管(安全自动内存分配和回收)脚本语言,例如虚幻引擎。
通常来说,这里说的都是不适合使用Java进行游戏开发的原因;“过去时”。目前,游戏行业正在经历一次“范式转换”。有三个事情已经改变或正在改变游戏行业:
游戏不再完全依赖于自身。在以前低级语言中存在的关键优势正在被C#和Java等高级语言的优势所代替。两个简单但不可否认的例子是可以在Facebook上工作的游戏,以及可以在远程媒体(例如手机、平板电脑等)上工作的游戏。
重要的是要指出,在这两种情况下,所有列出的三个问题都得到了解决。需要服务器才能工作的游戏无需担心被盗版(不包括通过逆向工程进行私人托管的情况)。对于需要网络的游戏,需要一种可以在系统性能和网络性能之间平衡的语言(通常是Java和C/C++之间的僵局,由于现有库的丰富而倾向于C/C++)。然而,在模块化网络程序模型中设计的游戏将无法使用低级语言(如C/C++)进行开发。对于希望使用C/C++为模块化网络程序模型设计游戏的公司,必须创建一个完全专注于该游戏的虚拟机,或者重新编程/编译游戏多次,这种想法太疯狂了。在我看来,尽管现在可能还为时过早,但我基于以下三个关键原因把我的赌注放在Java上。
1)JVM允许基于Java的应用程序在几乎任何平台上运行,包括Apple、Android、Windows 8或Linux/UNIX衍生版(也可以在几乎支持任何硬件平台上运行)。
2)Java使用OpenJL(OpenGL的派生版本),可以作为OpenGL的客户端运行-- jMonkey是一款使用OpenJL设计的引擎。需要注意的是,只有Microsoft Windows使用DirectX,因为OpenGL在其他平台上的支持更具优势。
3)Java具有可移植性和跨平台性,并且可以实现模块化设计。 模块化网络程序模型就是Java最适合的场景之一,但Java同样也适用于其他类型的游戏。
3) Java支持JVM内部的线程,这使其无需使用任何第三方库即可充分利用多核处理器。目前,这对于所有其他语言(特别是为手机开发的语言)来说都是一个障碍。
虽然JVM确实存在延迟问题,但应该注意到这些问题可以通过线程处理来排除。我也不会太担心Windows 8和Microsoft的推动。谷歌股票价格为每股720美元,苹果为526美元,而微软到今天为止只有27美元。尽管由于使用C#,苹果可能会受到微软的影响,但另一方面,谷歌可能会从中获利。微软在与谷歌竞争时从来没有太大的运气,而谷歌/Android广泛使用Java。愤怒的小鸟最初是用Java设计的,供iPhone使用时转换到了C#。如果Google / Android强制标准化,那么Microsoft将像苍蝇一样消失,带着苹果一起消失。
在游戏产业中完全没有使用垃圾回收是不准确的。虚幻引擎3已经为'脚本'类实现了垃圾收集。对于它们来说,当轻度使用时性能是可以接受的;重负荷由管理自己内存的C/C++代码完成。
正如fortran所说,由于速度的原因(Java在VM上运行代码,而不是本地运行...大多数情况下)和因为有许多才华横溢的游戏程序员已经用C和C++编写了许多常用的代码,所以 Java实际上并没有在游戏产业中得到广泛使用。这并不是说你不能利用Java来制作游戏,因为有一些Java游戏存在,但“主流”的游戏产业已经大力投资了C / C++后端。
Fortran和James已经很好地涵盖了它,但我想提到的另一件事情是,当谈到惯性时,Fortran暗示的一个巨大的C++库池,几乎可以为您所能想到的任何东西提供多个C++库,这是不切换到Java的重要原因。这并不是说现在没有Java的库,但C++的库已经成熟,并拥有经验丰富的开发人员社区。不必重复编写以前做过1000次的相同内容,这可以节省大量时间。