Dlaczego C / C ++ jest preferowany dla twórców gier?


14

Niektórzy twierdzą, że oferuje większą kontrolę programistom, ale czym dokładnie można sterować za pomocą C ++, którego nie można kontrolować za pomocą na przykład Java?

Odpowiedzi:


21

Java działa na maszynie wirtualnej, podczas gdy C ++ działa bezpośrednio na sprzęcie. Oznacza to, że masz większą kontrolę nad tym, gdzie idzie twoja pamięć i co się z nią dzieje w C ++.

Java to język śmieci. Nie masz bezpośredniej kontroli nad pamięcią. Możesz przydzielić nowe fragmenty pamięci, ale nie masz (dokładnej) kontroli nad tym, kiedy zostanie ona usunięta. Moduł wyrzucania elementów bezużytecznych sprawdza każdy element pamięci przydzielony co x ramkom i określa, czy jest on używany, czy nadal używany.

W przypadku gier może to być katastrofalne. Co kilka ramek pojawia się jakiś śmieciarz, który sprawdza każdy przydzielony przydział, aby sprawdzić, czy nadal jest używany? Mów o spowolnieniu!

Po drugie, większość używanych bibliotek została napisana w C lub w C ++. Mówię o Scaleform, silniku fizyki Havoka, PhysX, SpeedTree itp. Wszystkie profesjonalne pakiety, szeroko stosowane w branży. Jeśli inny język chce zostać królem, lepiej go wspieraj.

Moim osobistym poglądem jest to, że Java jest naprawdę dobra dla aplikacji i aplikacji komputerowych, ale nie dla gier. Java ma wiele fajnych narzędzi dla programistów i teoretycznie można ją uruchomić na dowolnej platformie, która ma implementację wirtualnej maszyny Java, ale nadal wolę C ++, ponieważ potrzebuję takiej kontroli nad moją pamięcią. Zwłaszcza, gdy zaczynasz pracę z egzotycznymi strukturami danych (czerwono-czarne drzewo, podwójnie połączona lista itp.), Pomaga zachować dobry przegląd wszystkich przydzielonych pamięci.

Nie mówię: nie używaj Javy. Mówię: pomyśl o tym, dlaczego używasz Java. Minecraft został zbudowany w Javie, więc z pewnością można budować gry w Javie. Ale czy byłaby to lepsza gra, gdyby została zbudowana w C ++? Cóż, z pewnością nie byłoby tak tanie, aby uruchomić go na wielkiej trójce (Windows, MacOS, Linux), ale mimo to napotkał wiele błędów specyficznych dla platformy w rozwoju, błędów, których Java nie mogła wygładzić nad.

Istnieje mnóstwo frameworków C ++ dla początkujących programistów. Naprawdę nie ma wymówki, aby się jej nie uczyć, zwłaszcza jeśli chcesz kontynuować karierę w branży.


1
Tylko drobiazg, ale w większości środowisk operacyjnych natywny kod działa na maszynie wirtualnej. Java działa na maszynie wirtualnej wewnątrz maszyny wirtualnej.
Skyler Saleh,

1
@RTS: Nazywanie op -> tłumaczenia mikro-op maszyną wirtualną jest trochę trudne, jeśli o to ci chodzi.

Nie, mówiłem o maszynie wirtualnej, w którą wszystkie aplikacje wprowadzane są przez nowoczesne systemy operacyjne, aby umożliwić bezpieczną wielozadaniowość. Dzieje się tak w systemie operacyjnym działającym na architekturze bez mikrooperacji (RISC). Obejmuje to pamięć wirtualną, przerwy w oprogramowaniu, systemy do równoczesnego dostępu do sprzętu, harmonogram systemu operacyjnego i obsługę pliku rejestru.
Skyler Saleh

@RTS Nie jestem pewien, czy izolacja zadania naprawdę kwalifikuje się jako maszyna wirtualna. Jest to RM (Real Machine) z wbudowaną ochroną. Nie ma oczywistej warstwy abstrakcji instrukcji między pobieraniem / wykonywaniem. Kompilatory i konsolidatory generują wymagany kod relokowalny. Procesor zapewnia wsparcie sprzętowe dla większości tego - co eliminuje aspekt „wirtualny”.
3Dave

2

Krótka odpowiedź: C ++ kompiluje się do kodu natywnego, więc wydajność zależy od programisty, a nie od środowiska uruchomieniowego czy maszyny wirtualnej.

Długa odpowiedź:

C ++ będąc „szybszym” nie ma nic wspólnego z C ++. W tej chwili jest to jeden z niewielu dostępnych języków obsługiwanych przez narzędzia do tworzenia samodzielnego, natywnego kodu dla wielu platform.

Wcześniej można było używać C, C ++, BASIC / 2, Delphi itp. I uzyskać wydajne, wolnostojące pliki wykonywalne. Wybór języka był kwestią osobistych preferencji i sił rynkowych.

W dzisiejszych czasach założenie, że „C ++ jest szybszy” jest w gruncie rzeczy samospełniającą się przepowiednią, chociaż LLVM jest w dobrej sytuacji, aby to zmienić, ponieważ robi wszystko, co trafia do parsera, tak jak kiedyś.

Borland miał rację: przeanalizowano wiele języków, zastosowano najpierw optymalizacje, a następnie przekazano do wspólnego kompilatora i konsolidatora zaplecza. Co jest faktycznie jednym z głównych osiągnięć LLVM.

Java jest zbudowana w taki sposób, że wdrożenie JVM byłoby bardzo trudne. Co dziwne, C #, często i niepoprawnie, z założenia w przybliżeniu równoważny Javie, już kompiluje się z natywnym kodem na kilku platformach, w tym iOS.

Początek mojej świątecznej listy? Wehikuł czasu, aby cofnąć się i dodać właściwości, obsługę wyjątków i rzeczywisty polimorfizm WORKING do C ++, i pozbyć się bzdur składni strzałek w górę, które parser może sam zrozumieć. Napisałem preprocesor przez te 10 lat temu, bo to cholernie głupie.


Masz na myśli pośredni dostęp do członka (jak w h-> x)? Usunięcie tego spowodowałoby, że typy uchwytów i inteligentnych wskaźników byłyby mniej przydatne. Jeśli argumentujesz, że chcesz go zmienić tylko dla surowych wskaźników, po prostu sprawiłeś, że język jest mniej spójny.
Lars Viklund,

1
Co nie działa na polimorfizm C ++?
Casey,

@LarsViklund tak, o to mi chodzi. Ale podczas gdy adres, dereferencja i operatory składowe (&, *, ::, -> ...) mają różne znaczenia, w większości przypadków można wywnioskować drsjted z kontekstu. Można by z góry uprościć, tak jak dzieje się to w innych językach. Drobny problem, ale taki, który może zwiększyć złożoność kodu (a tym samym czas i koszty dewelopera).
3Dave
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.