Przede wszystkim chciałbym mieć prawdziwą odpowiedź, zawsze staram się uzyskać więcej z różnych źródeł i artykułów, a kiedy czytam rzeczy takie jak C ++ jest powolny, ponieważ ma funkcje wirtualne i z tego powodu C jest lepsze , naprawdę nie wiem, co powiedzieć i myśleć jak człowiek z mózgiem. Dlatego unikaj osiągania tego poziomu w swoich odpowiedziach.
Moje pytanie dotyczy ogromnego przejścia na C ++, które zostało ukończone mniej więcej w Doom 3.
Interesujące jest dla mnie to, że przed tym kamieniem milowym większość silników gier i same gry były napisane w C, tak jak to było od czasów Quake'a . Warto również zauważyć, że oprogramowanie ID decyduje się całkowicie przepisać bazę kodu dla IdTech 4 w C ++, ogromną ilość pracy, której szczerze mówiąc, nie rozumiem bez naprawdę dobrej listy powodów.
Skupiam się na Doom 3, ponieważ interesuję się przede wszystkim światem OpenGL. W swojej podróży staram się skupić na tym temacie, więc dużo o tym czytam, ale myślę, że takie pytanie może być renderowane API -agnostyka bez większych problemów.
Dlaczego w pewnym momencie branża masowo przeszła na C ++? Jakie są przyczyny wyboru dokonanego przez siebie dokumentu tożsamości?
Ostatnią rzeczą, którą chciałbym powiedzieć, jest to, że język C jest o wiele prostszy do wdrożenia i zapewnia mniejszą liczbę funkcji, ponieważ ma to znacznie mniejsze szanse na „fragmentację” na części, w przeciwieństwie do tego, co naprawdę często robi C ++. Mówiąc najprościej, mam znacznie większe szanse na znalezienie naprawdę dobrego kompilatora C niż dobrego kompilatora C ++ ze wszystkimi funkcjami zaimplementowanymi w dobry sposób.
Na przykład NDK dla Androida wciąż nie ma dobrej obsługi C ++ (z wydaniem r8b) ze wszystkimi najnowszymi i najlepszymi funkcjami, a jest to natywny zestaw narzędzi dla najpopularniejszego mobilnego systemu operacyjnego na świecie!
Gdybym napisał mój kod w nowoczesnym C ++, prawdopodobnie bolełbym teraz, ponieważ jeden z najpopularniejszych systemów operacyjnych na świecie byłby dla mnie niedostępny. I podobnie jak Android, wiele innych kompilatorów nie jest tak świetnych.
Powinienem napisać kod C ++ odnoszący się do wersji C ++, która ma starą wersję 2-3?
Odpowiedzi:
C ++ robi wszystko, co robi C. Możesz w prosty sposób mieszać C i C ++ w przypadkach, w których zalety C przewyższają zalety C ++. Jest to bardzo celowa decyzja projektowa C ++.
C ++ robi rzeczy, których nie robi C. Obejmuje to łatwy polimorfizm, ale także łatwe generowanie kodu czasowego za pomocą szablonów. Jest to bardzo przydatne w przypadku takich pojemników, które są największą słabością C. Pozwala także na zdefiniowanie przez użytkownika typów podobnych do wskaźników (inteligentne uchwyty), które oszczędzają dużo czasu, a także zdefiniowanych przez użytkownika typów podobnych do prymitywów, takich jak wektory i macierze ze wsparciem operatora (również oszczędza dużo czasu).
Funkcje wirtualne są wolniejsze niż funkcje inne niż wirtualne. Musisz jednak wybrać funkcje wirtualne, a kompetentny programista robi to tylko wtedy, gdy są one korzystne. Programiści C mają wskaźniki funkcji i często przechowują kolekcje w strukturze, do której odwołują się inne struktury; innymi słowy, wykonują dodatkową pracę, aby odtworzyć dokładnie to samo, co tabele funkcji wirtualnych. W przypadkach, gdy potrzebny jest tylko jeden wskaźnik funkcji i nie jest wymagana tabela, C ++ nadal w pełni na to pozwala i jest równoważny C. W nowoczesnym kompilatorze C ++ jest tylko wolniejszy niż C w określonych przypadkach, w których programista wybiera opcję . Ponadto narzut funkcji wirtualnych w praktyce jest bardzo mały na procesorach modemowych. Dzisiejszy sprzęt jest zaprojektowany pod kątem wzorców użytkowania C ++, a nawet w coraz większym stopniu dostosowany do potrzeb interpretowanych języków wysokiego poziomu.
Wyjątki w C ++ historycznie narzucają dużo narzutów, co spowalnia C ++, nawet jeśli ich nie używasz. Wyjątki były okropną rzeczą do dodania do C ++, jeśli z innego powodu niż ogromny wzrost złożoności związany z pisaniem kodu bezpiecznego dla wyjątków, a w rzeczywistości niektóre projekty kontenerów są dosłownie niemożliwe, aby uczynić wyjątek bezpiecznym. Programiści gier często ignorują istnienie wyjątków, a nawet wyłączają je w kompilatorze. Nowoczesne kompilatory mają zerowe wyjątki od kosztów ogólnych (tzn. Płacisz za nie tylko wtedy, gdy faktycznie z nich korzystasz).
C jest łatwiejszy do nauczenia się wszystkich reguł. C ++ to bardzo duży, złożony język. C ++ pozwala pisać kod wyższego poziomu, tworząc łatwiejsze i prostsze interfejsy API. Niektórzy chcą łatwiej zrozumieć język, inni chcą łatwiej pisać zaawansowany kod. Jest to kompromis między prostotą zrozumienia, co robi kompilator z konkretnym fragmentem kodu, a prostotą pisania dużych, złożonych, wzajemnie połączonych aplikacji. Niektórzy ludzie cenią jednego znacznie bardziej niż drugiego z różnych powodów.
Ostatecznie C ++ jest nadzbiorem C. Moim zdaniem nie ma takiego, jak wysoce kompetentny programista C ++, który nie jest również znośnym programistą C (chociaż jest wielu programistów C ++, którzy spadają poniżej mojego paska, którzy by zgubić się w czystym C). Podczas gdy C ++ dodaje funkcje izolujące programistę od większości C, nietradycyjny kod C ++ często wymaga użycia C do wykonania zadań. Jest to jedna z głównych różnic między C ++ a Javą i C #. W końcu często widuje się „C / C ++” w jednym kawałku.
Moje osobiste przekonanie - które podzielam z większością innych profesjonalistów branży gier, z którymi współpracowałem - jest takie, że zwiększona ekspresja i możliwości programowania na wysokim poziomie w C ++ przewyższają zwiększoną złożoność języka w stosunku do C, i większość innych częstych Stwierdzenia anty-C ++ są po prostu nieaktualne w dzisiejszej technologii.
źródło
Id Software nie jest „branżą”. To jedna firma. Chociaż mogą mieć wpływ, nie są wszyscy.
Pracowałem nad kilkoma silnikami gier z 1999 roku, które używały C ++.
Głównymi przyczynami przyjęcia C ++ „w tym czasie” są:
To było znormalizowane . C ++ 98 nazywa się tak, ponieważ został wydany jako standard ISO w 1998 roku. Do tego czasu istniało wiele dialektów C ++ bez wyraźnego pojęcia, które było „prawdziwe” lub „poprawne”. Po standaryzacji i rozpoczęciu implementacji kompilatorów twórcy gier mogli polegać na faktycznym standardzie.
Przypomnij sobie stary żart: facet wchodzi do gabinetu lekarskiego i mówi: „Boli mnie, gdy tak podnoszę rękę”. Lekarz mówi: „Więc nie podnoś tak ręki”.
Jeśli funkcje wirtualne są wolne dla twoich potrzeb, C ++ nie zmusza cię do korzystania z nich. Wszystko w C ++ jest opcjonalne. Państwo wybrać do korzystania z każdego szczególną cechę. Jeśli masz kod krytyczny dla wydajności i nie chcesz wirtualnego obciążenia, nie używasz funkcji wirtualnych. Podobnie jak w przypadku kodu krytycznego dla wydajności w C, nie używasz wskaźników funkcji.
Rzeczywiście, doprowadziło to do tego, że wiele gier w C ++ nie było idiomatycznym C ++ (przynajmniej nie współczesnym idiomatycznym C ++), a jedynie „C z klasami”. Jest to doskonale funkcjonalny sposób programowania C ++. Do diabła, po prostu brak możliwości pisania
typedef struct
po utworzeniu nowego typu jest zaletą.C ++ to duża torba funkcji i możesz wybrać, które z nich chcesz.
Twoim celem jest? Google ledwo toleruje osoby korzystające z NDK; jasne jest, że chcą, aby wszyscy używali Javy. Jedynym powodem, dla którego istnieje NDK, jest to, że istnieją niektórzy ważni programiści, którzy po prostu nie będą korzystać z platformy bez niego. Dlatego NDK istnieje, aby je obsłużyć i zaspokoić ich potrzeby w zakresie funkcji.
Tak, C ++ to większa, bardziej skomplikowana specyfikacja do wdrożenia. Podobnie jak Java. Podobnie jak każdy język oprócz C.
Co masz na myśli mówiąc „wszystkie najnowsze i najlepsze funkcje”? Jeśli mówisz o C ++ 11, cóż, nikt jeszcze tego nie implementuje. Specyfikacja ma teraz zaledwie rok. Nie wiem też, czy NDK obsługuje C11; tak, C ma również „najnowsze i najlepsze funkcje”, które nie są obsługiwane wszędzie.
Co nasuwa ważną kwestię: jeśli chcesz, aby twoja aplikacja czysto C kompilowała się w Visual Studio, musi ona być zgodna z C89 i niczym więcej. Fragmentacja za pomocą C już istnieje. Niektóre platformy obsługują tylko C89. Niektóre obsługują C99. Niektóre obsługują C11 w różnym stopniu. Itp.
Jeśli chcesz użyć C, a następnie użyć C . Fakt, że inni ludzie nie dokonali takiego wyboru, nie oznacza, że twój wybór jest zły lub że ich wybór jest zły. Nie musicie się im usprawiedliwiać, a oni nie muszą się wam usprawiedliwiać.
źródło
Często przepisują prawie cały silnik dla każdego wydania (przynajmniej do niedawna - niewiele wiem o kilku ostatnich grach), a ponieważ popularność C ++ zyskuje na popularności, warto go używać zamiast trzymać z C. Z czasem coraz mniej osób będzie kompetentnych w C.
Ponieważ zapewnia wiele funkcji wyższego poziomu, a jednocześnie jest prawie całkowicie wstecznie kompatybilny z kodem C.
Google odpowiedziałby na to za Ciebie: http://fabiensanglard.net/doom3/interviews.php
„... połowa programistów naprawdę na początku miała doświadczenie w C ++. Miałem C i Objective-C, a ja w pewnym sensie„ wślizgnąłem się do C ++ ”, patrząc tylko na kod, który piszą faceci C ++. Z perspektywy czasu szkoda, że nie poświęciłem czasu na dokładne zbadanie i poznanie języka, zanim zacznę go używać.
Nadal możesz być w stanie stwierdzić, że kod mechanizmu renderującego został w dużej mierze opracowany w języku C, a następnie zmieniony w C ++.
Dzisiaj głęboko wierzę, że C ++ jest właściwym językiem dla dużych projektów z wieloma programistami o krytycznych wymaganiach dotyczących wydajności, a Tech 5 jest znacznie lepszy dla Doom 3 ”.
Dlaczego ci na tym zależy? Nie daj się uwięzić w pogoni za najnowszą rzeczą. Gdyby był wystarczająco dobry 5 lat temu, nie pogorszyłby się teraz nagle.
źródło
C ++ jest dostępny od lat 80., więc jeśli kompilator go nie obsługuje, być może powinieneś użyć innego kompilatora. A także C ++ nie jest tak naprawdę wolniejszy niż C. Jest tak naprawdę tylko wolniejszy, jeśli załadujesz go wirtualnymi funkcjami i innymi abstrakcjami. Jednak C ++ jest dziś często używany w świecie nie unixowym ze względu na jego elastyczność i nowsze funkcje, których C nie ma. Pisanie kodu modułowego w C ++ jest o wiele łatwiejsze niż w C i pomaga pisać bardziej przenośny kod. Wracając do tematu kompilatorów, nie znam żadnego kompilatora, który nie obsługuje C ++ (być może nie w pełni C ++ 11, ale każdy na wpół przyzwoity kompilator powinien obsługiwać C ++).
źródło