Zamknięte . To pytanie jest
oparte na opiniach . Obecnie nie przyjmuje odpowiedzi.
Komentarze
Odpowiedź
Czy pisanie całego silnika gry w języku C byłoby dziś nierozsądne?
Jest rozsądne, ale Pytanie brzmi, co ci to daje? Prawdopodobnie nie potrzebujesz ekstremalnej przenośności, jaką oferuje C, i szkoda rezygnować ze wszystkich funkcji oferowanych przez C ++, chyba że naprawdę jesteś temu przeciwny.
Jakie są zalety C w porównaniu z C ++?
Lepszy czas kompilacji?
Dlaczego ktoś miałby pozować Sibly chcesz używać C zamiast C ++?
Myślę, że jest to głównie wybór estetyczny. Wiele osób lubi C, ponieważ jest proste i minimalne oraz sprawia wrażenie czystego. C ++ ma wiele fajnych funkcji (same przestrzenie nazw sprawiają, że warto go używać), ale jest też duży i nieuporządkowany.
Komentarze
Odpowiedź
Pracowałem intensywnie z silnikiem gier w czystym 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 i C ++:
- Używanie struktur w czystym C pozwala wykorzystać wiedzę o wyrównaniu struktur, a następnie możesz użyć tych informacji aby zbudować warstwy trwałości obiektów i serializacji. Silnik, z którym pracowałem, miał kilka prostych parserów nagłówków, które automatycznie tworzyłyby te metadane dotyczące struktur, i sprawiał, że niektóre typy operacji na danych były trywialne. Analizowanie dowolnych plików nagłówkowych C ++ jest w zasadzie niemożliwe, a tak szybko gdy dodajesz funkcje dziedziczenia i wirtualne, tracisz możliwość dokładnego określenia, gdzie znajdują się rzeczy w pamięci.
- Czas kompilacji jest znacznie krótszy, ponieważ możesz zachować bardzo zwarte pliki nagłówkowe i skorzystać z deklaracji struktur w przód.
- Debugowanie można ulepszyć, ponieważ bez użycia szablonów i dziedziczenia bardzo łatwo jest dowiedzieć się, czym dokładnie jest dany obiekt i co robi.
Wszystkie te korzyści można by również osiągnąć równie łatwo, używając ograniczonego kodu C ++, który powstrzymuje się od używania szablonów i dziedziczenia na obiektach zserializowanych, ale CTO zdecydował, że będzie łatwiej aby wymusić prostotę, gdyby bardziej zagmatwane elementy C ++ nie były dostępne.
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 legalnych zastosowań for dziedziczenie. Ale ostatecznie nie kosztowało nas to zbyt wiele produktywności, biorąc pod uwagę wszystko.
Komentarze
Odpowiedź
Przepisuję silnik gry 2D napisany w C ++ i Lua na C i Lua. Jak dotąd doświadczenie było całkiem dobre. Oczywiście wykonywanie operacji na wektorach i macierzach nie kończy się tak ładnie w C. Ale poza tym, po spędzeniu ponad 10 lat jako programista w C ++, odkryłem, że doświadczenie to jest całkiem odświeżające.
C ma wiele przewaga nad C ++:
- Kompilator upewni się, że żaden kod nie zostanie uruchomiony w statycznym czasie inicjalizacji. Dzięki temu statyczne przydzielanie danych globalnych, takich jak ciągi znaków używane jako klucze, jest całkowicie bezpieczne, np.
- Przejrzystość. W C przypisanie lub przydzielenie lub zdefiniowanie zmiennej nie spowoduje uruchomienia dużej ilości kodu. C ++ automatycznie wygeneruje konstruktory kopiujące, dzięki czemu masz mniejszą kontrolę nad tym, co jest wykonywane podczas przypisywania.
- Dużo debugowania może być łatwiejsze ze względu na brak zniekształconych nazw funkcji
- Jest to zwykle w porządku jest użycie memcpy w C, ale łatwo spowoduje problemy w C ++, ponieważ konstruktory kopiujące nie będą uruchamiane. Biorąc pod uwagę tha t memcpy jest dużo szybsze niż std :: copy to ma znaczenie.
Poza tym jest wiele zalet wejścia w myślenie C. W C ++ często robię rzeczy nieco przesadzone i abstrakcyjne. W C zwykle usuwam takie rzeczy, jak metody get-set i często wstępnie przydzielam tablice o ustalonych rozmiarach, zamiast używać tablic dynamicznych. Często kończę z krótszym i łatwiejszym do debugowania kodem w C. Struktury danych są zwykle bardziej płaskie i łatwiejsze do wyświetlenia w debugerze.
Szczerze mówiąc, nigdy nie stworzyłbym aplikacji wyłącznie w C. Powód działa tak, że łączę go z językiem wyższego poziomu, takim jak Lua, który może bardzo dobrze uzupełniać C, gdyby C nie był tak mocny.
Oprogramowanie Id pisze większość swoich silników w CI Wierzę, że możesz spojrzeć na Wróć do zamku Wolfenstein , który został napisany w języku C.
O niektórych swoich doświadczeniach pisałem na skalowalność C w porównaniu z C ++ i wady wektora STL w porównaniu do zwykłych tablic.
Komentarze
Odpowiedź
Jak ktoś inny zauważył, C ++ ma przewagę w postaci dużych ramion, na których można stanąć (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.
Komentarze
Odpowiedź
Nie ” Myślę, że w dzisiejszych czasach ktoś używa wyłącznie C, zwykle jest on mieszany z językiem wyższego poziomu.
Programowanie w C ma pewne zalety w porównaniu, powiedzmy, z programowaniem w C ++. C ++ potrafi robić wiele rzeczy pod maską, które są niewidoczne dla użytkownika, co może mieć negatywny wpływ na wydajność, jeśli nie jesteś ostrożny. C ++ może być również okropny, jeśli chodzi o użycie pamięci podręcznej, co znowu może negatywnie wpłynąć na wydajność.
Pisanie elementów gry o krytycznym znaczeniu dla wydajności może przynieść pewne korzyści w stylu C, a nie w tradycyjnym C ++. Jednak w ostatnich latach nigdy nie słyszałem o nikim, kto napisałby całą grę w C.
Na niektórych platformach, takich jak iPhone, użycie C ++ może zwiększyć rozmiar pliku wykonywalnego o pewną część kilobajtów (zapomniałem, jak dużo, przepraszam), co jest powodem, dla którego niektórzy programiści iPhonea decydują się na pisanie swojego kodu w mieszance C i Objective-C.
Odpowiedź
Podam jeszcze kilka powodów, dla których nierozsądne byłoby pisanie dzisiaj silnika gry w C zamiast w C ++: STL i BOOST.
Nie mogę sobie wyobrazić, jak by to było warto napisać jeszcze jedną list
impleme ntation, kiedy możesz polegać na kodzie, który działa po wyjęciu z pudełka (i którego nie musisz pisać!)
Komentarze
Odpowiedź
Pisanie silnika gry w języku C jest rozsądne. Jest szybki i można go przenosić na wiele systemów. Na przykład można użyć dla Androida (przy użyciu NDK). Można go użyć dla iPhonea (cel c jest po prostu rozszerzeniem c). Możesz również użyć to dla i dla głównego systemu operacyjnego, takiego jak Linux, Mac lub Windows. Jeśli czujesz się komfortowo z c, proponuję spróbować!
Odpowiedz
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 miejsc, w których nie ma to większego znaczenia.
Jeśli chodzi o to, dlaczego ktoś zdecydowałby się to zrobić, myślę, że jest to głównie z powodu filozofii anty-C ++. Osobiście nadal nie uważam, że jest to dobry powód, aby wybrać C zamiast „C ++ w stylu C”. typedef struct szaleństwo jest wystarczającym powodem, aby unikać C, a jest jeszcze wiele innych.
Niestety, C i C ++ są dość okropnymi językami, kiedy się do tego zabieramy. To jest jeden z powodów, dla których ludzie w ostatnich latach próbowali tworzyć wiele kodu w formie skryptów.
Jeśli szukasz przykładów osób pracujących w C, możesz zignorować id, ponieważ przypominam sobie, że czytałem, że porzucili C dawno temu. Cryptic Studios (Star Trek Online) tworzy jednak cały swój silnik w C. O ile wiem, tak, to bardziej z powodu filozofii niż z namacalnych korzyści.
Odpowiedź
Tak i nie. Tak, zrobiłem to kilka lat temu, ale potrzebowałem mojej gry działającej w 3D na zdalnym serwerze unixowym (nie linuxowym) 64-bitowym z graczami na głupich terminalach. To nie było trywialne. C może być fajne. chcesz zintegrować LUA, ale w końcu udało mi się uruchomić Lua w C ++, więc powiedziałbym, że tak, jest to możliwe, ale nie rób tego.
Odpowiedź
Czy możliwą dobrą odpowiedzią może być” użyj obu „?
Ponieważ słyszałem, że projekty panda3d można zoptymalizować, zabijając wąskie gardło albo używając cythona, albo ponownie kodując te części.
W większości przypadków części, które wymagają optymalizacji, to części z wieloma iteracjami i zagnieżdżeniami lub z dużą ilością obliczeń numerycznych, więc (dzikie) przypuszczam, że jednym sprawiedliwym kompromisem byłoby użycie obu języków , używając C do części, które zawierają dużo programowania niskopoziomowego, więc nie możesz zrobić pliku y niewłaściwe użycie języka C ++ w części wymagającej szybkości, a C ++ w pozostałej części gry.
Najlepiej byłoby wykonać szybką część silnika, mając na uwadze wysoki poziom, a następnie użyć język skryptowy lub C ++, który będzie używał znacznie mniej zagnieżdżenia / pętli.
Oczywiście nigdy nie mógłbyś stworzyć takiego silnika, który pasowałby do wszystkich gier, które musieliby zrobić programiści, chyba że poświęcisz swój silnik na specjalne rodzaj gry …
Ale nie bierz mojej rady za pewnik, ponieważ nie jestem ani doświadczonym twórcą gier, ani doświadczonym programistą … Myślę, że C zmusza cię do pisania szybkiego kodu podczas pisania dobry i szybki kod w C ++ dla projektu tak dużego jak gra to co innego …
Odpowiedź
C pracował dla John Carmack , możesz uzyskać wiele korzyści, używając C, ale zanim osiągniesz z nich korzyści, może to zająć trochę czasu.
Tutaj możesz znaleźć listę silników gier kilka o Jeśli są napisane w C, być może uda Ci się uzyskać informacje na temat tworzenia silnika gry w języku C, przeglądając ich kod źródłowy.
Odpowiedź
Kod w C jest normalnie prawidłowym kodem w C ++.
Główne problemy z C ++ polegają na nieprawidłowym używaniu go ( Linus Torvalds nienawidzi go z tego powodu , miał też inne problemy z przenośnością biblioteki i tak dalej, że pracuje na poziomie systemów operacyjnych i musi być w stanie uruchamiać rzeczy na każdym losowym chipie).
Na przykład nie ma prawie żadnej korzyści z używania tablicy cstyle [] w porównaniu z c ++ std :: vector <> (lub podobnym kontenerem).
Wektory są bezpieczne i mogą być sprawdzane w granicach (możesz uzyskać dostęp do elementów za pomocą metody get () lub [], nawet jeśli nie używasz metody sprawdzania tablicy, nadal możesz zapytać o rozmiar zamiast przesuwać go za pomocą wskaźnika).
Ale wektory mogą być wolniejsze, jeśli na przykład nie zadeklarujesz domyślnego rozmiaru w konstruktor. Dodanie rzeczy do wektora może również spowodować spowolnienie, jeśli wymaga on zmiany rozmiaru. C ++ 11 również dodaje wiele zalet, takich jak jednolita inicjalizacja (można teraz deklarować i inicjować wektory przy użyciu tej samej składni) oraz istnieją konstruktory przenoszenia, które pozwalają uniknąć kopiowania. Możesz nawet tworzyć własne, niestandardowe inicjatory (jeśli z jakiegoś powodu chcesz zrobić coś innego niż użycie malloc).
Lub oczywiście, jeśli musisz zmienić rozmiar rzeczy, wektory nadal są łatwiejsze do zrobienia z , nie musisz bawić się malloc, ręcznie kopiować rzeczy itd.
C ++ daje ci kod zorientowany obiektowo. Po kompilacji będzie tak samo efektywny, ponieważ tak naprawdę jest po prostu abstrakcja dla ludzi pracujących z kodem. Chociaż takie rzeczy jak konstruktory mogą spowolnić tworzenie obiektów. Ale albo będziesz potrzebować konstruktora do ustawienia wartości domyślnych, albo w innym przypadku możesz zainicjować obiekty bez użycia konstruktora (opuszczając () „s ).
Jednak orientacja obiektowa sprawia, że programowanie gier jest dużo łatwiejsze. Gry często zajmują się przedmiotami.