Czy masz jakieś wskazówki / rekomendacje dotyczące tworzenia gry międzyplatformowej w C / C ++?
Czy masz jakieś wskazówki / rekomendacje dotyczące tworzenia gry międzyplatformowej w C / C ++?
Odpowiedzi:
Ukryj wszystko specyficzne dla platformy za warstwami abstrakcji
Oznacza to takie funkcje, jak renderowanie, audio, wprowadzanie danych przez użytkownika i operacje wejścia / wyjścia pliku. Jedną z powszechnych sztuczek w abstrakcjonowaniu tego bez powodowania obniżenia wydajności w czasie wykonywania są niezależne od platformy nagłówki z plikami implementacyjnymi specyficznymi dla platformy:
// FileSystem.h
class FileSystem {
public:
FileHandle OpenFile(const char * path);
// other stuff...
}
// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
// call windows API...
}
Następnie skonfiguruj kompilacje dla każdej platformy, aby były budowane z odpowiednim plikiem .cpp.
Spraw, by potoki treści były odczytywane w zasobach niezależnych od platformy i generowały treści właściwe dla platformy dla każdej platformy
Na przykład utwórz tekstury jako .tga lub po prostu .psd, a następnie przygotuj potok, który może automatycznie przekonwertować je na różne formaty specyficzne dla platformy.
Nie zakładaj określonego układu pamięci ani endianizmu danych
Platformy mogą różnić się kolejnością bajtów, dopełnianiem, wyrównaniem i rozmiarem słów. Każdy kod, który się tym przejmuje, musi zostać dokładnie przetestowany na wszystkich platformach.
Testuj przez cały czas na wszystkich platformach
Ugryzą Cię błędy specyficzne dla platformy. Wolisz zostać ugryziony teraz, czy właśnie wtedy, gdy próbujesz wyciągnąć grę z domu?
Użyj interfejsu API takiego jak opengl / sdl, który da ci minimalne problemy podczas przechodzenia z platformy na platformę.
Upewnij się, że wiesz, jakie platformy chcesz obsługiwać. Nie korzystaj z OpenGL tylko dlatego, że uważasz, że możesz w przyszłości wesprzeć wiele platform. Zacznij, jak chcesz kontynuować.
Dowiedz się, jakie są ograniczenia sprzętowe na każdej platformie, którą chcesz obsługiwać.
Staraj się unikać rozproszenia #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endif
całego kodu.
Czasami wygląda na to, że jest to łatwiejszy sposób, ale na dłuższą metę sprawi ci kłopotów. Powinieneś spróbować ograniczyć je do własnego pliku, aby każda implementacja platformy była samodzielna.
Dodanie platformy powinno polegać głównie na dodawaniu nowych plików implementacyjnych i modyfikowaniu tylko kilku potrzebnych już istniejących.
Istnieje wiele bibliotek, które same są wieloplatformowe; nie musisz pisać bezpośrednio w OpenGL, aby uruchomić w dowolnym miejscu. OGRE to świetny przykład silnika renderującego, który działa na każdej platformie, którą chcesz nazwać.
Z mojego doświadczenia wynika, że największym problemem jest twój system kompilacji. Jeśli programujesz w systemie Windows za pomocą programu Visual Studio, kod może się kompilować w systemie Linux, ale trudno będzie go łatwo skompilować . Spójrz na systemy kompilacji, takie jak CMake, które mogą korzystać z tych samych instrukcji kompilacji do generowania plików projektów specyficznych dla platformy (makefile w systemie Linux, VS Projects w systemie Windows, XCode Projects w systemie Mac itp.).
Pisząc swoje funkcje do zapisywania i ładowania plików lub komunikacji przez sieć, nie zapomnij o endianice .
Zamiast odczytywać dużą strukturę za pomocą jednego wywołania fread / fwrite lub czegoś takiego na niskim poziomie, utwórz ReadByte / WriteByte i ReadFloat / WriteFloat. Będziesz miał mniej miejsc do wprowadzenia zmian, jeśli później zdecydujesz się na inną platformę.
#ifdef PLATFORM_WIN
ftw