Wszelkie wskazówki dotyczące tworzenia gier na wiele platform? [Zamknięte]


Odpowiedzi:


44

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?


2
brak #ifdef PLATFORM_WINftw
tenpn

Nigdy tego nie unikniesz. Możesz po prostu zminimalizować to.
hojny

8
Dobrym sposobem na to jest przeniesienie całego kodu specyficznego dla platformy do zestawu bibliotek współdzielonych z tym samym interfejsem, a następnie można ograniczyć # ifdef do ładowania właściwej biblioteki dla platformy.
Neel

1
+1, świetny komentarz. Pamiętaj, że nawet STL jest zależny od platformy (i tak, niektóre funkcje wykonują różne czynności w różnych kompilatorach).
Simon

Czy na pewno wywołanie dodatkowej funkcji obniży wydajność? Procesor musi ładować lub przenosić dane z rejestrów lub gorzej, pamięć wciąż jest wolna. Czy połączenie systemowe nie wystarczyłoby?
TheBlueCat

10
  • 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ć.


Drugi punkt nie może być wystarczająco zestresowany. Upewnij się, że wiesz, dla kogo jest przeznaczona gra (co oznacza, że ​​jeśli jest to zwykła gra, chcesz ją mieć przynajmniej na OSX i Windows, dlatego OpenGL byłaby najlepszą opcją). Co do trzeciego punktu - i to właśnie tutaj wchodzi silnik - jest również ważny. Byłoby nielogiczne, aby używać bogatego w funkcje silnika o dużych zasobach, takiego jak Unreal, do stworzenia gry DS. Chodzi również o to, co powiedziałem w odniesieniu do drugiego: Ustal, dla kogo jest przeznaczona gra. Jeśli wybierasz się na zwykłą grę, większość komputerów nie poradzi sobie, powiedzmy, z cząstkami.

7

Staraj się unikać rozproszenia #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endifcał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.


4

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.).


4

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ę.


+1 * 9000. Myślę, że tak naprawdę miałoby to zastosowanie tylko do telefonów komórkowych w kategoriach architektury nowoczesnej / używanej (RISC); ale nadal kluczowe.
Jonathan Dickinson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.