Objective-C czy C ++ dla gier na iOS?

18

Jestem całkiem pewny programowania w Objective-C i C ++, ale uważam, że Objective-C jest nieco łatwiejszy w użyciu i bardziej elastyczny i dynamiczny.

Jakie byłyby zalety i wady używania C ++ zamiast Obj-C do pisania gier w iOS? Czy raczej są jakieś znane problemy z używaniem Obj-C w porównaniu do C ++?

Na przykład podejrzewam, że mogą występować problemy z wydajnością Obj-C w porównaniu do kodu napisanego w C / C ++.

Martin Wickman
źródło
Podobne pytanie zostało zadane na SO
bobobobo

Odpowiedzi:

21

Jedna wielka zaleta C ++: jeśli zdecydujesz się to zrobić, relatywnie łatwo będzie przenieść się na Android / PC / DS / PSP / (tutaj wstaw platformę). Cel C zablokuje Cię w systemie iOS, dopóki nie zdecydujesz się przepisać całej gry.

ZorbaTHut
źródło
10
Nie zgadzam się ze słowem „łatwy”. „Możliwe” może być lepszym wyborem.
3Dave
1
Tak, w przypadku wielu mniejszych gier (np. Większość gier na iPhone'a) lepiej jest po prostu przepisać wszystko od nowa na nową platformę, niż próbować dostosować kod z jednej platformy do pracy na innej. Solidna architektura MVC zminimalizuje ten ból, ale kto by się tym przejmował w przypadku gry typu match-3?
jhocking
3
Względnie łatwe! Jeśli alternatywa jest niemożliwa, to „wyjątkowo trudne” jest stosunkowo łatwe;)
ZorbaTHut
blog.vucica.net/2011/06/… mówi o budowaniu aplikacji Celu C na Androida. To tylko Linux, a Linux może obsługiwać Objc tak łatwo, jak iPhone.
Feloneous Cat
Użycie celu c Cię nie zablokuje. Użycie funkcji specyficznych dla jądra XNU. Gclang istnieje nie bez powodu.
16

Nie ma tu prawdziwych zalet ani wad, a przynajmniej takich, które powinny zmusić programistę do wygodnego posługiwania się jednym językiem do korzystania z drugiego.

Wydajność nie powinna stanowić problemu. Jest mało prawdopodobne, aby pisać ciężkie podnoszenie z dużą ilością komunikatów w wewnętrznych pętlach, jeśli jesteś dobrym programistą Obj-C, co oznacza, że ​​naprawdę będziesz pisać te wewnętrzne pętle w C. Jeśli nie jesteś niski programistę poziomów, są szanse, że ciężkie podnoszenie zostanie wykonane przez biblioteki, które zdecydujesz się odłożyć na później, a będziesz na łasce tego, co zdecydujesz się zrobić.

Przenośność to prawdziwy problem, jeśli ci na tym zależy. Jeśli nie, to meh. Bycie wieloplatformowym to jeszcze nie koniec. Osiągnięcie sukcesu na pierwszym miejscu byłoby fajne :) Zawsze możesz później portować. Jeśli i tak nie planujesz być na wielu platformach od pierwszego dnia, samo bycie w tym samym języku nie zaprowadzi cię daleko: istnieje wiele innych rzeczywistych różnic między platformami, które wymagają rozwiązania.

Ukończenie projektu jest ważniejsze niż martwienie się technologią, a jeśli jesteś bardziej produktywny w Obj-C, pozostań w Obj-C.

Moja preferencja? Jestem facetem z C ++. I jak Obj-C dobrze, ale jestem szczęśliwy w C ++, a ja zrobić zapisu przekrój kod platformy.

Chris Subagio
źródło
5
Bardzo zgadzam się z radą, aby skoncentrować się na zakończeniu projektu za pomocą narzędzi, które są najbardziej wydajne. Unikanie przedwczesnej optymalizacji nie dotyczy tylko pisania kodu, to dobry sposób na zbliżenie się do życia.
jhocking
4

Nie ma problemów z wydajnością Obj-C w stosunku do C ++. Oba są skompilowanym kodem i przypominają, że Obj-C jest nadzbiorem C, a Obj-C ++ jest nadzbiorem C ++, co jest świetne, gdy chcesz mieszać Obj-C i C ++ w tym samym programie (łatwe do zrobienia i XCode ma ładne wsparcie dla strony C ++). Wszystkie kombinacje językowe obsługują OpenGL, więc każda poważna praca graficzna jest w porządku, a obsługa bibliotek jest zgodna z Apple bez względu na język.

To powiedziawszy, jaki jest cel twojej gry?

  • Jeśli piszesz wyłącznie dla IOS, nie martw się i pisz w dowolnym języku lub kombinacji, w której czujesz się bardziej komfortowo. Dla mnie jest to Obj-C ++ ze STL, ponieważ jest to moja ulubiona część C ++. Ponieważ wolę Obj-C nieco niż C ++, zwykle używam tej opcji.

  • Jeśli piszesz w celu przeniesienia na inne urządzenie, napisz w C ++ z warstwą tłumaczenia do Obj-C, aby poradzić sobie z wszelkimi specyficznymi dla urządzenia rzeczami (grafika, dane wejściowe, kamera, ...), do których dzwoni się punkty wejścia w Twojej aplikacji.

  • Jeśli jesteś najczystszy i chcesz tylko jednego języka, napisz w Obj-C.

Inni mówili o innych bibliotekach (fizyka i tym podobne). Nie ma absolutnie żadnych problemów z dostępem do któregokolwiek z wybranych języków (Obj-C, C ++ lub Obj-C ++). Nie będzie również żadnych problemów z wydajnością tych bibliotek w żadnym języku.

Zastrzeżenie: Istnieje wywołanie pośrednie wskaźnika z przekazywaniem wiadomości. Nie jestem pewien, jak bardzo można to zinterpretować jako narzut, ponieważ jestem prawie pewien, że jest to dokładnie to samo, co odziedziczone wywołanie metody C ++. Czy ktoś może to wyjaśnić?

Mam nadzieję, że to pomaga

Zawietrzny.

Zawietrzny
źródło
1
Dobre punkty, ale czy naprawdę chciałbyś napisać swoją Vector3Dklasę w Obj-C? Moje przeczucie mówi mi, że może to prowadzić do złej wydajności.
Martin Wickman,
1
To jest to. Obj-C to C. Nie jest to problem z wydajnością. Jeśli przejdziesz do standardowych plików nagłówkowych za pomocą XCode, przekonasz się, że podstawowe typy to po prostu struktury C.
Lee,
2
Narzut związany z wiadomościami w Obj-C jest nieco wyższy niż C ++, ponieważ jest bardziej dynamiczny. Z pewnością NIE jest to „dokładnie to samo”. np .: patrz developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
Andy Dent
1

To zależy dokładnie od tego , co programujesz. Jeśli jest to głównie logika gry wykorzystująca istniejące mechanizmy fizyki i grafiki, mogę śmiało powiedzieć, że nie widzę żadnego powodu, aby używać c lub c ++, jeśli wolisz obj-c. Jeśli zamierzasz wdrażać klasy renderowania lub fizyki, prawdopodobnie napisałbym te, używając c lub c ++. Cocos2d - cudowna i jedna z najpopularniejszych bibliotek gier na iOS napisana jest w obj-c.

Przeczytaj ten artykuł - odpowiednia część to „podział pracy”, może pomóc ci zdecydować, kiedy kodować w języku wyższego poziomu, a kiedy niższego poziomu: kod zarządzany w grach

Podczas gdy narzut na cel c nie powinien znajdować się w pobliżu C # i nawet nie jest zarządzany (w iOS), myślę, że logika nadal obowiązuje, a urządzenia z iOS również nie są tak silne, jak komputer, który interpretuje MSIL :)

Zaky German
źródło
2
Obj-C nie jest kodem zarządzanym w systemie iOS. Na przykład (a w szczególności) Obj-C ma moduł wyrzucający elementy bezużyteczne podczas programowania dla OSX, ale nie ma modułu wyrzucającego elementy bezużyteczne w systemie iOS.
jhocking
@jhocking, nigdy nie mówiłem, że udało się to zrobić, czy nadal nie ma narzutu podczas używania obj-c w przeciwieństwie do c ++? Wspomniałem o c # vs c ++ to nie było gdzie blisko obj-c vs ​​c ++
Zaky Niemiecki
Kiedy publikujesz link o nazwie „Zarządzany kod w grach”, gdy mówisz o Obj-C, rozumiem, że oznacza to, że myślisz, że Obj-C jest kodem zarządzanym. Który jest na OSX, tylko nie na iOS. To trochę głupkowate, jakby Java kompilowała się na kod maszynowy na niektórych platformach, ale działała w JVM na innych.
jhocking
no i nie wiem, czy Obj-C ma jakieś narzuty w porównaniu do C ++. Dlatego sam nie publikuję odpowiedzi.
jhocking
1
@ jhocking no sir :) „Chodzi o to, że model zatrzymania / wydania w Objective-C jest mniej więcej w połowie drogi od zarządzania pamięcią do podstawowego GC, więc jesteś już na dobrej drodze”. interfacelab.com/objective-c-memory-management-for-lazy-people
Zaky Niemiecki
1

To badanie mówi, że aby naprawdę uzyskać wydajność w grze intensywnie wykorzystującej procesor, musisz użyć C. Linkowany artykuł jest kompletny z projektem XCode, który możesz uruchomić.

Wierzę, że wiersz jest: Korzystanie z Objective-C, gdzie trzeba współdziałać z funkcji iPhone (po wszystkim oddanie trampoliny wszędzie nie może być dobre dla nikogo ), ale jeśli chodzi o pętle, takie rzeczy klas obiektów wektorowych lub intensywny dostęp do tablicy, trzymaj się tablic C ++ STL lub C, aby uzyskać dobrą wydajność.

To znaczy, byłoby głupio to widzieć position = [[Vector3 alloc] init] ;. Po prostu prosisz o wyniki wydajności, jeśli używasz referencji dla podstawowych obiektów, takich jak wektor pozycji.

Zobacz także te porównania,

porównania

Bobobobo
źródło
Downvoter? Proszę wytłumacz.
bobobobo