是因为性能的原因吗?如果是,那么大多数繁重的工作都会由GPU完成,不是吗?
是因为性能的原因吗?如果是,那么大多数繁重的工作都会由GPU完成,不是吗?
您的操作受到限制:由于运行时开销,您无法充分利用硬件。想象一下Crysis用Java编写……即使这是唯一的可见区别,它也不会是相同的(我也很确定您需要Core i7才能运行它)。
这并不意味着这些语言在游戏开发中没有用武之地——不,我不仅指工具编程。对于大多数游戏来说,您不需要从C++中获得额外的性能优势,包括3D游戏,如果您从头开始编写所有内容,使用像XNA这样的东西就可以完美地解决问题——事实上,这有很大的可能性。
就商业游戏而言——RuneScape算吗?那可能是目前最成功的Java游戏。
最大的问题在于Java非常慢。在纯CPU / 内存 / 显示器 / 通信水平上,大多数现代手机应该比Game Boy Advance更好的游戏平台。使用Java,在大多数手机上,您只能拥有原始4.77 MHz IBM PC的CPU功率,并且对所有内容都没有很好的控制。 [...snip...] “一次编写,到处运行”?哈。哈哈哈哈。我们目前只在四个平台上进行测试,而且没有一个平台具有相同的特点。所有商业游戏都针对每个(通常为100个以上)平台进行调整和编译。可移植性不能成为糟糕性能的辩解。
(来源)
当然,他谈论的是移动平台,但作为一个C++背景的人,我发现Java作为整体存在类似的问题。我想念能够按照自己的条件在堆栈/堆上分配内存。
首先,Java缺乏运算符重载,这使得处理图形管线所需的所有数学运算变得非常繁琐且难以阅读。
如果使用良好格式化的数学表达式而非面向对象的表达式,所有必要的矩阵乘法和仿射向量都会更易于理解。
product = vector.multiply(projectionMatrix).dotProduct(otherVector);
太糟糕了。数学不应该看起来像那样。
我认为.NET在某种程度上有很多与Java相同的问题。微软只是在使用XNA方面向开发者做了更好的营销 :-)
首先是一些小问题:
Java所带来的生产力提升是假设性的。Java语法与C++几乎相同,因此您真正期望的只是在内存管理和标准库方面节省资源。标准库对游戏开发人员的实际意义不大,而垃圾回收机制由于存在争议,因此内存管理也存在争议。
跨平台“免费”并不像你想的那样好用,因为很少有开发者愿意使用OpenGL,并且一些关键平台可能缺乏良好的Java实现或其本地库的包装器,无论是用于图形、音频、网络等领域。
但主要问题在于向后兼容性。游戏开发人员从C到C++,再从汇编到C,仅仅是因为迁移路线顺畅。每种语言之间紧密互通,所有以前的代码都可以在新语言中使用,通常通过单个编译器即可实现。因此,迁移可以慢慢进行,也可以快速完成。例如,我们今天仍在使用的一些旧头文件中还有 #ifdef WATCOMC 的代码,但我认为这里已经有十年或更长时间没有使用Watcom编译器了。旧代码的投资很大,每个部分只会在需要时被替换和升级。如果您切换到一个与现有代码不能原生互操作的语言,那么从一个游戏到另一个游戏逐步替换和升级各个部分的过程就远远不如实际可行。是的,C++/Java之间的互操作性是可能的,但与仅仅编写“带有少量C++”或嵌入C的asm块比较起来,这非常不实用。
要真正取代C++成为游戏开发人员的首选语言,它必须做到以下两点之一:
就我个人而言,我不认为Java满足这两点要求。如果有人勇敢地成为先锋,一种更高级的语言可以满足第二点要求。(EVE Online可能是我们最好的Python使用示例,但它使用了Python主语言的一个分支,许多C++组件来提高性能,即使在现代条件下这也只是一个相对不那么苛刻的游戏。)
我正在玩《模拟人生3》,并且做了一些探索。 图形引擎是C++,而脚本和行为引擎则是C# / Mono。 因此,尽管C++用于时间关键的部分,但其他内容,如交互、游戏逻辑和AI,则在面向对象的托管语言中。
Java和其他虚拟机语言不常用于游戏开发的最大原因之一是垃圾回收。.NET也同样如此。垃圾回收已经有了很大的进步,在大多数类型的应用程序中表现良好。但是,为了进行垃圾回收,您需要暂停并中断应用程序以收集垃圾。这可能会导致定期出现卡顿。
对于实时应用程序,Java也存在同样的问题。当任务必须在特定时间运行时,很难让自动化任务(如垃圾回收)尊重它。
Java并不是缓慢的,而是不擅长处理实时任务。