Apakah Anda memiliki tips / rekomendasi saat membuat game lintas platform di C / C ++?
Apakah Anda memiliki tips / rekomendasi saat membuat game lintas platform di C / C ++?
Jawaban:
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?
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.
Cobalah untuk menghindari hamburan #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endif
seluruh 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.
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).
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.
#ifdef PLATFORM_WIN
ftw