Membuat dan Mengoptimalkan Game Android NDK di Platform Berarsitektur Intel


* Artikel ini dipersembahkan oleh Intel Developer Zone. Untuk Mengetahui lebih lanjut tentang membuat aplikasi Android di Arstitektur Intel, kunjungi Intel Developer Zone for Android. Artikel asli dari artikel ini dapat dilihat di link ini.

Android Native Development Kit (NDK) adalah peralatan pendamping Android SDK yang memungkinkan kamu untuk mengimplementasikan kode native seperti C dan C++ di beberapa bagian aplikasi kamu.

Kamu dapat mengunduh peralatan NDK di: http://developer.android.com/tools/sdk/ndk/index.html#Downloads

NDK untuk x86 Instruction Set Architecture

Android adalah sistem operasi open source yang dikembangkan oleh Google. Saat ini, Android dapat dijalankan di 3 keluarga instruction set architecture: ARM, x86, dan MIPS. x86 menandakan keluarga instruction set architecture yang berbasis Intel 8086 CPU yang dikenalkan pada tahun 1978. Mari kita jabarkan dari sudut pandang aplikasi perbedaan antara x86 (biasa disebut juga Intel Architecture atau IA) dengan chipset lainnya yang dapat menjalankan Android.

Aplikasi Android dapat diklasifikasikan ke dalam dua tipe:

  • Aplikasi Dalvik yang memasukkan kode Java dan menggunakan hanya Android SDK API resmi dan file sumber yang diperlukan saja seperti .xml dan .png yang kemudian dikompilasikan ke dalam file APK.
  • Aplikasi Android NDK yang memasukkan kode Java dan file sumber ditambah kode C/C++ dan kadang-kadang kode assembly. Semua kode native dikompilasikan menjadi dynamic linked library (file .so) dan dipanggil oleh Java di program utama melalui mekanisme JNI.

Android Game Engine

Game engine adalah modul kunci untuk aplikasi game. Ada beberapa game engine yang dapat dijalankan di Android termasuk engine 2D dan 3D yang open source maupun yang komersial. Oleh karena itu, sulit untuk memigrasikan dan mengembangkan game Android ke platform IA. Cocos2d-x dan Unity 3D adalah game engine paling populer di Android.

Cocos2d-x berbasis pada Cocos2d-iPhone dan terdiri memberi dukungan platform yang lebih luas dan dengan banyak bahasa pemrograman yang memiliki struktur API yang sama. Sejak dikenalkan pada tahun 2010, Cocos2d-x telah diunduh lebih dari 500 juta kali. Pemain besar di industri mobile game seperti Zynga, Glu, GREE, DeNA, Konami, TinyCo, Gamevil, HandyGames, Renren Games, 4399, Happy Elements, SDO, dan Kingsoft sudah menggunakan Cocos2d-x.

Unity 3D adalah game engine lintas platform dengan IDE yang terintegrasi yang dikembangkan oleh Unity Technologies. Ini digunakan untuk mengembangkan game untuk plugin web, platform desktop, konsol, dan perangkat mobile serta sudah digunakan oleh lebih dari satu juta pengembang aplikasi. Unity 3D berkembang dari peralatan pengembangan game untuk OS X pada tahun 2005 hingga menjadi game engine lintas platform. Pembaharuan terbaru dari Unity 3D, Unity 4.1, dirilis pada bulan Maret 2013. Saat ini sudah mendukung pengembangan game untuk iOS, Android, Windows, BlackBerry 10, OS X, Linux, peramban web, Flash, PlayStation 3, XBox 360, Windows Phone, dan Wii.

Mengembangkan Game Android NDK di Platform IA

Sebelum kita berbicara tentang pengembangan game, kita sebaiknya berbicara tentang platform Android secara umum terlebih dahulu. Seperti yang diketahui, game muncul dengan berbagai macam gaya. Setiap gaya game memerlukan prinsip desain yang berbeda. Pada awal mula proyek, biasanya ditentukan genre dari sebuah game terlebih dahulu. Kecuali jika kita menemukan sebuah gaya game yang benar-benar baru dan belum pernah dilihat sebelumnya, ada kemungkinan besar ide game kita masuk ke salah satu genre populer. Kebanyakan genre telah memiliki standar mekanis game (contoh: skema kontrol, tujuan spesifik, dan lain-lain). Menyimpang dari standar ini dapat membuat sebuah game menjadi terkenal karena pemain game selalu ingin sesuatu yang baru. Beberapa genre umum adalah sebagai berikut:

  • Arcade & Action
  • Permainan Otak & Teka Teki
  • Kartu & Kasino
  • Kasual
  • Live Wallpaper
  • Balapan
  • Olah Raga
  • Widget
  • dan lain-lain

Proses pengembangan game Android yang umum mirip dengan pengembangan aplikasi Android lainnya. Pertama, untuk Android SDK dan NDK dari situs web Google dan instal mereka dengan benar.

Diasumsikan kamu sudah melaksanakan semua proses instalasi dan persiapan. Menggunakan game engine Cocos2d-x sebagai contoh, mari kita lihat bagaimana caranya membuat game untuk arsitektur Intel.

Unduh Cocos2d-x

Unduh versi stabil terbaru dari Cocos2d-x di situs web: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download

Eksekusikan Batch

Eksekusi batch melalui Windows Explorer. Ketika ditanya untuk lokasi proyeknya, set ke semacam com.proyekkamu.apasaja dan pilih nama proyek serta ID target. Ini akan membuat folder dengan nama proyek tersebut di dalam folder instalasi Cocos2d-x. Kamu seharusnya akan melihat eksekusi dari skripnya tanpa eror seperti di bawah ini:

Set Environment Variable untuk NDK_ROOT

Tambahkan environment variable berikut ini di akhir home\<nama kamu>\.bash_profile (pada kasus ini di c:\cygwin\home\user\.bash_profile):

NDK_ROOT=/cygdrive/<yourname>/

export NDK_ROOT

Restart cygwin dan masukkan cd $NDK_ROOT dan lalu seharusnya kamu melihat tampilan di bawah ini:

Eksekusi File build_native.sh

Konfigurasi bawaannya adalah ARM; kita harus mengubahnya untuk mengkompilasikan ke x86. Buka file \helloworld\proj.android\build_native.sh, cari perintah ndk-build, dan tambahkan parameter APP_ABI=x86 ke akhir perintah. Jalankan file tersebut di Cygwin dan kamu akan melihat seperti berikut ini:

Impor Proyeknya ke Eclipse

Sekarang masuk ke Eclipse, buat proyek baru, dan pilih impor dari proyek yang sudah ada.

Build dan Jalankan

Pada tahap ini, Eclipse akan menemukan beberapa masalah:

The import org.cocos2dx.lib cannot be resolved HelloWorld.java

/HelloWorld/src/com/young40/test line 26 Java Problem Cocos2dxActivity cannot be resolved to a type HelloWorld.java

/HelloWorld/src/com/young40/test line 30 Java Problem Cocos2dxActivity cannot be resolved to a type HelloWorld.java

/HelloWorld/src/com/young40/test line 33 Java Problem

Kamu harus mengimpor pustaka berikut ini ke Eclipse sebagai proyek:

cocos2d-2.1beta3-x-2.1.1/cocos2dx/platform/android/java

Masuk ke Project => Build dan lalu Run As => Android Application:

Dan lalu sebuah game framework untuk game engine Cocos2d-x akan dibuat. Kamu dapat menambahkan logika game, suara, gambar, dan lainnya ke proyek ini untuk membuat game yang lengkap.

Optimalisasi Game Android NDK untuk Platform IA

Intel System Studio adalah sebuah set peralatan untuk profiling dan optimalisasi aplikasi di platform Android. Tentu saja ini juga dapat kita gunakan untuk mengoptimalisasi game. Intel System Studio sudah termasuk:

  • Intel C++ Compiler
  • Intel Graphics Performance Analyzers
  • Intel VTune Amplifier
  • (Intel JTAG Debugger)

Di sini kita tidak akan membahas detil dari tiap alat. Sebaliknya, kita akan melihat dari sebuah contoh tentang bagaimana alat-alat Intel tersebut bekerja.

Pertama, mari kita pilih sebuah aplikasi, yang disebut Bounding Ball, yang akan kita jalankan di prosesor Intel Atom Z2460 (nama kode Medfield). Game tersebut memiliki lebih dari 800 bola yang bergerak dengan kecepatan acak dan berbenturan satu sama lain tanpa teratur. Kita dapat melihat performanya buruk dengan mengukur nilai FPS yang hanya 6 tanpa optimalisasi.

Kita dapat menggunakan Intel Graphic Performance Analyzers (Intel GPA) untuk mencari modul mana yang menghambat performa dan melihat mencari tahu apakah itu terkait CPU atau GPU.

Tampilan Intel GPA di bawah ini menampilkan grafik yang menjelaskan detil dari aplikasi ini melalui GPA di platform Android. Dari situ, kita bisa melihat bahwa total CPU yang digunakan mencapai 52,5%. Itu angka cukup tinggi untuk satu buah aplikasi. Sementara itu ISP Load, TA Load, TSP Load, dan USSE Total Load yang berjalan di dalam GPU hanya kurang dari 10% yang berarti bahwa beban GPU-nya normal. Oleh karena itu dapat kita simpulkan bahwa hambatan berada pada modul CPU. Untuk menganalisa lebih jauh tentang isu hambatan CPU, kita perlu untuk mem-profile kode menggunakan VTune Analyzer.

Di sini, kita tidak akan menjabarkan bagaimana caranya menggunakan VTune Analyzer, kita hanya akan membahas hasil yang kita dapatkan ketika menjalankan alat tersebut. Permasalahannya adalah fungsi sin dan cos di dalam libm.so. Jadi pertanyaannya adalah: kenapa aplikasi tersebut menggunakan banyak waktu dan siklus CPU untuk menjalankan kedua fungsi tersebut?

Dengan mengecek kode sumber pada aplikasinya, kita temukan bahwa dua fungsi bermasalah ini dipanggil setiap ketika sebuah bola digambar oleh OpenGL ES. Dikarenakan geometris dari semua bola adalah sama, hanya ukurannya yang berbeda, kita dapat menduplikasikan bola-bola menggunakan fungsi OpenGL glScale agar penggunaan fungsi yang bermasalah tersebut dapat dikurangi secara besar.

Setelah optimalisasi kode, performa meningkat sebesar 80%; nilai FPS-nya adalah 14. Lebih jauhnya, kita dapat mengkompilasikan aplikasinya dengan Intel C/C++ Compiler untuk mendapatkan performa yang lebih bagus lagi di platform berarsitektur Intel. Intel C/C++ Compiler memiliki banyak flag untuk optimalisasi performa di platform IA. Di sini , kita hanya akan mengenalkan beberapa saja.

  • SSSE3_ATOM
    Supplemental Streaming SIMD Extensions 3 (SSSE3 atau SSE3S) adalah sebuah set instruksi SIMD yang dibuat oleh Intel dan merupakan iterasi keempat dari teknologi SSE.
  • IPO
    Flag Interprocedural Optimization akan mengurangi pemanggilan fungsi yang berlebihan, menghilangkan kode mati, dan menyusun ulang propagasi dan prosedur konstan.
  • PGO
    Flag Profile-Guided Optimizations akan menganalisa dan memberikan banyak pertanyaan terbuka untuk pengoptimalisasi seperti:

    • Seberapa sering x > y
    • Seberapa besar ukuran dari count
    • Kode mana yang disentuh dan seberapa sering

Sebagai tambahan, Intel C/C++ Compiler dapat juga memperbagus aplikasi seperti berikut ini:

  • Prediksi cabang yang lebih akurat
  • Pergerakan blok dasar untuk memperbaiki tingkah laku cache instruksi
  • Keputusan yang lebih bagus untuk fungsi yang harus di-inline (membantu IPO)
  • Optimalisasi yang lebih bagus untuk pengurutan ulang fungsi
  • Optimalisasi untuk pernyataan switch
  • Keputusan vektorisasi yang lebih bagus

Menggunakan berbagai macam compiler dan parameter kompilasi, sebuah aplikasi dapat menghasilkan performa yang berbeda. Berikut ini adalah perbandingan performa dari dua compiler GCC dan ICC. Aplikasi Bounding Ball yang sama dijalankan di ponsel Android berbasis Intel Medfield. Bagian berwarna biru adalah performa versi GCC dan bagian berwarna merah adalah performa versi ICC. Dikompilasikan tanpa parameter apapun. Bagian kedua dari grafis tersebut adalah hasil kompilasi menggunakan parameter arch=atom. Bagian ketiga adalah hasil kompilasi ulang menggunakan semua parameter di atas. Terakhir, kita dapat melihat performa aplikasi yang dikompilasikan menggunakan ICC 60% lebih tinggi daripada GCC.

Kesimpulan

Kita sudah memberikan pengenalan singkat tentang pengembangan game Android dan optimalisasinya di platform IA. Game engine adalah bagian inti dari semua pengembangan game. Jika mereka berjalan dengan baik di platform IA, makan game-nya akan berjalan dengan baik pula. Kita menggunakan game engine populer, Cocos2d-x, sebagai contoh untuk mendemonstrasikan bagaimana cara mengembangkan game di platform IA. Intel juga menyediakan berbagai macam alat untuk membantu pengembang aplikasi dalam mengoptimalkan game mereka di platform IA. Dengan menggunakan Intel System Studio kita sudah menunjukkan langkah-langkah bagaimana cara mengoptimalisasi sebuah aplikasi demo.

* Kunjungi Intel Developer Zone for Android untuk mengetahui lebih lanjut. Artikel asli dari artikel ini dapat dilihat di link ini.