用于游戏编程的C与Java

时间:2009-10-14 23:29:03

标签: java c

我知道C ++通常被认为比游戏更好(至少是大型游戏)。这是为什么?

是什么让Java在这个领域保持竞争力?反对使用Java进行游戏编程的原因最多,哪些是神话?

编辑:我对C / C ++有点不熟悉,并且没想到要在第1行>区分这两者。<

18 个答案:

答案 0 :(得分:40)

此时Java(和C#/ .NET)不是AAA标题的可行选项的原因是已建立的游戏引擎及其工具链是用C ++编写的。游戏开发就是在最短的时间内获得市场上的头衔,并且预算不允许像新的语言/引擎这样的东西,当有几个已经可用,工作良好,并拥有大量的编辑器时和支持他们的工具。

迁移到Java(或C#)还需要在big-3(PC,X360,PS3)或big-5(添加Wii,iPhone)上使用新的性能驱动的JVM(或CLI)。这在技术上是可行的,但在经济上不可行。

编辑:对虚拟机和当前游戏引擎状态有较低知识的任何人都可以告诉您,JVM或CLI无疑可以通过新的游戏引擎实现,以超越当前C ++引擎的性能。预防因素是时间和金钱,仅此而已。

答案 1 :(得分:11)

传统上用于游戏的高性能和C和C ++的惯性。

除非你正在进行3D狂欢,否则根据表现选择并不是一个重要的优先事项。

答案 2 :(得分:8)

由于:

  1. Java未编译为本机代码,这意味着第一次运行代码时会出现性能损失。
  2. Java没有给你一个可预测的内存模型(控制台游戏需要这个)
  3. Java不会为您提供确定性对象最终确定。
  4. Java并不像C那样接近硬件,这对于许多专业的3D游戏编程来说都是必不可少的。
  5. 控制台程序员可能没有在PS3,X-Box等上运行的JVM。
  6. 运行时性能损失。
  7. 您将永远无法使用C ++应用程序从Java应用程序中获得尽可能多的性能。
  8. 可能有更多的原因,比如它们使用的是用C或C ++编写的预先存在的代码。

    编辑:顺便说一句,我不认为很多现代游戏是用C语言编写的.OOP适合游戏开发,而C ++是事实上的选择语言。

    另外,我不会将它添加到我的列表中,但正如其他人所提到的那样,有许多预先存在的代码可以很好地用于游戏行业。重写所有/大多数工具只是为了切换到一种新语言是不切实际的,特别是当这种切换可能会引起很多麻烦时。

答案 3 :(得分:6)

我想说,尽管其他答案指出主要由JVM引起的速度不足,人们不用Java编写游戏的真正原因是缺乏对DirectX和OpenGL等环境的支持(实际上不需要你的代码接近他的硬件,因为它是由一些答案建议的)。它们是人们通常用来编写游戏的基础框架,特别是现在3D游戏无处不在 - 而且缺乏对它们的支持是Java不被视为游戏开发语言的原因。

为了强调我的观点,我建议你看看微软的XNA,它目前已经过优化,可以通过.NET框架在C#中进行编码(就像Java是Just-In-Time-Compiled并且没有' t本身本地)。 XNA框架与DirectX接口,与硬件进行通信,因此非常快。

修改

@Ed Swangren的评论让我意识到在考虑进行游戏开发时,.NET与Java之间的又一个区别。我认为.NET的另一个优点是,如果你确实需要能够挤出最后一点性能并做一些指针数学运算或实现一个复杂的高性能算法,那么unsafe就好了模式。当然,您甚至可以超越它并编写本地库以供C#代码使用,这要归功于P/Invoke

答案 4 :(得分:4)

暂时离开C(++)......我倾向于说很多原因是Java缺少像XNA这样的东西。在游戏开发方面,Java实际上比C ++这样的语言有什么优势?您必须考虑到游戏开发的特定领域中几个典型的优势消失,而C ++获得了几个优势。

XNA使得C#成为业余游戏开发中非常流行的语言,与普遍看法相反,它也是商业开发的一个非常可行的选择。 C#/ .NET在很多方面与Java并行(现在可以说是一个更好的框架),当人们现在可以选择使用更高级别的语言进行游戏开发时,C#似乎更具吸引力,除非交叉-platform支持是必不可少的(然后我们还有Mono和OpenGL for .NET)。

C(或更确切地说,C ++)长期以来一直是 游戏开发的语言,因为它们具有低级特性(因此性能优势)和图形框架(DirectX,OpenGL)和引擎的主机主要针对他们。它的用法已嵌入到游戏开发中,自从行业开始以来就被虚拟使用 - 我怀疑它不会很快消失。

答案 5 :(得分:3)

  1. Java没有可控性能
  2. 高度可逆,难以保护
  3. 许多游戏使用lua或python等脚本语言来获得“更高”级别的编程
  4. 大多数系统的API都是面向C的。
  5. Java可用于游戏连接到
  6. 的后端服务器系统
  7. Flash游戏似乎占据了Java游戏本来可以拥有的。

答案 6 :(得分:3)

Java可以非常快速地进行优化,我最近与一家高频贸易公司进行的访谈就证明了这一点,他们使用Java和C ++。

正如其他人所指出的那样,Java有OpenGL绑定,所以进入硬件不是一个问题,因为并非所有游戏都需要这样,一些商业游戏都是为Java3D编写的。

如果您希望在多线程或数字密集型操作中获得更高的性能,可以使用Scala或F#,并将它们与GUI结合使用。

但是,正如其他人所提到的,使用的工具往往是为C ++编写的,有些公司在组装时做一些优化感觉更舒服,但是,考虑到新的cpus非常复杂,有多核,与编译器的优化相比,你不太可能获得任何性能提升,但是,只要公司认为仍然需要这些优化,他们就会继续使用C ++。

如果一些开发人员想要为Java或.NET编写商业级工具,那么可能会有市场机会,但要使其与现有的工具一样好,将会有很多工作。

答案 7 :(得分:2)

我认为C或C ++是构建多种类型游戏的更好语言,因为它更接近硬件,可能是任何新硬件上实现的第一种语言。不仅用于访问当今硬件的许多高级功能的库很可能在C中实现。

您的典型通用高级语言没有简单的方法来访问硬件的功能,除非它使用某种类型的绑定层来调用用C语言编写的库。

例如,如何编写代码来访问GPU,编写自定义着色器,或编写在Cell芯片上运行良好,或在Iphone上运行的代码,或在高级语言的Blackberry上运行代码。即使这些东西得到支持,在其他人能够用C语言编写游戏中使用这些功能的游戏后,它们也会很好地出现。

您可以做出的一个妥协是在大多数情况下使用像Java这样的更高级语言,在需要时使用C语言。您将限制您支持的平台类型。

Java也可能适用于使用Java编写服务器的客户端/服务器游戏。

答案 8 :(得分:1)

如果你想阅读那些乐于使用java进行严肃游戏开发的游戏工作室的声明,那么在Twitter上搜索#javaforgames https://twitter.com/search?q=javaforgames

通过研究Java开发人员的推文得出结论,如果将Java与高级游戏引擎API(如libgdx和jmonkeyengine)结合使用,可以很好地进行游戏开发,这既可以简化开发工作,又可以调整游戏以利用现代GPU硬件提供的OpenGL / ES硬件加速。

Java允许在移动设备,控制台和桌面上使用所述引擎实现跨平台目标。

一些游戏开发人员更喜欢在游戏设计阶段使用java来设计内部工具。

寻求最佳性能的Java游戏工作室和开发人员可以通过直接使用JOGL或LWJGL严格控制OpenGL来存档它。如果时间和金钱允许,性能和灵活性通过编写自己的引擎来存档。

答案 9 :(得分:1)

编写一个在Java中没有垃圾收集的常量内存中运行的程序是非常困难的。

答案 10 :(得分:0)

我会以一种非常不同的方式回答。

如果Java可以编写像C这样的设备驱动程序,你怎么能想象它会比驱动程序已经编写的语言更快?

答案 11 :(得分:0)

虽然陈旧,但似乎没有人指出

Android上的所有游戏和应用都是用Java编程的

因为Android不仅是用Java编写的,所以大多数应用程序/游戏都是等等......

答案 12 :(得分:0)

这不是技术问题,而是纯粹的“客户光学”问题。

良好的Java代码可以像良好的C ++代码一样快地运行。它可以通过LWJGL和JMonkeyEngine等项目以与原生C ++一样快的速度访问OpenGL。

真正的原因是Sun从未付出任何努力来突出Java游戏,他们从来没有对Java游戏进行任何特别容易的部署。开发人员/团队为玩家创造无缝/顺畅的安装(和启动?)体验需要大量的工作和努力。

客户在看到徽标时,在安装过程中不会“信任”Java游戏并保释。

答案 13 :(得分:0)

简短的回答是因为几乎没有游戏平台支持Java,或者如果他们这样做,那么有更好的选择。

在游戏机上,经验丰富的游戏开发者正在使用C,因为这是他们20年来一直在做的事情。 Java游戏不存在令人信服的理由。

在桌面上,有一些Java游戏,但它们无法与“魔兽世界”等市场领导者竞争。

在网络上,Applet已经死了,如果你打算做一个休闲游戏,它将会在Flash中。

在移动领域,JME已经有了它在阳光下的时间,但是面对远程优越的平台,如iPhone,它已经过时了。

Java在游戏世界中扮演重要角色的完美世界场景将是Sun / Oracle提供像Wii或iPhone这样的游戏平台 - 这是每个人都拥有的必备设备。然后,开发人员有充分的理由花时间尝试新技术。但鉴于Sun和甲骨文显然对消费者市场缺乏兴趣,他们制作游戏装备的可能性很小。

答案 14 :(得分:0)

控制台游戏市场比PC游戏市场大10倍(财务上)。对于当前一代的控制台,所有主要的编程都是用C或C ++编写的,带有一些内在函数或汇编程序。如果你想成为一名专业的游戏程序员并在任何一家大型游戏公司工作,那么就学习C和C ++。

更重要的是,所有作为许多商业游戏起点的商业跨平台引擎现在也都是C或C ++。

您可以在Java和Flash中使用小型游戏,甚至可以在C#中使用休闲Windows游戏。您甚至可以为XNA游戏编写C#代码,但如果您想制作 REAL (在DVD上按下)XBOX 360游戏,您需要学习C ++。

在WBGames芝加哥担任游戏开发人员。我们不会雇用一个没有强大C ++技能的程序员。在我所知道的其他所有游戏工作室也是如此。

答案 15 :(得分:0)

惯性主要是......虽然它现在有点老了,你可以看一下Jake2(这是一个纯粹的Java端口Quake 2,jogl是openGL lib)。

它的速度可以达到C ++原创速度的85%,这对大多数游戏来说都很好;特别是现代的,更多的是社交和游戏,而不是有限的“硬核”游戏。

我还建议你在这里得到的大多数答案来自游戏爱好者/“我想要最酷的硬件和游戏”。对于[这些]硬核3D游戏和游戏玩家来说,最终的15%非常重要,因为这就是将150美元的显卡与他们刚购买的500美元分开的显卡。

据报道约翰卡马克已经说过(有些话):“如果我现在要进入游戏编程,我会为iPhone编程”。例如使用最好的3D引擎制作最快的游戏并不是那么有趣,因为它是制作最好的游戏。

答案 16 :(得分:0)

我认为这主要是因为c让开发人员从硬件中挤出最后一点点性能,而Java却没有,它对于像高端3D视频渲染器这样的东西来说不够低。基本上c可以让你在下一代射击游戏中每秒挤出几帧。

答案 17 :(得分:0)

我不会说C在游戏编程方面总是优于Java。

例如,如果你想编写一个可以在网页中托管的游戏客户端,Java可能会更好。

当编写产生令人惊叹的3-D图形的游戏(例如,X-box上的Halo)时,通常几乎没有足够的计算速度来生成每帧的所有像素。在这种游戏中,C会优于Java,因为它允许程序员编写更快的程序 - 在提取速度方面难度很大。