Adakah tip untuk membuat game lintas platform? [Tutup]

39

Apakah Anda memiliki tips / rekomendasi saat membuat game lintas platform di C / C ++?

Matias Valdenegro
sumber

Jawaban:

44

Sembunyikan apa pun yang spesifik platform di balik lapisan abstraksi

Ini berarti hal-hal seperti rendering, audio, input pengguna, dan file IO. Salah satu trik umum untuk mengabstraksi bahwa tanpa memaksakan penalti kinerja run-time adalah header platform-agnostik dengan file implementasi platform-spesifik:

// FileSystem.h
class FileSystem {
public:
    FileHandle OpenFile(const char * path);
    // other stuff...
}

// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
    // call windows API...
}

Kemudian konfigurasikan build untuk setiap platform agar sesuai dengan file .cpp yang tepat.

Buat pipa konten Anda dibaca dalam aset platform-independen dan konten platform-output spesifik untuk setiap platform

Misalnya, buat tekstur Anda sebagai .tga atau hanya .psd, lalu miliki pipeline yang dapat secara otomatis mengonversikannya ke berbagai format spesifik platform yang Anda butuhkan.

Jangan menganggap tata letak memori tertentu atau endianness dalam data Anda

Platform dapat bervariasi dalam urutan byte, padding, pelurusan, dan ukuran kata. Kode apa pun yang peduli tentang itu harus diuji secara menyeluruh pada semua platform.

Tes di semua platform, setiap saat

Anda akan digigit oleh bug khusus platform. Apakah Anda lebih suka digigit sekarang, atau tepat ketika Anda mencoba mengeluarkan permainan?

banyak sekali
sumber
2
kekurangan #ifdef PLATFORM_WINftw
tenpn
Anda tidak akan pernah bisa menghindarinya. Anda hanya bisa berharap untuk menguranginya.
murah hati
8
Cara yang baik untuk melakukannya adalah dengan memindahkan semua kode spesifik platform ke pustaka bersama yang diset dengan antarmuka yang sama maka Anda dapat membatasi # ifdef's untuk mem-bootstrap pustaka yang benar untuk platform.
Neel
1
+1, komentar yang bagus. Ingat bahwa bahkan STL tergantung pada platform (dan ya, beberapa fungsi melakukan hal yang berbeda pada kompiler yang berbeda).
Simon
Tentunya memanggil fungsi tambahan akan menurunkan kinerja? CPU harus memuat atau memindahkan data dari register atau lebih buruk, memori yang masih lambat. Bukankah panggilan sistem sudah cukup?
TheBlueCat
10
  • Gunakan api seperti opengl / sdl yang akan memberi Anda kerumitan minimum saat pergi dari platform ke platform.

  • Pastikan Anda tahu platform apa yang ingin Anda dukung. Jangan gunakan OpenGL hanya karena Anda pikir Anda mungkin ingin mendukung multi platform di masa depan. Mulai seperti yang Anda inginkan.

  • Ketahui batasan perangkat keras apa pada setiap platform yang ingin Anda dukung.

SD021
sumber
Poin kedua tidak bisa cukup ditekankan. Pastikan Anda tahu untuk siapa game ini ditujukan (artinya, jika ini adalah game kasual, Anda ingin memilikinya setidaknya di OSX dan Windows, sehingga OpenGL akan menjadi pilihan terbaik). Adapun poin ketiga - dan di sinilah mesin ikut bermain - juga penting. Adalah tidak masuk akal untuk menggunakan mesin yang kaya fitur dan kaya sumber daya seperti Unreal untuk membuat game DS. Poinnya juga terkait dengan apa yang saya katakan mengenai yang kedua: Tetapkan siapa yang menjadi sasaran permainan. Jika Anda menggunakan gim kasual, kebanyakan komputer orang tidak akan menangani, katakanlah, partikel.
7

Cobalah untuk menghindari hamburan #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endifseluruh kode.

Terkadang sepertinya ini cara yang lebih mudah, tetapi itu akan memberi Anda kesulitan dalam jangka panjang. Anda harus mencoba membatasi mereka ke file mereka sendiri, sehingga setiap implementasi platform mandiri.

Menambahkan platform sebagian besar harus tentang menambahkan file implementasi baru, dan hanya memodifikasi beberapa yang sudah ada yang diperlukan.

NocturnDragon
sumber
4

Ada banyak perpustakaan yang sendiri lintas platform; Anda tidak perlu menulis langsung di OpenGL untuk menjalankannya di mana saja. OGRE adalah contoh mesin rendering yang bekerja pada platform apa pun yang ingin Anda beri nama.

Dalam pengalaman saya, masalah terbesar adalah sistem build Anda. Jika Anda mengembangkan di Windows dengan Visual Studio, kode Anda mungkin dikompilasi di Linux, tetapi Anda akan kesulitan membangunnya dengan mudah. Lihatlah sistem build seperti CMake yang dapat menggunakan instruksi build yang sama untuk menghasilkan file proyek platform-spesifik (makefiles di linux, VS Projects pada windows, XCode Projects pada Mac, dll).

Karantza
sumber
4

Saat menulis fungsi Anda untuk menyimpan dan memuat file, atau berkomunikasi melalui jaringan, jangan lupa tentang endianness .

Alih-alih membaca struktur besar dengan satu panggilan ke fread / fwrite atau sesuatu tingkat rendah seperti itu, buat ReadByte / WriteByte dan ReadFloat / WriteFloat. Maka Anda akan memiliki lebih sedikit tempat untuk melakukan perubahan jika Anda memutuskan untuk menargetkan platform yang berbeda nanti.

kevin42
sumber
+1 * 9000. Saya kira ini hanya akan berlaku untuk ponsel dalam hal arsitektur modern / bekas (RISC); tapi masih krusial.
Jonathan Dickinson