xiongbaowo 2009-02-23
这些年由于Java技术的不断发展,Java程序的运行速度有了显著提升,同时硬件技术也在不断进步,从而使得Java处理比较复杂的3D图形成为可能。Lwjgl,Jogl,Java3D等技术的出现,使Java语言可以方便的利用现在的显卡日益强大的硬件加速能力。实际上目前已经有许多基于Java的2D和3D游戏,其中不乏大型多人在线游戏。
Wurm online一个多人在线网络游戏(06年的时候进入了收费运行阶段,不过你还是可以申请一个免费帐号进去看看):
2007年Javaone上jmokeyengine演示视频:
http://www.youtube.com/watch?v=ho_b18HRmGA&eurl=http%3A%2F%2Fwww%2Ejmonkeyengine%2Ecom%2F
一个比较老的视频2005GDC上Java游戏演示视频:
http://www.youtube.com/watch?v=Pc3LxBIVaBs&feature=related
上面这些只是Java游戏的一小部分。然而,即使还有其它很多基于Java的游戏,相对于整个游戏产业来说,Java游戏社区仍然非常小,以至于其力量在手机游戏之外的领域几乎可以被忽略不计。但是实际上Java作为一种游戏编程语言和平台,这些年还是取得了长足的发展,在后applet时代走着复兴之路。
当然,Java可以做游戏,并不意味着Java就适合做游戏,那么:
Java对于一个游戏的意义
1. Java是一门经过充分发展,已经十分成熟的语言
Java语言称霸企业级应用这么多年,事实证明了它非常适合于开发大型软件。当Java的运行效率不再是问题的时候,JJava语言严谨、高抽象、可读性强的优势就体现出来了。这对于规模越来越庞大的游戏软件来说,有着不小的诱惑。
2. Java作为平台,极大的方便了游戏脚本的使用
对于游戏开发来说,由于涉及到比较复杂的情况(有时候甚至是美学问题),开发过程很多时候是一个不断修改的过程,可以方便的修改游戏内容是十分关键的。对于很多游戏引擎来说,都有自己编写的脚本解释器,用来解释一些自定义的游戏脚本语言(一般为命令式脚本,比如moveplayer(int x,int y),playersmile()之类的东西),另一些则提供了例如lua和rubby等的脚本语言来访问游戏引擎。由于其虚拟机特性,Java本身就可以用来编写游戏脚本,目前也有例如beanshell、groovy等脚本语言可以方便的无缝的和Java语言进行交互,这些都极大的方便了Java游戏编程。
3. 跨平台
跨平台,每当比较Java与其他语言的时候,总是要谈到跨平台。但是在Java游戏领域,write once ,run everywhere,听起来更像是一个冷笑话。这个笑话有多冷呢?(手机游戏我不熟悉,但是确实有人用“痛苦”来形容开发运行在不同手机上的Javame游戏)对于其他大多数Java游戏来说,或者通过applet或者通过Java web start来部署,这两种方式无一例外的都要用到浏览器。对于Java web start来说,问题相对较小,程序员必须处理的问题主要是如何让非专业用户成功安装指定的JRE版本的问题,虽然很麻烦,但是是可以解决的。对于applet来说,问题就变得复杂的多,很多问题只会在特定的操作系统配上特定的浏览器时才会出现,即使是同一品牌的浏览器,不同的浏览器版本也会出现不同的问题,同时这里还涉及到客户机默认是使用opengl pipeline还是directdraw pipeline的问题。而我们现在甚至还没有开始讨论当3d游戏需要使用底层图形api时的情况,无论是applet还是web start一旦在程序中使用了任何一种opengl的Java绑定,客户机各不相同的显卡以及同一款显卡的不同驱动都会带来不同的问题,而这些问题是随着操作系统和浏览器的不同而不同的,操作系统数×浏览器数(web start不需要考虑浏览器)×显卡数×每款显卡平均的驱动版本数=噩梦。最后你不得不妥协于这样一个现实-----即使电脑在硬件上满足程序的要求,你也无法让你的程序运行在这些电脑中的每一台上,除非你的用户都是专业人士。
当然,其实现状并没有听起来那么糟糕,对于不使用Java的大多数游戏来说,根本就只能运行在一个平台上,许多游戏对directx或者opengl的版本有要求,更不要提那些运行在家用游戏机上的游戏了,跨平台是整个游戏业的大问题,Java只是像其他人一样没有把这个问题彻底解决掉而已,但仍然比其它技术做得要好。不过,值得一提的是,在那些不直接使用硬件加速的网页小游戏上,Java确实在稳定性和方便安装上输给了flash;在家用机方面,Java是0,而微软的xna(c#)可以跨xbox360和vista。
4. 网络
Java一向强于解决网络方面的问题,在这方面,Java主要有两个优势,第一是基于applet和Java web start的游戏非常容易更新,不会像其他游戏那样需要用户手动下载全新版本;第二是Java在网络交互的api相对比较友好,而对于大型网络游戏来说,分布式系统非常重要,这正是JCP的巨头们喜欢的东西,可能由于这是一个卖硬件的好机会,sun下了不少功夫开发了project dark star来做网络游戏服务端,由于这个工程还没有到1.0,所以现在也很难说具体好用不好用。
5. 速度
这个没什么可讨论的,基于Java的游戏肯定会比写得很好的c++程序慢,当然写一个好的c++程序所花费的庞大的薪水也是Java不能比的。
Java游戏方面主要的技术
1. Java3D
作为sun公司较早推出的一项3d技术,是一种高度封装的api,构建在opengl和direct3d之上,可以说是最有名的Java的3d技术。由于种种原因(api设计,面向的用户不明确),Java3d一直没有办法流行,不久前Java3d的团队宣布暂停对Java3d新功能的开发,转而为JavaFX开发3d 渲染引擎。同时sun的另一个项目 project wonderland宣布将其渲染引擎由Java3d转为JMonkeyEngine。令人唏嘘的是sun的Java3d再次进入尘封状态,大量基于Java3d的程序和教程都面临一个非常尴尬的境地;令人高兴的是在这一领域终于有比sun做得更好的团队出现了。引用别人对此事的评价:Java3D is dead! Long live Java "3D"!
2. Lwjgl(http://new.lwjgl.org/index.php)
全名为light weight Java game library。作为一个非官方的对Java游戏的全面解决方案,lwjgl将游戏图形(opengl)、音效(openal)、控制输入集合为一,以成为Java界的directx(不是direct3d)而努力。其在图形方面采用了opengl的Java绑定,其函数与c语言版的完全相同,所以对于习惯opengl编程的程序员来说比较友好。目前有大量的Java游戏和游戏引擎是基于lwjgl的,它可以说是Java游戏社区最广为被使用的函数库之一。
3. Jogl(https://jogl.dev.Java.net/)
Jogl是Java对opengl的一个绑定,或者说是opengl接口的Java实现,它是由sun支持的。其语法与opengl完全相同,api也紧跟随着opengl的版本进行更新,而Nehe的opengl范例程序大多数都有jogl版本。去年jogl正式通过jcp审核成为jsr231,是lwjgl的主要竞争者。值得一提的是,jogl项目的领导者Ken Russell曾经声明并不希望jogl成为jre的一部分,因为他认为这样会使jogl的更新周期与jre相同,从而变得过于缓慢。Ken Russell目前全力工作在新的Java plug-in的开发上,而opengl的api也没有进行更改,所以现在的jogl版本将持续较长的一段时间。
4. Joal (https://joal.dev.Java.net/)
Java对openal的一个绑定,是Java音效的一个解决方案。
5. Jinput (https://jinput.dev.Java.net/)
Java对非标准输入设备(游戏手柄,操纵杆)的解决方案。
6. JMonkeyEngine(http://www.jmonkeyengine.com/)
JMonkeyEngine是一个开源Java游戏引擎,对底层高度封装,经过4年的开发,在去年的10月终于发布了1.0版本。在2007的Javaone会议上发布了相当震撼的演示视频,从而广受关注,据说会场的许多屏幕特效也是由它完成的。在底层,JMonkeyEngine采用了lwjgl,而jogl可能会在2.0版本中得到支持。去年著名的网络游戏公司ncsoft(天堂系列,激战,英雄城市,Tabula Rasa等游戏的开发商)将JMonkeyEngine的三位主要开发人员招入麾下,也许不久的将来我们就可以看到这一引擎的商业版本。值得一提的是,在任职ncsoft之后,引擎的主要开发者声称现在有了更多的时间进行游戏引擎开源版本的开发,而目前JMonkeyEngine的开发速度也确实大幅提升,2.0本版可能在08年稍晚一些时候就会发布。此外,由sun开发的project wonderland不久前宣布将把其渲染引擎由Java3d转为JMonkeyEngine,使得JMonkeyEngine进一步受到广泛关注。
7. Project Darkstar(http://www.projectdarkstar.com/)
目前project darkstar为0.95版,是sun专门针对网络游戏的方面的应用所开发的。这个项目主要致力于解决大型游戏服务器的分布式应用问题,个人感觉类似于网络游戏应用中的j2ee。对于普通游戏的网络传输,project darkstar也给出了自己的解决方案。但是不少人认为darkstar并不致力于简化普通游戏的网络应用,因为这个项目主要是对大型网络游戏服务器的分布式应用进行解决,从而促进sun自己生产的服务器的销售。当然我并没有真正使用或研究过它,只是道听途说,很有可能有错误。
8. Project Wonderland(https://lg3d-wonderland.dev.Java.net/index.html)
Sun开发的一个3d虚拟世界构建工具,sun使用这个工程制造了一个虚拟工作环境MPK20,物理上处于不同大陆的人们在这个虚拟世界中可以在一间屋子里协同工作,这个项目的演示视频非常不错,建议去它的主页看一下。
值得一提的Java游戏
国内有一个叫《海天英雄传》的2d网络游戏号称是用Java实现的,地址:http://herogame.njoys.com/,这款游戏几年前最鼎盛的时期也没什么名气,目前这个游戏基本已经处于生命周期的最后阶段了,可能不久后就会停运。
Wurm online一个多人在线网络游戏,大多数商业版本的Java游戏实际上都是将Java代码预先编译成字节码,因而不需要客户安装Java虚拟机,这个游戏是少有的几个确实要求客户安装Java虚拟机,而同时又运营的相当不错的游戏。地址:http://www.wurmonline.com/
未来
目前来看Java游戏并没有出现显著的上升趋势,除手机游戏外,Java游戏基本处于蛰伏状态。未来Java游戏可能迎来几个契机:
1. Java SE 6 Update N (之前被叫做 "Consumer JRE")的发行
在这个新的版本中,sun号称其将让Java升级更方便,部署更简单(方便的探测客户端的Java版本,并安装程序需要的版本),用户将能够只安装jre中他们需要的部分,对于暂时用不到的部分可以等到用的时候再安装,同时加速Java虚拟机的启动速度(实际上就是在电脑刚开机的时候就启动Java虚拟机,而不是在第一次运行Java程序的时候),增加对swing的硬件加速支持。而新的Java plug-in将大幅增强applet的稳定性,可靠性,将允许applet更改自己可以使用的内存大小,选择使用哪个特定版本的jre执行。
实际上一旦applet变得稳定,Java面对flash将体现出巨大的性能优势,因此Java SE 6 Update N的发布将是Java游戏界未来一段时间内最大的契机。
2. JavaFX的发布
JavaFX的目标是让JavaFX像flash一样易于开发,如果这个项目真的能成功的话,对于Java游戏的影响将非常巨大(不过由于缺乏flash所拥有的方便的开发工具,我对JavaFX成功的可能性深表怀疑)
3. Sony或是任天堂决定在家用游戏机上支持Java
这个的希望非常渺茫的,但是考虑到微软的XNA做到了跨windows和xbox360平台,也许sony在ps3屡遭败仗的情况下会考虑一下支持Java。实际上现在的家用游戏机就是电脑,很多发烧友已经可以在ps3和wii上运行Java程序了,只是目前Java无法使用这些机器的硬件加速功能。