Search This Blog

7/23/16

設定 libGDX 以原生支援 Intel® x86 CPU 執行 Android*

設定 libGDX 以原生支援 Intel® x86 CPU 

執行 Android*

概觀

隨著以 Android x86 為基礎的 Intel® 架構裝置在市場上數量大幅增加,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 建立桌面及行動遊戲,例如 Google 的Ingress、Robotality 的 Halfway (圖 1) 或 Kiwi Inc. 最暢銷的社交遊戲系列。非遊戲應用程式亦使用 libGDX,例如 Esoteric Software 的 Spine 2D 骨架動畫軟體。
圖 1:Robotality 的 Halfway 畫面截圖
自從 1.0 版於 2014 年第 2 季推出以來,libGDX 在 Maven Central 的每月下載次數約為 250,000 次,使其成為目前最廣為使用的開放原始碼、跨平台遊戲開發架構之一。

圖 2. 過去一年的 libGDX 下載次數

Intel、Android 及 libGDX

在使用者人數如此龐大的基礎下,我們很快就瞭解 libGDX 必須無縫支援以 Intel® x86 為基礎的 Android 裝置,並提供最大效能。我們以原生 C/C++ 程式碼實作所有 libGDX 的效能關鍵部分,然後透過 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 位元。因此,我們樂觀認為,x86 的 Android 移植作業應不繁瑣。以下是必須完成的作業!


設定 x86 的 Android 建置

每個 libGDX 的原生元件皆有自己的子專案,其中包含每個平台的建置檔案。在桌面系統與 iOS 方面,我們倚賴 GCC/Clang 以及一個自訂以 Apache Ant* 為基礎的建置系統。Android 版本的 libGDX 使用 Android 原生開發套件。NDK 建置通常由兩個檔案描述:Android.mk 與 Application.mk。多數情況下,只需將 x86 新增至 Application.mk 檔案做為建置目標即可 (如下所示)。就是這麼簡單!
APP_ABI := armeabi armeabi-v7a x86
APP_PLATFORM := android-8
APP_STL := stlport_static
我們的部分元件具有特定 CPU 架構的建置旗標;舉例來說,為了啟用 NEON,會使用內嵌組件等。為了取得第一個可運作的建置,我們已停用所有這些旗標。


測試

為確保程式碼的穩定性,libGDX 附帶大量的測試集,可在擴充至新平台時執行。在第一個適用於 x86 Android 的 NDK 建置之後,我們推出了 Bullet 物理測試集合。結果大獲好評!我們的測試可在 Intel 所提供的測試用 華碩 MeMO Pad* FHD 10 上順利執行 (圖 3)。

圖 3:在華碩 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 專用的 Graphics Performance Analyzers 圖形效能分析器來剖析及測試其遊戲的效能。這是 libGDX 社群的一大勝利。


No comments:

Post a Comment

Related Posts Plugin for WordPress, Blogger...