Pengembangan lintas platform C ++ / OpenGL ES (iOS / Android) [ditutup]

10

Saya sudah memiliki pengalaman yang wajar dengan C ++ dan OpenGL, dan saya baru-baru ini memutuskan untuk mencoba pengembangan game mobile. Setelah berhasil membuat aplikasi OpenGL ES Android sederhana menggunakan Java, saya meneliti cara untuk menargetkan Android dan iOS dengan kode penulisan ulang sesedikit mungkin. Saya mencoba menggunakan alat pengembangan aplikasi lintas platform Visual Studio 2015 dengan bangga, tetapi menemukan mereka terlalu baru dan karenanya sangat tidak terdokumentasi. Saya bisa membuat proyek templat yang diberikan program kepada saya, tetapi saya tidak tahu bagaimana, mengingat templat ini, saya dapat menambahkan aset ke dalam permainan atau menangani input layar sentuh.

Sayangnya saya memiliki keinginan spesifik, terlalu spesifik untuk ditemukan dengan Google. Saya ingin membuat game OpenGL ES menggunakan C ++, dengan pembungkus khusus platform tipis untuk Android dan iOS. Orang-orang telah mengajukan pertanyaan serupa kepada saya (walaupun tidak persis sama), dan lebih dari satu orang yang menjawab telah menyatakan bahwa apa yang ingin saya lakukan tidak hanya mungkin, tetapi juga relatif mudah, karena saya tidak perlu khawatir tentang UI.

Saya mencoba tutorial ini , tetapi sudah hampir tiga tahun dan karena itu mungkin dirancang untuk teknologi yang lebih tua, dan akibatnya saya bertemu dengan berbagai bug yang tidak ditemukan. Sampai sekarang, tutorial itu adalah hal yang paling dekat dengan apa yang saya inginkan yang saya temukan. Yang lainnya hanya untuk Android, atau merekomendasikan agar saya membayar ratusan dolar per tahun untuk menggunakan Marmalade SDK. Kadang-kadang saya merasa seperti hanya menulis kode dua kali, sekali di Jawa dan sekali di Objective-C, tetapi saya tetap termotivasi oleh pengetahuan bahwa solusi ini mungkin, tetapi untuk beberapa alasan, tidak dibahas di mana pun dalam detail modern mana pun.

Sebagai rangkuman, saya ingin membuat game OpenGL ES untuk iOS dan Android, dengan basis kode C ++ tunggal yang dibungkus dengan sejumlah kecil kode khusus platform. Namun, terlepas dari kenyataan bahwa beberapa orang telah merekomendasikan pendekatan ini, tidak ada yang bisa memberi tahu saya bagaimana melakukannya. Dapatkah seseorang memberi tahu saya jika itu benar-benar mungkin, dan jika demikian, apa yang dapat saya lakukan atau ke mana saya bisa belajar caranya?

Craig Horwood
sumber
coba cocos2d-x , atau unity3d
Ali1S232
1
unity3d jauh dari apa yang diminta OP karena Anda tidak memiliki akses sumber. Saya telah menggunakan cocos2d-x dan masalah kompilasi masih ada sampai tingkat tertentu. Pengaruh Objective-C juga terasa, beberapa mungkin menyukainya, tetapi bagi saya itu mematikan. Namun, ini merupakan solusi open source, jadi mungkin perlu diselidiki waktu OPs.
Matius Sanders

Jawaban:

6

Anda dapat menemukan jawaban saya untuk pertanyaan serupa di sini untuk membantu.

Anda juga mungkin merasa terbantu untuk melihat ke dalam kode sumber solusi lain. The Godot Engine misalnya adalah mesin game open source lintas platform sehingga Anda tidak perlu membayar apa pun.

Seperti yang saya sebutkan dalam jawaban saya yang lain Anda tidak perlu (dan kemungkinan tidak bisa) mengandalkan satu IDE untuk melakukan pekerjaan untuk Anda. CMake , Scons , dan banyak alat build lainnya dapat membantu proses kompilasi / pembangunan lintas lintas platform dan IDE.

Godot Engine , misalnya, menggunakan Scons dan proyek LLVM (alias kerangka kerja kompiler yang digunakan oleh clang kompiler C / C ++ / Objective-C) menggunakan CMake .

Pendekatan populer untuk gim adalah membuat mesin di C / C ++ dan, seperti yang Anda sebutkan, abstrak perincian platform yang jauh. Ketika datang ke iOS dan Android ini adalah logika manajemen siklus hidup yang berinteraksi dengan OS. Jika Anda ingin bekerja ekstra dan memanfaatkan Emscripten juga mengkompilasi untuk asm.js dan menyadari dekat kecepatan asli dalam browser, Anda melakukan sesuatu yang mirip dengan abstrak pergi loop utama di balik apa sebesar requestAnimationFrame panggilan.

Emscripten merekomendasikan penggunaan SDL untuk membuat proses porting lebih mudah karena dapat membantu menangani abstrak platform spesifik, tetapi tidak ada yang menghentikan Anda dari melakukan ini sendiri (selain banyak penelitian, debugging, dll).

Jika Anda benar-benar gila, Anda dapat melakukan apa yang saya lakukan dan menulis bahasa Anda sendiri menggunakan kekuatan LLVM untuk dikompilasi ke C ABI asli atau bahkan JIT pada platform yang didukung.

Intinya adalah ya itu memang mungkin, tetapi beberapa jalan lebih rumit / memakan waktu daripada yang lain.

Catatan: Anda mungkin perlu menggunakan Mac OSX melalui Mac, VM , atau Hackintosh dengan XCode untuk dikompilasi ke iOS. Ini adalah salah satu dari banyak alasan saya menemukan Macbook Pro menjadi kandidat yang bagus untuk sistem pengembangan.

Note2: Perlu disebutkan bahwa banyak mesin lintas platform saat ini menggunakan bahasa scripting untuk logika spesifik game. Unity bahkan tidak membiarkan Anda mendekati kode sumbernya misalnya (meskipun Anda dapat menulis plugin asli). Ini dapat membantu mempercepat siklus pengembangan serta menjaga porting seminimal mungkin karena bahasa skrip adalah platform agnostik (terutama bahasa yang ditafsirkan berjalan di VM). Tujuan bahasa saya adalah untuk memungkinkan JIT (kebanyakan untuk penghematan waktu pengembangan) dan kompilasi statis.

Note3: Jika Anda belum menemukan ini. Jika Anda tidak menggunakan SDL atau solusi lain yang abstrak spesifik platform, Anda perlu memanfaatkan fitur antarmuka C / C ++ spesifik platform. Dengan iOS, ini cukup sederhana di XCode karena kompiler (dentang seperti yang disebutkan di atas) sudah mendukung C / C ++. Dengan Android Anda perlu memanfaatkanpanggilan NDK dan marshall antara Java dan C / C ++.

Matthew Sanders
sumber
1
Saya melihat ke dalam kode sumber Godot Engine. Tampaknya sedikit berlebihan; Saya lebih suka membuat sendiri tanpa fitur yang tidak saya butuhkan. Saya tidak yakin bagaimana melakukan itu. Saya belum berhasil menjalankan kode C ++ di Android.
Craig Horwood
hehe ... ya NDK bukan piknik. Jujur saya menemukan apa pun google membutuhkan bantuan dalam kategori keramahan pengembang. Apakah menggunakan batas SDL off untuk Anda? Saya memiliki lebih banyak informasi yang dapat saya perbarui jawabannya jika perlu.
Matthew Sanders
SDL tidak terlarang, tapi saya lebih suka tidak pergi ke sana. Sekali lagi, selalu ada sedikit pengetahuan yang bisa dilakukan tanpa kerangka kerja.
Craig Horwood
Saya terus-menerus digigit oleh serangga itu, jadi saya tahu bagaimana perasaan Anda. Saya telah menggunakan NDK di masa lalu dan saya pikir tidak banyak yang berubah dalam hal pengaturan dan kompilasi. Saya yakin semoga debugging telah meningkat karena Anda harus menggunakan GDB langsung di masa lalu melalui terminal dan IDE tidak memiliki dukungan untuk itu, tetapi sepertinya mereka sudah mulai menambahkan dukungan NDK ke android studio . Sudahkah Anda mencoba contoh hellojni ?
Matius Sanders
NDK adalah salah satu hal yang paling menjijikkan yang ada, Anda mungkin menemukan bgfx berguna sebagai referensi github.com/bkaradzic/bgfx , tidak setipis yang Anda inginkan, ia memiliki banyak render backend
JBeurer