我最近一直在研究游戏开发,我的第一个编程语言是Java。在玩了很多以c ++开发的精彩游戏后,我想知道为什么Java在游戏行业中没有大量使用。我查看了jMonkeyEngine 3和其他一些游戏引擎环境,但我看到的屏幕截图远不那么令人惊叹。来自ubisoft的极品飞车热门追逐形式EA和刺客信条等标题传达了这种现实主义。 为什么Java不能生产这样的行业实力游戏? 这是艺术作品吗?
Java和C#具有自动垃圾收集功能,而c ++则没有。程序员必须密切关注内存使用情况,以及avoud悬空指针等。
谢谢你们。
答案 0 :(得分:21)
Java和C#有自动垃圾 集合和c ++没有。该 程序员必须密切关注 内存使用到avoud悬空 指针等等。
你自己已经回答了你的问题。
在游戏编程中,垃圾收集不是一个优势。即使Java的性能或多或少与大多数任务的C ++相当,JIT甚至可以进行非常积极的优化,超越静态分析期间可以完成的优化;垃圾收集可以使帧率在最糟糕的时刻下降。
此外,对于图形密集型任务,Java不是很合适,因为运行时有许多东西被认为是不安全的,因此被禁止(比如转换指针来重新解释数据)。
另一个重要的问题是业内已经解决的知识。 C ++在游戏产业中的惯性是巨大的。今天所有的游戏开发者都知道C和C ++。拥有一个庞大的开发人员库来减少管理危害之一,这是关键人员离开公司。
尽管如此,已经有一些成功的游戏,其中一些部分是用Java编写的,比如Vampire: The Masquerade - Redemption。
像Minecraft这样的最新游戏完全用Java编写;但它并没有采用最先进的图形,因为重点放在虚拟环境的动态特性上。
许多其他游戏和引擎都有一个运行时支持基于高性能渲染和网络平台(用C / C ++编写)构建的托管(安全自动内存分配和集合)脚本语言,如{{3}例如。
答案 1 :(得分:19)
一般来说,这里所说的一切都是为了不将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中进行渲染和模块化设计正在推动这一点 前所未有的。 (请注意,Microsoft正试图通过垄断Windows 8的分发来解决此问题。)
3)Java支持JVM内部的线程,允许它 在不使用的情况下充分利用多核处理器 任何第三方图书馆。目前,这是所有其他人的障碍 语言(特别是为手机开发的语言)。
虽然JVM确实存在延迟问题,但应该注意的是,这些问题可以通过线程来消除。我也不会太担心Windows 8和微软的推动。谷歌股票每股720美元,苹果股票每股526美元,微软股价迄今为27美元。虽然苹果很可能受到微软的推动,主要是因为使用了C#,但另一方面,谷歌可能会从中受益。微软在与Google竞争时从未有过多的幸运,谷歌/ Android大量使用Java。 “愤怒的小鸟”最初是用Java FYI设计的,并且移植到C#用于iPhone。如果Google / Android强制实施标准化,那么微软将会像苍蝇一样堕落,将Apple带入其中。
答案 2 :(得分:4)
您的问题的答案是艺术品和财务资源。最初的Minecreft是由java中的一个人开发的。而作为AC或NFS的标题是由数千人的团队开发的。比较资源。此外,育碧使用了custrom游戏引擎。如果您是唯一的开发者,您应该专注于这个想法,因为缺乏资源。如果你有一个想法,garbege收集器在普通的单一开发者游戏中是不可能的。作为唯一的开发人员,您应该选择最快速的开发技术。
答案 3 :(得分:3)
我想解决这个问题的一个主题,但垃圾收集对于创建AAA类游戏引擎的低级,性能关键方面没有必要帮助。事实上,避免使用这种对象的引用和收集系统是有帮助的。您甚至希望用户定义的类型在内存中是连续的,并且适合缓存中的相邻对象等。
除了定期收集垃圾和内存中的散射物体的性能问题之外,游戏不能因其庞大的资源而泄漏,垃圾收集器阻碍了那里的事情。是的,我只是说 GC阻碍了避免泄漏的能力。
垃圾收集不是防止资源泄漏的银弹。
听起来反直觉,看看今天最漏洞的应用程序:使用它们的时间越长,内存使用量越来越多。通常它们不是C或C ++应用程序。 C / C ++应用程序可能因崩溃而臭名昭着,但对泄漏而言并非如此。那些漏洞的版本通常用垃圾收集语言进行编程。
例如,参加Flash游戏。有许多,不仅仅是完整的业余软件,使用越来越多的资源,并且你玩游戏的时间越来越慢,迫使你有时重新启动浏览器以再次快速获得游戏。然而,它们是用ActionScript编写的,这是一种具有垃圾收集的语言。
理论上,垃圾收集应减少泄漏。在实践中,它通常会消除更便宜,更容易修复和发现的物理泄漏(哎呀我忘了删除这个字符串)以换取更加昂贵且难以隔离的逻辑泄漏(哎呀,逻辑系统会导致庞大的资源徘徊,直到整个游戏关闭为止。)
这是因为在GC语言中,如果要创建新资源的共享所有权R
,您所要做的就是在另一个对象{{1}中存储对它的句柄/引用}。 A
和B
也可能存储C
的句柄,现在R
有三个所有者,只有当所有三个所有者都发布参考时才会释放。用户只能查看并使用R
商店,因此游戏逻辑涉及定期从A
移除R
,但对其的引用会在A
和{{1}中徘徊代码忘记释放的默默无闻。在C / C ++中,B
和C
中的悬空指针实际上可能更可取,因为它会在游戏测试期间导致立即可检测和可纠正的问题,其中运行调试器的开发人员将很快发现并解决问题。在GC语言中,检测起来非常困难,虽然程序不会崩溃,但它可能会开始大量泄漏。
所以GC绝对避免悬空指针,但是如果C / C ++中的某些东西悬而未决并且不会悬浮在GC语言中,那么它就是GC语言中的逻辑资源泄漏和C / C ++中的段错误。换句话说,GC交换悬空指针悬挂永远存在的资源。它将一个明显的崩溃交换成一个无声的泄漏,这可能是一个发现的调试噩梦(甚至可能在发布产品后很长时间没有注意到)。因此,对于类似于创建大量动态世界和图形和物理对象等的游戏而言,可能在每一帧,逻辑资源泄漏都是一个大问题。
当资源泄漏不是什么大问题时,垃圾收集最好。
遗憾的是,在使用GC的大规模团队环境中,这个前一个场景非常常见,特别是如果每个程序员都不是非常谨慎垃圾收集的缺陷和对弱引用的强烈需求。因此,GC并不一定能成为制作游戏的优势,除非你只谈论最高级别的人类逻辑。没有它,必须不断创建,访问和破坏资源的低级精细系统逻辑通常会更好,即使在避免泄漏方面也是如此。
答案 4 :(得分:1)
在游戏行业中垃圾收集未被使用并不完全正确。虚幻引擎3为“脚本”类实现了垃圾收集。对于他们来说,轻易使用时表现是可以接受的;繁重的工作由管理自己内存的C / C ++代码完成。
正如Fortran所说,Java并没有真正用于游戏行业,因为担心速度问题(Java在VM上运行代码,而不是本机......大部分时间)并且因为已经有大量有才华的游戏在C和C ++中编写了大量常用代码的程序员。这并不是说你不能利用Java来制作游戏,因为那里有一些Java游戏,但是“主流”游戏行业已经在C / C ++后端投入了大量资金。
答案 5 :(得分:0)