【问题标题】:Programming for Android in a 100% C++ Environment?在 100% C++ 环境中为 Android 编程?
【发布时间】:2011-11-29 03:24:17
【问题描述】:

我一直在为我未来的游戏使用 C++ 开发游戏引擎运行时环境,并开始将 android 视为一个平台。我注意到它与 Java 紧密绑定并大量使用 Java VM。

但是是否有可能在 Android NDK 中维持完整的 C++ 运行时环境?我对 Java 没有任何反对意见,并且准备好在必要时使用它,但性能是我最关心的问题之一(我打算让我的游戏占用大量资源),尤其是在手机上。

如果一个完整的 C++ 环境是可能的,我将如何在 Eclipse Indigo CDT 中实现它?我是否能够提前为 Android 创建一个已编译的游戏可执行文件以获得最佳性能?我需要在 Eclipse 中安装任何其他插件吗?我可以使用 MinGW 来编译我的游戏,还是需要使用不同的编译器?如果我必须以一种或另一种方式使用 Java,是否甚至需要编译 C++ 代码?为了在 Eclipse IDE 中建立一个稳固的开发环境,这些都是我想要回答的问题。

请注意,我对 Android 开发和一般的多平台编程还很陌生。我的目标是创建一个能够充分利用新硬件的游戏引擎,尤其是在手机上!

感谢你们提供的任何建议!

【问题讨论】:

  • Android 有一个特殊的 JIT Java 编译器,Android 环境的很大一部分是 Java。没有理由更喜欢 C++ 而不是 Java 来提高 Android 上的速度,许多传统的性能影响并不存在。
  • 好的,这是我想知道的一件大事,谢谢。实际上,我刚刚找到了 NativeActivity 类 (developer.android.com/reference/android/app/NativeActivity.html),它看起来非常有前途,尤其是因为它看起来像是针对 C++ 游戏。我还需要 Android SDK 和 JIT 编译器才能让它工作吗?
  • JIT 是 Dalvik(Android 的 VM)的一部分,无论您是否使用 NativeActivity,Dalvik 都存在于系统上的每个进程中 - 它用于与系统的其余部分进行通信。
  • 好的,所以我假设我需要 SDK 和 NDK 才能使其工作。我将相应地在 Eclipse 中实现它。谢谢!

标签: android c++ android-ndk mingw eclipse-indigo


【解决方案1】:

在 Android 2.3 (API 9) 中添加的 NativeActivity 可能是您正在寻找的仅使用 C++ 编写 Android 游戏的内容。 http://developer.android.com/reference/android/app/NativeActivity.html

但是,既然您说您是新手,您可能希望从当前可用的 Android 游戏引擎之一开始,而不是立即编写自己的游戏引擎。与其他平台相比,移动设备有一组非常不同的约束。如果电池在下午没电了,手机就不是很有用了,所以以“资源密集型”为目标的项目开始已经是一个糟糕的开端。很少有人愿意在这里和那里玩 20 分钟的游戏,如果这意味着他们将无法在晚上打电话。

如果您的意思是您正在为高端图形拍摄,请记住,设备在这方面具有广泛的功能,并且仅定位高端会限制您的观众。不同的 GPU 具有非常不同的策略和性能特征,并且都有表现出色或落后的情况。最成功的手机游戏不是多边形数量最多或光照着色器最复杂的游戏,而是能够实现始终如一的流畅帧率和独特风格的游戏。

查看一些现有的 Android 游戏引擎并尝试一下。写几个小游戏让他们试驾,看看他们在哪里做,不与你想做的事情相吻合。如果您发现自己对可用的内容感到有限,请利用所学知识并尝试编写适合您想要制作的游戏类型的引擎。

这里有一些链接可以帮助您入门。这些引擎为 Android Market 上一些非常流行的游戏提供动力,许多开发者发现它们很有用:

http://www.andengine.org/andengine 是用 Java 编写的并且是开源的。

http://unity3d.com/ Unity 基于 C# 和 Mono。

http://www.madewithmarmalade.com/Marmalade,以前的 Airplay SDK 基于 C++。

【讨论】:

  • 这是一个非常好的回应。你是对的,我的目标是高端图形。我想我的意思是我想在不影响电池寿命/帧速率的情况下尽可能地利用资源,我希望我的游戏能够适应手机的图形功能(意味着调整多边形数量、着色器质量, 等等)。我最近一直在研究游戏引擎架构,但你说得对,我应该在决定如何制作最终的运行时环境之前使用和分析现有的引擎。非常感谢您!
【解决方案2】:

您要密切关注的答案是@adamp's。忽略他的回答,后果自负。

不过,为了解决您问题中的其他几点:

我能否提前为 Android 创建编译的游戏可执行文件以获得最佳性能?

不,只要 Android 不使用“编译的游戏可执行文件”。您的 C/C++ 代码将被编译成 Linux 共享对象 (.so) 文件,并与 APK 文件中的其他内容(如清单)一起打包。不过,编译 .so 会提前。

我可以使用 MinGW 来编译我的游戏吗?我需要使用不同的编译器吗?

我有一种明显的印象,即您会在尝试在 Windows 上的 Cygwin 中进行 NDK 开发时睁大眼睛。我衷心鼓励您在 OS X 或 Linux 上进行 NDK 开发。至少设置一个带有 Ubuntu 或其他东西的 VirtualBox 来进行 NDK 编译。

无论如何,NDK 都带有自己的 GCC 编译器。 AFAIK,MinGW 不是交叉编译器,大多数 Android 设备都没有在 x86 CPU 上运行。

如果我必须以一种或另一种方式使用 Java,是否还需要编译 C++ 代码?

是的。现在,对于 Honeycomb,您可以选择使用 Renderscript 进行 OpenGL 工作——这相当于一个 C99 环境,您不需要使用 NDK 编译其代码。

【讨论】:

  • 好吧,如果需要的话,我会在某个时候用 Ubuntu 设置 VirtualBox。我希望我有一台价格低于 600 美元的好 OS X 开发机器,因为我真的也想在 iOS 上进行开发。我想现在可以等一下。
【解决方案3】:

我已经尝试了很多,我发现其中一个最好的,它可以立即交叉编译到一堆其他设备,让你用 HTML5/C++ 组合编程你的好东西(sweeeeet)是 MoSync(http://www.mosync.com/)另一个对设置更友好的鲜为人知的是摩托罗拉的 MotoDev (http://developer.motorola.com/tools/motodevstudio/?utm_campaign=mhp01092012&utm_source=mhp&utm_medium=mws)

我注意到有一些虚拟机映像和教程可用于避免设置麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多