2010-06-04 12 views
5

Już kilkakrotnie spotkałem się z tym problemem i chciałem usłyszeć, jakie są inne doświadczenia i porady. Załóżmy, że masz działający i stabilny, ale stosunkowo mały silnik gry, który działa tylko na jednej platformie i chcesz przenieść go na inną platformę.Jak podejść do przeniesienia silnika gry na inną platformę?

Pierwszy krok jest oczywisty: należy wziąć kod, połączyć go z bibliotekami platform zamiast starych, wprowadzić niezbędne zmiany w projekcie lub ustawienia kompilacji docelowej, a następnie nacisnąć przycisk kompilacji. Pojawia się około pięciu do dwudziestu tysięcy błędów. Oczywiście istnieje wiele duplikatów, ale natychmiast pojawia się pytanie, jakie powinny być następne kroki?

W jaki sposób podejmiesz przenoszenie silnika gry na inną platformę lub dowolny kod specyficzny dla platformy, którego nie można po prostu skompilować na innej platformie ze względu na nieodłączne zmiany w projekcie systemu i interfejsu API? Jak przebrniesz przez te wszystkie błędy? W jaki sposób identyfikujesz części, które powinny być podchwycone jako pierwsze?

Ogólnie: w jaki sposób powinienem podejść do przenoszenia istniejącego kodu źródłowego?

Szukam ogólnej porady, jak podejść do portu kodu źródłowego. Załóżmy, że język programowania i kompilator są takie same na obu platformach, więc to głównie zmiany interfejsu API.

+0

również znalazł to, niektóre pomocne komentarze: http://stackoverflow.com/questions/2664254/how-does-porting-between-linux-and-windows-work – LearnCocos2D

+1

"Pierwszym krokiem jest przeniesienie absolutnie wszystkich platform - określony kod w jednym obszarze kodu źródłowego, obszar ten powinien mieć niewiele lub żaden konkretny element aplikacji, a następnie przepisać tę izolowaną część kodu dla nowego docelowego systemu operacyjnego. " – LearnCocos2D

Odpowiedz

3

Odpowiedź podręcznika (być może) może owijać wszystkie połączenia specyficzne dla danej platformy i korzystać z tych funkcji opakowania w całym kodzie, a nie w zależności od platformy. W ten sposób, jeśli możesz dopasować metody, które używasz jeden-do-jednego na obu platformach (łatwiej powiedzieć niż zrobić, być może), wtedy możesz wybrać, która funkcja specyficzna dla platformy jest wywoływana z twoimi funkcjami otoki, i nie zmieniać reszty logika w twoim kodzie.

Powiedzmy, że masz:

void RenderBadGuy(int badGuyID) 
{ 
    // Windows-specific bad-guy rendering code here 
} 

Na razie można tylko napisać ("G_" jest nazwą rodzajową)

void G_RenderBadGuy(int badGuyID) 
{ 
    RenderBadGuy(badGuyID); 
} 

To dodaje niewielką ilość narzutu do silnika, ale to shouldn nie rozbijają rzeczy tak, jak je masz (tylko dodatkowe wywołanie funkcji).

Teraz, w każdym miejscu, w którym używasz RenderBadGuy, po prostu użyj G_RenderBadGuy. Spłukać i powtórzyć dla wszystkich metod, a teraz później można przełączać się kod do czegoś jak

void G_RenderBadGuy(int badGuyID) 
{ 
    // now we're rendering on a Mac 
    RenderBadGuy_Mac(badGuyID); 
} 

i wówczas silnik główny nie zmieni.

Prawdopodobnie można to zrobić o wiele ładniej i bardziej ogólnie niż to (wskazówki dla funkcji, nie wiem), ale taki jest pomysł.

Możesz też zrobić coś podobnego do Java i rozmawiać w bibliotece z modułem, który z kolei zna specyfikę twojej platformy. Po prostu opracuj różne moduły (takie jak maszyny wirtualne) dla każdej platformy i rozwijasz swoją bibliotekę tylko raz.

+0

Wiem, że to właściwy sposób na zrobienie tego, jeśli stworzysz silnik gry, ale co, jeśli silnik gry już istnieje i ma wywoływanie specyficzne dla platformy w każdym miejscu? Nadal może być dobrym pomysłem, a następnie skończyłbym z mnóstwem pustych funkcji, które później mogę wypełnić rzeczywistym kodem, gdy kod będzie kompilowany bez błędów, czy to miałeś na myśli? – LearnCocos2D

+0

Zmieniono moją odpowiedź, aby wyjaśnić. – John

+0

Myślę, że łatwiej jest po prostu skomentować "specyficzne dla systemu Windows" rzeczy w RenderBadGuy, ponieważ i tak nie skompiluje się na platformie docelowej, a wtedy nie musiałbym zmieniać nazwy funkcji. Prawdopodobnie dwa porty nie będą rozwijane równolegle. Moją główną obawą jest to, jak sprawić, by działało na nowej platformie. Ale dziękuję za pomysł, dzięki któremu myślę! – LearnCocos2D

Powiązane problemy