Używanie C ++ 11 do wieloplatformowego rozwoju silnika gry

18

Uwaga: To nie jest pytanie „podaj swoją opinię” na temat C ++ 03 i C ++ 11.

Nasz silnik gry, napisany w C ++ 03, został zaprojektowany do kompilacji w systemach Windows, OSX i iOS. Wsparcie dla systemu Linux jest planowane w (bardzo) bliskiej przyszłości. Nasze doświadczenie jest ograniczone, jeśli chodzi o konsole, dlatego zadaję to pytanie.

Obecnie zastanawiamy się, czy przejście na C ++ 11 i użycie niekompatybilnych funkcji standardu C ++ 11 może stanowić problem w najbliższej przyszłości, gdy będziemy musieli przenieść nasz silnik na dowolną konsolę obecnej generacji (być może kompilatory obsługiwane przez niektóre konsole nie obsługują jeszcze C ++ 11? Nie wiemy ...).

Tak więc, twórcy gier, którzy mają doświadczenie na wielu platformach i konsolach, czy uważasz, że powinniśmy trzymać się C ++ 03, dopóki nie pojawi się nowa generacja konsol i większość osób przełączyła się na standard C ++ 11 (czy już?). A może większość konsol korzysta z kompilatorów / support (VC ++, GCC lub wariantów?), Które już obsługują funkcje C ++ 11?

Samaursa
źródło
1
Moja wiedza jest nieco nieaktualna, więc nie opublikuję tego jako odpowiedzi, ale moje wcześniejsze doświadczenia z kompilatorami konsolowymi są takie, że masz szczęście, jeśli pasują one do starego standardu, nie mówiąc już o nowym.
Kylotan
1
Jakie funkcje i dlaczego są tak ważne, że rozważasz użycie standardu, który nie jest w pełni wdrożony nawet na najpopularniejszych platformach programistycznych?
snake5
4
@ snake5: auto, lambda's, alias szablonu, delegacja c-tor. Te funkcje nie tylko sprawią, że nasz kod będzie bardziej czytelny / łatwy w konserwacji, ale również zwiększą wydajność. Samo słowo kluczowe auto jest jedną z rzeczy, za którymi bardzo tęsknię, kiedy przechodzę z C ++ 11 na C ++ 03. Inne funkcje, takie jak szablony variadic, chociaż są bardzo wydajne i mogą zdecydowanie poprawić kod, możemy się obejść (i nie są do tej pory zaimplementowane przez kompilator VC ++).
Samaursa
Dodając do tego, co skomentował Kylotan, w pełni zgadzam się z jego opinią, a nawet dodaję konkretny przykład z mojego doświadczenia. Jeśli zamierzasz rozszerzyć ten silnik na platformę Android, co można zrobić za pomocą C ++, będziesz miał zły czas, ponieważ funkcje C ++ są niekompletne w NDK. Nie będziesz w stanie korzystać z nowego standardu, a nawet niektóre rzeczy z poprzedniego będą wadliwe.
Grimshaw
1
@DevilWithin, bez żadnych problemów korzystam z kilku funkcji C ++ 11 w Android NDK.
notlesh

Odpowiedzi:

19

Jeśli polegasz na swoim kodzie, aby płacić za jedzenie i schronienie, i potrzebujesz obsługiwać wiele platform na nieznanych przyszłych platformach (lub może być konieczne, aby w przyszłości obsługiwać różne platformy), zaprojektuj swój kod, aby polegał na grupa poprawnego przestrzegania przez nieznanych autorów kompilatorów najnowszych standardów językowych jest niebezpieczna (i powiedziałbym, nieodpowiedzialny). Jest to niebezpieczne dla ciebie, a zatem również niebezpieczne dla twoich podopiecznych.

Jeśli jesteś gotów podjąć takie ryzyko ze względu na auto, to na wszelki wypadek idź na całość. Ale nie zamierzam ci tego robić.

Ponieważ z mojego doświadczenia wynika , że przejście na wiele platform, szczególnie na konsole , najlepiej osiągnąć poprzez dążenie do najniższego wspólnego mianownika, co do którego masz pewność, że będzie działać praktycznie wszędzie, nie polegając na wszystkich najnowszych funkcjach języka Whiz-Bang. Jeśli któregoś dnia będziesz musiał przenieść się na platformę, która ich nie obsługuje, musisz przepisać swój system od nowa. Czy stać Cię na płacenie pensji / czynszu, dopóki tak się stanie?

Trevor Powell
źródło
4
+1 za to (i resztę postu, ale za to): „poleganie na pewnej grupie nieznanych autorów kompilatorów poprawne przestrzeganie najnowocześniejszych standardów językowych jest niebezpieczne”. Eksperymentowanie z najnowszymi zabawkami jest zawsze zabawne, polegając na nich nie tyle.
NoobsArePeople2
2
Zawsze bardzo zależy mi na udzieleniu tych „ostrożnych” odpowiedzi, szczególnie gdy wyraźnie nie są to, co chce usłyszeć oryginalny plakat. Ale widziałem duże błędy kompilatora na konsolach zbyt wiele razy w mojej karierze, abym mógł swobodnie wchodzić na nowe standardy językowe w projekcie międzyplatformowym. Konieczność przepisania kodu, aby obejść problemy w kompilatorze, nigdy nie jest fajna, szczególnie, gdy jesteś w terminie.
Trevor Powell,
Nie zamierzam głosować za tym, ale nowy standard C ++ to znacznie więcej niż cukier składniowy, taki jak słowo kluczowe auto.
vdaras
1
@TrevorPowell, powiedziałeś, że ryzyko, które by podjął, było ze względu na słowo kluczowe auto, gdy w nowym standardzie C ++ są znacznie ważniejsze i podstawowe funkcje. Niektóre z nich, takie jak odniesienia do wartości, należy wziąć pod uwagę przy rozważaniu ryzyka.
vdaras
2
@ TrevorPowell dlatego powiedziałem, że post nie jest warty głosowania w dół pomimo wszelkich moich argumentów na ten temat. Uważam, że jest to dobry post, chciałem tylko wyjaśnić, że nowy standard C ++ ma kilka bardzo ważnych funkcji i rozważenie jego zastosowania nie będzie dotyczyło drobnych rzeczy, takich jak auto.
vdaras
6

Jeśli chcesz wykonać nieco więcej pracy, możesz przyjrzeć się rozwiązaniom refrakcyjnym. W clang dzieje się obecnie kilka interesujących rzeczy. Powinno być możliwe użycie słowa kluczowego auto, uruchomienie go przez refaktor, który znajdzie wszystkie zastosowania tego słowa, rozwiąże je dla ciebie i wyśle ​​kod, a następnie skompiluje z dowolnym, co chcesz.

Ale to oznacza mniej czasu na pracę nad grą.

Istnieje również potencjał niektórych dodatkowych funkcji, na przykład odbicia. Możesz utworzyć klasę i automatycznie wygenerować listę wszystkich właściwości do sprawdzenia w czasie wykonywania. Może być bardzo przydatny do tworzenia skryptów, tworzenia edytorów gier i tak dalej. EDYCJA: Sprawdź clreflect .

http://cppnow.org/session/refactoring-c-with-clang/

http://www.youtube.com/watch?v=mVbDzTM21BQ

http://clang.llvm.org/docs/Tooling.html

http://clang.llvm.org/docs/RAVFrontendAction.html

David C. Bishop
źródło
Bardzo interesujące; czy próbowałeś tego sam do tego (lub podobnego) celu?
Jonas Byström
Jeszcze nie, postanowiłem poczekać, aż będzie trochę lepiej rozwinięty, ale ostatnim razem, gdy naprawdę się temu przyjrzałem, było to tylko w svn.
David C. Bishop
Bardzo interesujące (+1)
Samaursa
Przypomina mi to coś w rodzaju Pythona, 2to3ale na odwrót i jest o wiele bardziej niesamowite, ale prawdopodobnie trudniejsze w użyciu. Człowieku, o ile lepiej może być auto?
Steven Lu