Java是跨平台游戏的不错选择吗?[关闭]


13

我正在寻找用Java创建游戏,并希望它可以在Windows,Linux和Mac上运行。我很确定C#是一个不好的选择,并且我没有足够的C或C ++经验。我想远离Flash。因此,Java对我来说是一个不错的选择吗?通常,我使用C#,并认为Java是相似的,因此我认为学习起来并不难。但是足够快吗?有没有比Java更适合我需要的语言?


8
取决于您要玩的游戏风格。根据所需的样式,可能不是HTML,而是HTML5和一些javascript将为您工作。
Patrick Hughes

Oddlab销售基于Java的游戏,例如Tribal Trouble。您可以在odblabs.com/technology.php上

5
Minecraft是用Java编写的跨平台游戏的一个很好的例子。当我们的小伙子们在认真的Minecraft会话中遇到他的朋友时,他们正在OSX,Windows和Linux上播放它。
凯夫

两年后,借助Unity引擎和/或Monogame,C#现在对这类事情非常有用,它们都还支持iOS,Android和WP8。
Magus 2014年

Answers:


28

Java非常适合编写跨平台游戏。主要优点:

  • 可移植性 -通常,您可以编写Java游戏,并期望它在大多数平台上都可以不变地运行。它可能是所有语言中最可移植的选项-C / C ++是另一个高度可移植的选项,但需要针对每个平台进行重新编译,并且在许多情况下,库具有特定于平台的功能,从而限制了可移植性。
  • 性能 -Java代码(如果编写得当)将和其他任何语言(包括C / C ++)一样好执行。JVM JIT编译器非常好。您可以用Java(例如,Minecraft)编写高质量,成功的游戏。
  • -有大量可用于Java的库,涵盖了游戏中几乎所有可能需要的功能,从网络到图形再到声音再到AI。大多数Java库都是开源的。

您必须要做出的主要决定是要使用哪种GUI框架。有很多不同的选项,但最突出的是:

  • jMonkeyEngine-完全成熟的3D引擎。如果您想制作3D游戏,这可能是您的最佳选择-包含许多游戏引擎功能,例如场景图,地形生成等。
  • LWJGL-一个更底层的库,可以直接访问OpenGL。如果您想要最大的性能,并且不介意从头开始编写大量引擎,可能会吸引您。
  • Swing-具有高度可移植性的优点,并且包含在Java运行时中,因此不需要额外的依赖关系。对于非图形密集型2D游戏(战略游戏,纸牌游戏等)非常有用
  • 斯利克 -基于LWJGL 2D游戏库。如果您想编写2D游戏,但仍然需要良好的图形性能(射击游戏,滚动平台游戏等),可能会很好。
  • JavaFX-专为类似于Flash的富互联网应用程序而设计。尽管我还没有看到很多有用的整洁功能,但这些功能很适合游戏。特别是JavaFX 2.0看起来很有前途。

Java游戏的主要缺点实际上是围绕“边缘情况”,这些情况可能不会影响您,但与某些类型的游戏有关:

  • 3D引擎的可用性 -尽管上面列出的工具和引擎不错,但它们仍未达到C / C ++引擎的水平,例如专业游戏公司使用的虚幻引擎。因此,如果您正试图开发具有数百万预算的大型FPS,则Java可能不会成为您的首选-C / C ++仍然在这里胜出。
  • GC延迟 Java垃圾回收总体上是一个巨大的好处,但是当GC周期发生时,它可能会导致一些暂停。使用新的低延迟JVM会变得更好,但对于延迟要求非常低的游戏(也许是第一人称射击游戏)来说,这仍然可能是个问题。一种解决方法是使用低延迟库,例如http://javolution.org/,但是这些库似乎更多地针对高频交易或实时系统,而不是游戏。
  • 缺乏利用低级优化的能力 -尽管Java JIT编译器非常好,但它仍然会强制执行一些您无法避免的约束(例如,对数组进行边界检查)。如果您确实需要获得本机机器代码级别的访问权限以优化此类操作,那么您可能还是会更喜欢C / C ++而不是Java。

请注意,还有一些部署选项要考虑:

  • 小程序 -在浏览器中运行,对用户来说非常方便,但是出于安全原因,小程序只能做些限制。请注意,您可以对applet进行签名以获得额外的安全性特权,尽管这对于大多数用户而言会引起一些令人恐惧的提示。
  • Java Web Start-适用于需要完全本地下载并且还需要访问本地系统资源的更复杂的游戏。它也以与平台无关的漂亮方式工作。可能是中型游戏或需要摆脱applet安全性限制的最佳路线。
  • 安装程序下载 -您可以编写Java游戏的安装程序,就像编写其他任何语言一样。当然,由于安装程序倾向于具有某些特定于平台的功能,因此配置和测试还需要更多的工作。
  • Web-您可以编写HTML5 Web应用程序,并仅在服务器端利用Java的优势。值得考虑的多人网页游戏。

最后,还值得考虑其他一些JVM语言-它们具有上面列出的Java平台的所有优点,但有些人认为它们是比Java本身更好的语言。Scala,Clojure和Groovy将是最著名的,它们都可以利用上面列出的Java工具和库。


1
除了将您的应用程序与浏览器分开之外,JWS确实没有在applet上增加太多。在这两种情况下,如果您使用的是OpenGL库,我都想对代码进行签名。
彼得·泰勒

2
我想说,对于许多严肃的游戏,特别是多人游戏,小程序限制对本地系统的访问确实是一个很大的“困难”。HTML5整洁,但是它仍然是一个混乱的小玩意,具有斑点支持,并且在许多浏览器中都关闭了GL和Sockets等重要功能,而且音频还不太适合游戏使用。
Patrick Hughes

1
@PatrickHughes,如果您希望从JWS进行本地系统访问而没有大的可怕对话框,则需要对代码进行签名-并且签名的applet通常也将具有本地系统访问权限。
彼得·泰勒

您还可以使用Inno Setup分发Java游戏。
Mahmoud Hossam

1
您可以将LIBGDX添加到可帮助您编写自己的引擎的软件包列表中。它具有针对各种平台,甚至Android以及OpenGL ES的设置和JNI优化。
Patrick Hughes

4

Minecraft和Matter都是Java内置的,是的,它对于制作游戏非常有用。如果您选择使用Java编写本机应用程序,那么在使用Java时会遇到的主要问题是移植到移动平台。Android是一种带有独立库的怪异的Java SE。RIM的Blackberry使用Java ME。从理论上讲,iOS可使用Java进行编程,尽管Objective-C可能是该平台的更好选择。

Java与C#非常相似。尽管仅懂Java,但我经常发现C#代码是可以理解的。它们确实具有不同的设计理念,但就其可广泛部署和最小的麻烦而言,两者都符合要求。尽管您的移动部署将变得更加困难,并且要部署到非Windows平台上将更加耗时或困难,但C#并不是游戏的一个糟糕选择,具体取决于您最终使用的是哪种特定的外部库等等。


1
Java的移动:一次编译,到处调试:'(
deadalnix

0

最明显,阻力最小的方法是使用HTML5 + javascript组合。使用此工具制作的任何应用程序或游戏都将在几乎所有设备和浏览器上运行。

优点:-您将需要零配置以使您的游戏在各种平台和设备上运行。

注意:-我很少看到使用上述技术构建的游戏,但是它们的身材却较小。但是,我想如果能用牛奶制成黄油,那么奶酪就不是不可能


0

您可以在Eclipse上使用Scala和Scheme Bigloo来将JVM用于Java游戏中的强调代码或并行操作。

使用Pattern Design和UML2,您还可以使用OCL保护代码,所有这些都在Topcased.org中。

掌握这些工具需要时间,但是它们是Java的背景,是将您推向最顶端的基础。


-10

简短的回答:不。

Java不会像C#(CLI)那样生成二进制可执行文件,而只会生成字节码,对于“开放式环境”中的严肃业务而言,这不是一件好事,主要有两个原因:

  • 陷入逆向工程的可能性非常高,尤其是对于像Java这样古老且非常知名的语言而言
  • 您无法完全控制机器性能,对于Java,JVM在完全控制中起着很大的作用。

当然,每种语言都有自己的库,但是由于每种语言都有大量的库,所以这并不是一个真正的问题,我认为这不是本主题的目的。

也许在专业水平上,您会发现一些违反规则的东西,例如dev-Kit,它可以将所有C#语句转换为现实世界机器的汇编代码,但是如果这种方法不在您的实际应用中,当您打算在开放环境中销售产品时,仅考虑C和C ++进行开发。

对于移动设备而言,情况有所不同,因为它们是“封闭环境”,即使Android通常是封闭的,也考虑到现实世界中ROM的来源通常不向公众开放的事实,Android可能被认为是开源的,但99实际设备上的ROM的百分比不是。在这种情况下,您不能过分争论,已经为您设置了所有内容,每个平台都有自己的语言,众所周知。

最后,如果您打算在开放的环境中销售该产品,我只能建议可以生成编译代码和二进制/汇编代码的语言,在封闭的环境中,由于不同的原因,该决定通常更容易实现。


7
您似乎认为,已编译的二进制文件比字节码二进制文件更难反向工程。可能有一点真理,但没有很多。实际上,使用x86和x64反汇编程序的人可能比使用CLI或Java字节码的人更多,并且您会惊讶于IDA Pro之类的工具的实用性(免责声明-自从免费版本以来,我就没有使用过它了。年前-现在可能更容易了。混淆的字节码文件甚至可能更难以逆向工程,并且在任何情况下,大多数人几乎没有理由理会。
Steve314

2
为什么很少理会?那么,有多少人编写自己的底层专有游戏引擎?即使您这样做,有人更愿意窃取您的代码(需要逆向工程,缺乏任何类型的文档,等等–浪费大量时间,无论开发语言是什么),而不是合法使用有据可查的免费开源引擎?相比于反向工程来窃取代码思想,完整程序的盗版更可能是真正的问题,而且盗版似乎丝毫没有受到本机编译代码的阻碍。
Steve314

1
在抽象级别上,JVM指令是非常低的级别-不像在硬件中那样精确,但是基本上与应用程序层抽象相距甚远。在标准Java库中,抽象层数很重要,这意味着平台和最终应用程序之间实际上很少有层。除了通常无论如何都在C和C ++中发生(为什么要重新发明libpng等)之外,大多数人将使用有效地形成一组广为人知的平台的通用库,并且好的逆向工程工具可以识别它们。
Steve314

3
为了满足要求,所有代码都必须在FPGA上附带并用环氧树脂封装。令人惊讶的是,即使黑盒芯片封装也可以并且一直在进行逆向工程。然后,甚至像英特尔这样的强大巨头都在其CPU软件包中引入了错误,因此您的环氧树脂嵌入式硬件黑匣子仍然会遭受硬件库的影响。最终,默默无闻地调用安全性是行不通的。我知道这是荒谬的,但是原始答案也是如此。
Patrick Hughes

3
不幸的是,我没有足够的声誉来打败你。您所有的论点都失败了。有很多人使用C,C ++或任何语言解码,反编译和破解游戏,因此,作为二进制程序包不会提供太多额外的安全性。此外,如果OP对此有所担心,那么这里有很多非常好的Java混淆器。关于完全控制机器性能,大多数C和C ++程序员也不具备此功能,只需编写良好的代码,编译器就会优化所需的内容。即使这是一个问题,您也可以使用JNI或JNA。
维克多·斯塔夫萨
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.