【问题标题】:Android only game in OpenGL: performance in C++ (NDK) vs Java (Dalvik) [closed]OpenGL 中的 Android 唯一游戏:C++(NDK)与 Java(Dalvik)的性能 [关闭]
【发布时间】:2013-11-27 13:04:26
【问题描述】:

我知道以前有人问过类似的问题,但是...

我们想要开发(至少希望)一款独立游戏,但仍然是一款具有高质量图形的游戏,屏幕上有数百个甚至数千个移动物体,因此我们预计会有非常多的多边形和对 hittest 的需求,也许还有一些 AI .

我知道 java 的基本问题是垃圾收集。但这不是问题,我们计划在游戏开始之前分配所有需要的内存,对于瞬态对象我们将使用池化(因此在游戏循环中永远不会写入 new 关键字)。我们计划使用这里提到的所有可能的技术 (Google I/O 2009 - Writing Real-Time Games for Android)。

我们坚持 Java 的主要原因是部署,我们只想为 Android 开发(至少现在)

所以在游戏中使用 Java 是否可以实现与使用 c++ 相同的性能(即使这意味着丑陋/不惯用的代码)。如果不是,具体情况如何?或者,如果可能但非常非常不切实际,这些原因是什么?

(例如,我读过一些关于 java Buffers 和 OpenGL 的文章不是最好的配对,但不记得具体细节 - 可能是专家)

【问题讨论】:

    标签: java android c++ opengl-es android-ndk


    【解决方案1】:

    每次调用从 Java 源代码中使用 OpenGL,您需要支付固定的额外费用。 Android 围绕调用提供 Java 语言包装器。例如,如果您调用glDrawArrays,则您调用的是在GLES20.java 中声明的本机方法,该方法在android_opengl_GLES20.cpp 中定义。从代码中可以看出,它只是以最小的开销转发调用。

    在文件中四处寻找,您可以看到执行额外检查的其他调用,因此成本略高。

    不可避免的成本而言,使用 Java 源代码进行大量 GLES 调用的成本高于原生源代码。 (在查看 Android Breakoutsystrace 的性能时,我注意到驱动程序中有很多 CPU 开销,因为我正在执行大量冗余状态更新。从本机代码执行此操作的成本会更低,但做零工作的成本低于做更少工作的成本。)

    更深层次的问题与您是否需要以如此不同的方式编写代码(例如,为了避免分配)以至于您根本无法获得相同水平的性能。您必须使用直接的 ByteBuffer 对象而不是简单的数组,这可能需要您进行更多的管理。但除了当前在 Android 上计算密集型本机代码和 Java 代码之间的速度差异之外,我不知道有什么会从根本上阻止严格 Java 实现的良好性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2011-04-22
      相关资源
      最近更新 更多