65.9K
CodeProject 正在变化。 阅读更多。
Home

为原生支持运行 Android* 的 Intel® x86 CPU 准备 libGDX

2014 年 11 月 17 日

CPOL

5分钟阅读

viewsIcon

11044

libGDX 是一个开源的、跨平台的游戏开发框架,支持 Windows*、Linux*、Mac OS X*、Android、iOS* 和 Blackberry* 平台以及支持 WebGL 的浏览器。

概述

随着基于 x86 的 Intel® 架构 Android 设备在市场上的地位日益重要,libGDX 团队致力于确保开发者能够通过使用单一的跨平台框架无缝部署他们的游戏和应用程序。本案例研究简要介绍了 libGDX,然后展示了将庞大的现有代码库移植到基于 x86 的 Android 设备上所需的极少工作量!

什么是 libGDX?

libGDX 是一个开源的、跨平台的游戏开发框架,支持 Windows*、Linux*、Mac OS X*、Android、iOS* 和 Blackberry* 平台以及支持 WebGL 的浏览器。您可以使用 libGDX 以任何您选择的 JVM(Java* 虚拟机)语言(Java、Scala、Clojure、Kotlin*)编写游戏,然后将相同的代码库部署到所有支持的平台。在各种平台中,libGDX 支持 JVM 开发常用的所有 IDE,如 Eclipse*、NetBeans 和 Intellij IDEA*。测试和开发可以在很大程度上从桌面环境完成,从而加快开发和迭代速度,最大限度地减少耗时的设备部署。

无论是业余爱好者、小型独立开发者还是大型工作室,都在使用 libGDX 来创建桌面和移动游戏,例如谷歌的 Ingress、Robotality 的 Halfway(图 1)或 Kiwi Inc. 的一系列收入最高 社交游戏。非游戏应用程序也使用 libGDX,例如 Esoteric Software 的 Spine 2D 骨骼动画软件。

图 1. Robotality 的 Halfway 截图

自 2014 年第二季度发布 1.0 版本以来,libGDX 在 Maven Central 的月下载量约为 250,000 次,使其成为目前最广泛使用的开源跨平台游戏开发框架之一。

图 2. 过去一年 libGDX 的下载量

Intel、Android 和 libGDX

凭借庞大的用户群,我们很快意识到 libGDX 必须无缝支持基于 Intel® x86 的 Android 设备并提供最佳性能。我们将 libGDX 中所有性能关键部分都用原生 C/C++ 代码实现,并通过 JNI 绑定暴露给开发者,这样他们就可以继续使用自己选择的托管语言。

libGDX 包含广泛的特定于平台的原生组件,可帮助开发者创建高性能游戏。

  • CPU 端图形:虽然 libGDX 在很大程度上依赖于通过 OpenGL ES* 进行 GPU 端渲染,但仍然需要 CPU 端进行图像组合和处理。因此,libGDX 实现了一个功能齐全的 2D 渲染库,并集成了 FreeType 用于字体渲染。
  • 手动内存管理:Java 应用程序采用垃圾回收的运行时环境方法进行内存管理。虽然这在很多情况下很方便,但纹理或网格的原生内存资源需要手动管理。我们通过所有相关操作通过原生 C++ 代码来启用手动管理。
  • 线性代数:游戏开发的许多领域都依赖于矩阵、向量和四元数数学。一些游戏在矩阵乘法方面会遇到瓶颈。为了帮助解决这些问题,libGDX 以 C++ 和汇编语言实现了常见的线性代数运算。
  • 物理:大多数游戏需要一定程度的模拟物理来生成逼真的交互式世界。libGDX 集成了 Box2D 和 Bullet*,分别用于 2D 和 3D 物理。这两个第三方库都使用原生 C++ 编写,并带有特定于 CPU 的汇编扩展,如 Intel® Streaming SIMD Extensions 3 或 NEON*。

自成立以来,libGDX 一直支持 Windows、Linux 和 Mac OS X 上的 x86 和 x86 64 位。因此,我们乐观地认为,将 libGDX 移植到 x86 上的 Android 所需的工作量将非常小。以下是需要做的工作!

为 x86 设置 Android 构建

libGDX 的每个原生组件都有自己的子项目,每个平台都有相应的构建文件。对于桌面系统和 iOS,我们依赖 GCC/Clang 和一个自定义的基于 Apache Ant* 的构建系统。libGDX 的 Android 版本使用 Android Native Development Kit。NDK 构建通常由两个文件描述:Android.mk 和 Application.mk。在大多数情况下,只需在 Application.mk 文件中将 x86 添加为构建目标(如下所示)即可。很简单!

APP_ABI := armeabi armeabi-v7a x86
APP_PLATFORM := android-8
APP_STL := stlport_static

我们的一些组件具有特定于 CPU 架构的构建标志,例如用于启用 NEON、使用内联汇编等。为了获得第一个可运行的构建,我们禁用了所有这些标志。

测试

为了确保代码的稳定性,libGDX 附带了一套庞大的测试,我们可以在扩展到新平台时执行这些测试。在为 x86 Android 完成第一个 NDK 构建后,我们运行了 Bullet 物理测试集。结果非常成功!我们的测试在 Intel 为我们提供的用于测试的 ASUS MeMO Pad* FHD 10 上完美运行(图 3)。

图 3. 在 ASUS MeMO Pad* FHD 10 上运行 Bullet* 物理测试的示例

所有其他测试在 CPU 和 GPU 上也如预期般运行,让我们对 x86 的 Android 构建已准备好面向开发者充满信心。但是,我们能做得更好吗?

运用向量化

libGDX 的大多数原生组件都涉及某种形式的数学运算,其中许多运算可以由 GCC 自动向量化。所有当前可用的基于 x86 的 Android 设备都支持 Intel SSE3,所以让我们确保充分利用我们的 CPU!

ifeq ($(TARGET_ARCH),x86)
  LOCAL_CFLAGS := $(LOCAL_C_FLAGS) -mfpmath=sse -msse3
  LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS) -mfpmath=sse -msse3
endif

通过上述简单的调整,我们所有的原生代码现在都可以利用 SIMD 指令,只要编译器能够向量化我们的数学代码。请注意,我们无法对 ARM 执行相同的操作,因为并非所有 ARM 芯片都支持 NEON。这对 x86 Android 来说无疑是一个巨大的优势!

让开发者满意

从 1.0 版本开始,libGDX 项目自动支持基于 x86 的 Android 设备,其无缝程度与其他任何平台一样。新增的支持是帮助开发者满意 libGDX 的最后一块拼图。无需手动复制文件或设置标志,它就是可以正常工作!如果您对 libGDX 感兴趣,我们建议您阅读我们详尽的文档并观看我们的视频教程

结论

让 libGDX 及其庞大的原生代码库与基于 x86 的 Android 协同工作变得轻而易举。我们只需要为每个子项目修改 2 个文件(5 行)。现在,使用 Android 和 libGDX 支持基于 x86 的设备已成为现实。此外,开发者还可以利用 Intel® Hardware Accelerated Execution Manager 等工具进一步改进开发周期,并利用适用于 Android 的图形性能分析器来分析和基准测试他们的游戏。这对 libGDX 社区来说是一个巨大的胜利。

关于作者

Mario Zechner 是一位技术专家,在游戏开发到数据分析等广泛领域拥有 8 年以上的专业经验。他是开源游戏开发框架 libGDX 的创建者,也是《Beginning Android Games》一书的作者,目前他正在开发 RoboVM,这是一个用于 Java 虚拟机字节码的提前编译器。您可以在 Twitter (@badlogicgames) 和他的博客(http://www.badlogicgames.com)上找到 Mario。

© . All rights reserved.