Bagaimana saya bisa berjalan di beberapa platform menggunakan mesin khusus?


13

Mesin permainan seperti Unity dan Unreal dapat berjalan pada platform mutiple. Saya bertanya-tanya bagaimana mereka melakukan ini.

Saya telah menggunakan C ++ dan OpenGL untuk sementara waktu, dan apa yang saya cari adalah sumber daya untuk mengintegrasikan sesuatu yang akan memungkinkan saya berjalan pada platform yang berbeda tanpa menulis ulang. Sesuatu seperti LibGDX di mana Anda menulis kode menggunakan API dasar dan kemudian mengubahnya menjadi HTML, Android, iOS, dan lain-lain. Saya sadar bahwa saya dapat menggunakan mesin lain daripada menulis sendiri tetapi saya tertarik dengan pengalaman belajar.

Jawaban:


26

Port mesin Anda ke setiap platform. Tidak ada yang istimewa tentang itu. Jika Anda memiliki beberapa kode yang hanya Windows, maka tambahkan beberapa logika #ifdef dalam file atau tambahkan file kedua (sehingga Anda akan memiliki FooWindows.cppdan FooLinux.cppatau apa pun) yang mengimplementasikan fitur itu pada OS lain yang Anda pedulikan .

Publikasi sekali klik mempublikasikan bahwa mesin seperti Unity diizinkan karena Unity sendiri tidak pernah dimodifikasi oleh pengguna akhir. Anda hanya menulis skrip dan data, sehingga mesin memiliki binari pra-dibangun untuk semua platform dan tombol publikasikan hanya menggabungkan binari-binari tersebut bersama dengan data.

Mesin lain mengandalkan sistem build dan cross-compiler untuk membuat game yang dikompilasi saat dibutuhkan, seperti yang akan Anda lakukan dengan aplikasi lintas-platform non-game.

Untuk hal-hal seperti HTML5, ada alat seperti emscripten yang dapat mengkompilasi aplikasi C ++ untuk dijalankan dalam JavaScript. Anda pada dasarnya hanya perlu membuat port lain dari mesin Anda untuk emscripten (karena tidak dapat menggunakan pustaka C ++ yang sewenang-wenang).

Anda tidak harus menulis ulang seluruh permainan, tetapi Anda harus melakukan banyak pengembangan, pengkodean, dan pekerjaan porting untuk setiap platform baru yang ingin Anda dukung.


14
Dalam pengalaman saya bekerja dengan perangkat lunak lintas platform (proyek terbesar adalah HotSpot), Anda benar - benar ingin menghindari jika ifdef dilemparkan melalui kode. Ini pasti lebih baik untuk memiliki sesuatu seperti share/os/<linux>(atau share/cpu/x86) dan meletakkan semua kode spesifik platform di sana dan kemudian melakukan termasuk bersyarat. Setidaknya itulah yang dilakukan gcc, HotSpot, dan kernel Linux (bukan aturan yang sulit). Ya, Anda dapat mulai dengan hanya satu fungsi yang bergantung pada platform dan berpikir itu berlebihan tetapi tidak pernah tetap seperti itu dan menjadi berantakan dengan cepat jika tidak.
Voo

14

Tidak ada peluru ajaib di sini. Jika Anda ingin permainan Anda berjalan di beberapa platform, Anda harus menulis kode untuk beberapa platform (atau memanfaatkan perpustakaan pihak ketiga yang sudah melakukan ini untuk Anda).

Hal-hal yang Anda minta tidak selaras: Anda katakan (beri penekanan pada saya)

yang saya cari adalah sumber daya untuk mengintegrasikan sesuatu yang akan memungkinkan saya berjalan pada platform yang berbeda tanpa menulis ulang

tetapi juga itu (tekankan lagi)

Saya sadar bahwa saya dapat menggunakan mesin lain alih-alih menulis sendiri tetapi saya tertarik dengan pengalaman belajar .

Anda cukup banyak harus melakukan satu atau yang lain: memilih untuk menggunakan perpustakaan pihak ketiga, mesin dan / atau rantai alat yang menyediakan dukungan lintas-platform untuk Anda, atau membangun sendiri dengan menulis kode lintas-platform (mendesain Anda miliki abstraksi atas platform yang tersedia untuk Anda, dan implementasikan abstraksi itu untuk setiap platform).

Mesin permainan seperti Unreal atau Unity yang mendukung ini mengkompilasi ulang kode Anda terhadap abstraksi platform yang sesuai, atau mengharuskan Anda untuk membangun pustaka atau DLL terhadap API internal mereka, yang mereka muat dari driver khusus platform yang dapat dieksekusi yang telah mereka kompilasi untuk yang sesuai peron.


2

Bertentangan dengan dua jawaban lainnya (yang memang seharusnya C ++ - spesifik), ada cara lain. Beberapa arsitektur yang muncul di pikiran:

  • Port mesin Anda: Ubah atau tulis kode sehingga berfungsi di berbagai platform. Ini dibahas dalam jawaban di atas.
  • Tulis sesuatu di atas pustaka lintas platform: Ini adalah contoh libGDX, yang berjalan di Java. Java berjalan di Desktop, Android, dan iOS (via RoboVM). Dengan menggunakan sesuatu seperti Java, Anda mendapatkan manfaat dari platform tambahan gratis ketika pustaka / alat yang mendasarinya mendukungnya. Dalam hal ini, ketika RoboVM keluar, libGDX (hampir) "hanya berfungsi" di iOS.
  • Tulis pembuat kode: Ini adalah pendekatan Haxe dan alat-alat lainnya. Anda memiliki bahasa inti (mis. Haxe / AS3), dan Anda menulis konverter yang menghasilkan keluaran untuk bahasa lain. Misalnya. Haxe mengonversi ke C ++ untuk Desktop, Java (saya pikir) untuk Android, dll.

Secara pribadi, saya menemukan pendekatan libGDX adalah yang paling sederhana: temukan bahasa atau platform yang memenuhi kebutuhan Anda, dan tulis di atas. Pembuatan kode dan mesin portabel rumit dan sulit untuk ditulis dengan baik.

libGDX sebenarnya adalah pilihan yang bagus, karena hits baik ponsel besar, desktop, dan web (melalui applet atau kompiler web Google).


Bahkan dengan Java atau C #, Anda tidak mendapatkan kode lintas platform secara ajaib; Anda masih harus mengetahui perpustakaan pihak ke-3 yang mungkin memiliki dependensi platform (misalnya, SlimDX atau SharpDX akan menjadi pilihan yang buruk untuk proyek C # lintas-platform).

@ JoshPetrie Anda tentu saja mendapatkan banyak "gratis" dibandingkan dengan menggulir mesin C ++ Anda sendiri dan memindahkannya ke berbagai platform.
ashes999

@ ashes999 terima kasih atas jawabannya, libGDX sangat brilian Saya menggunakannya tetapi saya akan menulisnya agar bisa bekerja lintas platform kemudian menggunakan CMake, saya lebih banyak membahas tantangan daripada menggunakan perpustakaan atau mesin yang sudah ada sebelumnya
DanielCollier

2

Saya sedang membangun mesin permainan lintas-platform saat ini. Saya menggunakan SDL, yang merupakan pustaka lintas-platform yang sangat baik (dan level rendah) untuk membangun aplikasi grafis, untuk mengurangi rasa sakit.

Selain itu, banyak "kode khusus" untuk setiap platform. Ini Anda hanya harus melewati. Saya telah menemukan ini sebagai bagian yang sangat kecil dari waktu pengembangan saya sejauh ini, kebanyakan menghabiskan waktu mencari dokumen untuk sistem yang saya tidak terbiasa dengan Linux asli saya.

Saya akan mencegah Anda menggunakan #ifdef mana-mana di seluruh kode Anda. Sebagai gantinya, buat abstraksi di sekitar primitif kunci (contoh primitif semacam itu mungkin soket TCP).

Ketika Anda menemukan masalah baru yang membutuhkan solusi berbeda per-lingkungan, tanyakan pada diri sendiri "bisakah saya menyelesaikan masalah ini hanya dengan menggunakan cross-platform primitif yang telah saya buat?" Jika jawabannya adalah ya: voila, kode lintas-platform sederhana. Jika tidak, cari tahu primitif apa yang Anda lewatkan dan terapkan.


0

Jika Anda ingin melakukan ini "dari awal" sebagai pengalaman belajar maka Anda harus menggunakan Win32 API di mana Anda dapat menemukan informasi tentang membuka jendela dan konteks OpenGL pada MSDN dan pada wiki OpenGL ( http: // www .opengl.org / wiki / Creating_an_OpenGL_Context_ (WGL) ). Untuk Linux, dapatkan salinan kedua dari Manual Pemrograman O'Reilly Xlib dan Manual Referensi Xlib dan baca juga di GLX (OpenGL Extension to the X Window System). Lihat juga http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)

Maka Anda hanya perlu memberikan API yang sama ke aplikasi Anda dengan fungsi yang melakukan hal yang sama (misalnya membuka jendela) tetapi memiliki implementasi yang berbeda untuk setiap platform. Anda menulis ulang bagian-bagian mesin Anda untuk platform yang berbeda. Kemudian gim yang Anda tulis menggunakan mesin Anda hanya perlu menulis sekali tetapi gim ini akan bekerja pada platform yang berbeda.


terima kasih atas jawabannya tetapi saya lebih suka hanya menggunakan SDL2 untuk windowing, platform lintas dan sangat mudah digunakan. bagaimana LibGDX menggunakan LWJGL untuk windowing
DanielCollier
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.