Mimo że C ++ wydaje się być królem, z tego, co mi powiedziano, C jest nadal szeroko stosowany w grach, zwłaszcza na konsolach. Czy jednak pisanie całego silnika gry w C byłoby dziś nieuzasadnione? Jakie są jakieś zalety C w porównaniu z C ++? Dlaczego ktoś miałby chcieć używać C zamiast C ++?
53
Odpowiedzi:
To rozsądne, ale pytanie brzmi: co kupuje? Prawdopodobnie nie potrzebujesz ekstremalnych możliwości przenoszenia, jakie oferuje C, i szkoda, że rezygnujesz ze wszystkich funkcji, jakie oferuje C ++, chyba że naprawdę przeciwstawiłeś się temu filozoficznie.
Lepszy czas kompilacji?
Myślę, że jest to głównie wybór estetyczny. Wiele osób lubi C, ponieważ jest prosty i minimalny oraz wydaje się czysty. C ++ ma wiele fajnych funkcji (same przestrzenie nazw sprawiają, że warto z niego korzystać), ale jest również duży i niechlujny.
źródło
#define malloc(x) my_malloc(x)
#define free(x) my_free(x)
a teraz debugujesz pamięć. Dzięki C ++ nigdy nie wiesz, co zostanie przydzielone, ponieważ istnieje wiele sposobów alokacji pamięci (nowe, malloc, konstruktory klas itp.)Pracowałem intensywnie z silnikiem do gier czysto C, który dostarczył kilka produktów, więc jest to absolutnie możliwe. Oto moje osobiste doświadczenie z pracą w obu silnikach C vs C ++:
Wszystkie te korzyści można również osiągnąć równie łatwo, stosując powściągliwy kod c ++, który powstrzymuje się od używania szablonów i dziedziczenia na obiektach serializowanych, ale decyzja CTO była łatwiejsza do egzekwowania prostoty, gdyby bardziej mylące elementy C ++ nie były dostępny.
Osobiście uważam, że było to nieco ekstremalne, ponieważ naprawdę brakowało mi możliwości zdrowego deklarowania zmiennych w pętlach for i wielu całkowicie uzasadnionych zastosowań dziedziczenia. Ale tak naprawdę nie kosztowało nas to dużo produktywności, biorąc pod uwagę wszystko
źródło
memcpy
cokolwiek, ponieważ system typów nie pozwala na kopiowanie liczników i kropek. Mogę pisać kod, wiedząc, że nie będę musiał cofać skutków ubocznych w prawie każdym wierszu kodu, ponieważ nie mogę niejawnie wyjść z funkcji, chyba że wyraźnie z niej wyjdę; nie ma żadnych wyjątków. Wszystko to sprawia, że pisanie struktur danych jest o wiele łatwiejsze - w C ++ pisanie zgodnych ze standardamivector
jest bardzo czasochłonne, szczególnie jeśli chcesz, aby ...Przepisuję silnik gry 2D napisany w C ++ i Lua do C i Lua. Jak dotąd doświadczenie było całkiem dobre. Oczywiście wykonywanie operacji wektorowych i macierzowych nie kończy się tak ładnie w C. Ale poza tym doświadczenie to było całkiem odświeżające po ponad 10 latach pracy jako programista C ++.
C ma wiele zalet w stosunku do C ++:
Oprócz tego istnieje wiele korzyści z wejścia w sposób myślenia w języku C. W C ++ często robię to, co robię, trochę uogólnione i abstrakcyjne. W CI zwykle wycinają metody takie jak get-set i często wstępnie przydzielają tablice o stałej wielkości zamiast używać tablic dynamicznych. Często kończę na krótszym i łatwiejszym do debugowania kodzie w C. Struktury danych są zwykle bardziej płaskie i łatwiejsze do przeglądania w debuggerze.
Szczerze mówiąc, nigdy nie stworzyłbym aplikacji wyłącznie w C. Powód, dla którego to działa, łączę ją z językiem wyższego poziomu, takim jak Lua, który może bardzo dobrze uzupełniać C, gdyby C nie był tak silny.
Oprogramowanie Id pisze, że większość ich silników w CI wierzy, możesz spojrzeć na Return to castle Wolfenstein, który został napisany w C.
Pisałem o niektórych moich doświadczeniach dotyczących skalowalności C w porównaniu z C ++ i wadach wektora STL w porównaniu do zwykłych tablic.
źródło
Jak ktoś zauważył, C ++ ma tę zaletę, że ma duże ramiona, na których możesz stać (BOOST, STL itp.). Ostatecznie jest to osobisty wybór, ale wybrałbym C ++ ze względu na dostępne zasoby. Jeśli w C ++ są funkcje, których nie chcesz używać, nie używaj ich.
źródło
Nie sądzę, żeby ktokolwiek używa obecnie wyłącznie języka C, zwykle jest on mieszany z językiem wyższego poziomu.
Programowanie w C ma pewne zalety w stosunku do, powiedzmy, programowania w C ++. C ++ potrafi robić wiele rzeczy niewidocznych dla użytkownika, co może zaszkodzić wydajności, jeśli nie będziesz ostrożny. C ++ może być również okropny, jeśli chodzi o użycie pamięci podręcznej, co ponownie może obniżyć wydajność.
Może więc przynieść pewne korzyści napisanie krytycznych pod względem wydajności części gry w sposób podobny do C, a nie w tradycyjny sposób C ++. Jednak nigdy nie słyszałem o nikim, kto pisałby całą grę w C.
Na niektórych platformach, takich jak iPhone, użycie C ++ może zwiększyć rozmiar pliku wykonywalnego o pewną porcję kilobajtów (zapomniałem, ile, przepraszam), dlatego niektórzy programiści iPhone'a wybierają pisanie kodu w kombinacji C i Objective -DO.
źródło
Podam jeszcze kilka powodów, dla których dzisiaj byłoby nierozsądnie pisać silnik gry w C zamiast w C ++: STL i BOOST.
Nie wyobrażam sobie, jak warto byłoby napisać kolejną
list
implementację, skoro można polegać na kodzie, który działa od razu (i że nie trzeba pisać!)źródło
Pisanie silnika gry w C jest rozsądne. Jest szybki i można go przenieść do wielu systemów. Na przykład możesz użyć dla Androida (z użyciem NDK). Możesz użyć go na iPhonie (Cel c jest tylko rozszerzeniem c). Możesz także użyć go w głównym systemie operacyjnym, takim jak Linux, Mac lub Windows. Jeśli czujesz się komfortowo z c, proponuję spróbować!
źródło
Oczywiście, że to rozsądne. Osobiście bym tego nie zrobił, a większość fanów C, których znam, po prostu pisze kod podobny do C w plikach .cpp. Ale języki są wystarczająco podobne do tego, gdzie tak naprawdę nie ma znaczenia.
Jeśli chodzi o to, dlaczego ktoś chciałby to zrobić, myślę, że jest to głównie spowodowane filozofią anty-C ++. Osobiście nadal nie uważam, że to dobry powód, aby wybrać C zamiast „C-style C ++”. typedef struct szaleństwo jest wystarczająco dobrym powodem, aby omijać C, a jest wiele innych.
Niestety zarówno C, jak i C ++ są dość okropnymi językami, kiedy do tego dochodzimy. To jeden z powodów, dla których ludzie próbowali w ciągu ostatnich lat dużo kodu napisać.
Jeśli szukasz przykładów ludzi pracujących w C, możesz zignorować id, ponieważ przypominam sobie, że już dawno porzucili C. Cryptic Studios (Star Trek Online) rozwija cały silnik w C. O ile mogę powiedzieć, tak, to bardziej z powodu filozofii niż z jakiejkolwiek konkretnej korzyści.
źródło
Tak i nie. Tak, zrobiłem to kilka lat temu, ale potrzebowałem, aby moja gra działała w 3D na 64-bitowym serwerze zdalnym unix (nie Linux) z graczami na głupich terminalach. To nie było trywialne. C może być fajne, jeśli chcesz zintegrować LUA, ale w końcu mam lua do pracy w C ++, więc powiedziałbym, że tak, jest to możliwe, ale nie rób tego.
źródło
Czy możliwą dobrą odpowiedzią może być „użyj obu”?
Słyszałem, że projekty panda3d można zoptymalizować, zabijając wąskie gardło, albo używając jakiegoś cytonu, albo albo przekodowując te części.
W większości przypadków części, które należy zoptymalizować, to część z wieloma iteracjami i zagnieżdżaniem lub z dużą ilością obliczeń numerycznych, więc (dzikie) przypuszczam, że jednym uczciwym kompromisem byłoby użycie obu języków przy użyciu C dla części, które zawierają dużo programowania niskopoziomowego, więc nie można niewłaściwie używać języka C ++ dla części, która wymaga prędkości, i C ++ do końca gry.
Idealnie robisz szybką część silnika, mając na uwadze wysoki poziom, a następnie używasz języka skryptowego lub C ++, który zużyje znacznie mniej nest / loopów.
Oczywiście nigdy nie można stworzyć takiego silnika, który pasowałby do wszystkich gier, które musieliby zrobić programiści, chyba że poświęcisz swój silnik specjalnemu rodzajowi gry ...
Ale nie bierz mojej rady za pewnik, ponieważ nie jestem doświadczonym twórcą gier ani doświadczonym programistą ... Myślę, że C zmusza cię do pisania szybkiego kodu, jednocześnie pisząc dobry i szybki kod C ++ dla projektu tak dużego jak gra to inna sprawa ...
źródło
C pracował dla Johna Carmacka , możesz uzyskać wiele korzyści, używając C, ale dopóki nie dotrzesz tam, aby z nich skorzystać, może to trochę potrwać.
Tutaj możesz znaleźć listę silników gier, niektóre z nich są napisane w C, być może możesz dowiedzieć się, jak zrobić silnik gry C, przeglądając ich kod źródłowy.
źródło
Kod C jest zwykle prawidłowym kodem C ++.
Główne problemy z C ++ używają go niepoprawnie ( Linus Torvalds nienawidzi go z tego powodu , miał również kilka innych problemów z przenośnością biblioteki, więc przy zakupie pracuje na poziomie systemów operacyjnych i musi być w stanie uruchamiać rzeczy na każdym losowym chip tam).
Na przykład prawie nie ma przewagi przy użyciu tablicy stylów [] nad c ++ std :: vector <> (lub podobnym pojemnikiem).
Wektory są bezpieczne dla typów i można je sprawdzić (można uzyskać dostęp do elementów za pomocą metody get () lub [], nawet jeśli nie używasz metody sprawdzania tablic, możesz nadal sprawdzać rozmiar, zamiast umieszczać go wskaźnikiem).
Ale wektory mogą być wolniejsze, jeśli na przykład nie zadeklarujesz domyślnego rozmiaru w konstruktorze. Również dodawanie elementów do wektora może powodować spowolnienia, jeśli będzie on wymagał zmiany rozmiaru. C ++ 11 ma także wiele zalet, takich jak jednolita inicjalizacja (możesz teraz deklarować i inicjować wektory za pomocą tej samej składni), a istnieją konstruktory ruchu, które pozwalają ci uniknąć kopiowania. Możesz nawet tworzyć własne niestandardowe inicjalizatory (jeśli z jakiegoś powodu chcesz zrobić coś innego niż użycie malloc).
Lub oczywiście, jeśli musisz zmienić rozmiar rzeczy, to wektory są jeszcze łatwiejsze do zrobienia, nie musisz bawić się w malloc, ręcznie kopiować rzeczy i tak dalej.
C ++ daje ci kod zorientowany obiektowo. Po skompilowaniu będzie równie wydajna, ponieważ jest to po prostu abstrakcja dla ludzi pracujących z kodem. Chociaż rzeczy takie jak konstruktory mogą spowolnić tworzenie obiektów. Ale albo będziesz potrzebował konstruktora, aby ustawić wartości domyślne, albo w inny sposób możesz zainicjować obiekty bez użycia konstruktora (pomijając ()).
Ale orientacja obiektowa znacznie ułatwia programowanie gier . Gry często dotyczą przedmiotów.
źródło