Jestem ciekawy, dlaczego C ++ jest tak popularny do tworzenia gier, a nie innych języków. Wiem, że możesz stworzyć z niego bardzo szybki kod, ale co dokładnie sprawia, że jest popularny?
Czy to tylko dlatego, że jest szybki? Czy jest to jakaś inna funkcja w języku, taka jak paradygmat OO lub przenośność? Czy to z powodu wszystkich bibliotek, które powstały z czasem? Czy jakaś kombinacja tych (i innych) powodów?
Gdyby ktoś mógł mi to powiedzieć, byłbym bardzo szczęśliwy. :-)
Odpowiedzi:
Liczne powody:
źródło
Jest kilka powodów, o których chciałbym wspomnieć oprócz tego, co poruszał @Graham.
źródło
low-level
językiem; alehigh-level
asembler, IMO.Szybkość pierwotna jest głównym powodem, ale tak naprawdę nie jest to decyzja ani, więc wiele firm produkujących gry zaczyna używać innych języków w niektórych częściach gry. Niektóre zadania wymagają, aby komputer działał tak szybko, jak to możliwe (np. Podstawowe funkcje renderowania), ale wiele zadań w kodzie gry nie musi działać tak szybko (np. Otwieranie drzwi, gdy gracz je kliknie), co oznacza, że jest mądry w użyciu dla tych części znacznie prostszego (a przez to szybszego do pisania programów) języka. Dlatego wiele silników gier jest napisanych w C ++, ale zawierają język skryptowy, taki jak Lua, do pisania kodu gry.
Trudną rzeczą do zrozumienia jest to, że przy wyborze języków programowania istnieje ogólny kompromis między wydajnością komputera i wydajnością programisty. To znaczy, co jest dla Ciebie ważniejsze, jak szybko komputer uruchamia kod lub jak szybko programista pisze kod?
źródło
W C ++ można przydzielić zmienne lokalne, które znikają po zakończeniu funkcji. Zazwyczaj są one przydzielane na stosie.
Zmienne stosu nie przyczyniają się do problemów związanych z dynamiczną alokacją pamięci związaną z fragmentacją i narzutem. Przydzielanie pokoju na stosie jest szybkie i łatwe (wystarczy dopasować wskaźnik). Dynamiczny przydział pamięci zwykle polega na przeszukaniu kontenera pod kątem odpowiedniego bloku pamięci, oznaczeniu pamięci, a następnie oznaczeniu jej jako zajętej. Dealokacja obejmuje dodanie bloku pamięci do kontenera i ewentualnie połączenie go z istniejącymi blokami. O wiele więcej narzutów niż tylko zmiana wskaźnika.
Java i C # przydzielają pamięć dynamicznie, z wyjątkiem typów pierwotnych. Języki te zależą od środowiska wykonawczego, które oznaczy zmienną do usunięcia, a następnie uruchom moduł wyrzucający elementy bezużyteczne w losowych (niezaplanowanych) odstępach czasu, aby odzyskać pamięć. Zasadniczo programista nie ma kontroli nad tym, kiedy zmienna zostanie oznaczona do usunięcia, ani kiedy zostanie odzyskana (odzyskiwanie zużytej pamięci jest zaawansowanym tematem, którego nie doświadcza większość programistów C ++ i Java).
Szybkość C ++ wynika przede wszystkim z jego bezpośredniego tłumaczenia na kod wykonywalny. Java i C # są kompilowane do kodu pośredniego, który jest następnie interpretowany przez maszynę wirtualną. Zasadniczo języki interpretacyjne działają wolniej niż języki tłumaczone bezpośrednio.
źródło
structs
. Więcej do punktu, niezwykle wyjątkowo niewielki wzrost prędkości to sieci nie jest prawie tyle, aby uzasadnić jednego języka nad drugim. Prawdziwy powód jest podany przez @Graham Perks: to jest to, co powinni wiedzieć twórcy gier, więc tego się uczą nowi twórcy gier i jakie są nowe pakiety SDK. Istnieje wiele języków (np. Go), które są tak szybkie lub szybsze, i nie prawie tak niewygodne dla pisania.Gry były kiedyś pisane w języku maszynowym, ponieważ miały egzotyczny sprzęt, dla którego nie było kompilatora. Sprzętowi brakowało również funkcji, które programiści C biorą za pewnik, takich jak wydajna matematyka na 16-bitowych liczbach całkowitych.
Gdy gry osiadły na znanym sprzęcie, kompilatory C stały się dostępne iw krótkim czasie wszystkie gry zostały napisane w C.
C ++ wydawało się kiedyś dobrym pomysłem, a większość gier jest dzisiaj C ++, ale inżynierowie mamroczą o powrocie do C, a to może się zdarzyć. Chciałbym pracować nad grą w C, podobnie jak wielu współpracowników. W C ++ nie ma żadnej nowej funkcji, która moim zdaniem poprawia gry.
Wydawałoby się teraz, że komputery są 1000 razy szybsze niż kilka lat temu, język wysokiego poziomu skróciłby czas programowania ($), czyniąc C przestarzałym.
Tak się nie stało, ponieważ kupujący gry wiedzą, że sprzęt jest 1000 razy lepszy, i chcą wymienić swoje pieniądze na grę, która wygląda i brzmi 1000 razy lepiej. Usuwa to z systemu luz, który zużywałby język wysokiego poziomu.
Wymagania dotyczące wydajności w grach są brutalne. Nowa ramka grafiki musi zostać zrenderowana w czasie poniżej 33ms (lub 16ms!). Należy uwzględnić wszystko, co robi sprzęt, aby ten budżet mógł zostać zrealizowany. Każdy język, który zadziała i robi coś ze sprzętem, którego programista nie rozumie lub nie spodziewa się, bardzo utrudni realizację tego budżetu. Jest to automatyczny minus w stosunku do czegokolwiek wysokiego poziomu.
Programiści gier nie tylko pracują w języku niskiego poziomu, ale także unikają struktur danych i algorytmów wysokiego poziomu. Gry zazwyczaj nie mają połączonych list i rzadko mają drzewa. W miarę możliwości występuje ruch w kierunku unikania wskaźników *. Każdy algorytm z czasem większym niż O (N) lub przestrzenią O (1) zwykle nie znajduje szerokiego zastosowania.
* Jeśli wskaźnik nie powoduje braku pamięci podręcznej, to po co wydawać 32 bity, aby go zapisać? Jeśli wskaźnik powoduje brak pamięci podręcznej, najlepiej się go pozbyć.
źródło
human
z pochodnymiplayer
ienemy
?Każdy język programowania ma swoje mocne i słabe strony w wielu różnych czynnikach. Przykładami tych czynników są:
Jednym z najważniejszych czynników, na których dba programista, jest wydajność. Chcą stworzyć interaktywne doświadczenie, co oznacza, że musi być reaktywny i być w stanie wygenerować jak najwięcej użytecznych (lub interesujących) danych, jak to możliwe. Chcesz wiedzieć, ile masz zdrowia w dowolnym momencie i nie chcesz na to czekać. A jeśli klikniesz przycisk, oczekujesz, że wystrzeli broń lub Twoja postać podskoczy, kiedy to powiesz. Niewielkie opóźnienie może zakłócać tę interaktywność, dlatego potrzebujesz wydajności.
Innym ważnym czynnikiem jest preferowanie programowania w języku problemu, a nie w języku implementacji. Programista gier chce zajmować się ludźmi, orkami i samochodami wyścigowymi, a nie rejestrem pamięci ED0. Nadal chcą opcji nurkowania w szczegółach implementacji, jeśli potrzebują wydajności, ale byłoby świetnie, gdyby w przeważającej części potrafili radzić sobie na poziomie bytów w swoim świecie gry. Mają dość zmartwień o symulowanie świata gry bez konieczności dbania o to, jak działa połączona lista.
C ++ bardzo dobrze pasuje do tych dwóch głównych czynników. Możesz zyskać na wydajności wynikającej z asemblera lub kodu C z wyrazistością obiektów. Aby zobaczyć, dlaczego jest to naturalne dopasowanie do gier, porównaj z innymi opcjami językowymi:
Ostatnią kwestią jest to, że niektóre z nich mają charakter historyczny i polityczny. Wiele wojen płomiennych toczyło się między różnymi językami programowania. Na przykład C # może być równie odpowiedni do tworzenia gier, ale pojawił się po C ++. Lub ludziom się to nie podoba. Niektóre osoby przeprowadziły się do C #, niektóre nie. Niektóre osoby nadal programują gry w języku BASIC, Pascal i C. Bez względu na to, z czego programiści czują się komfortowo, będą się trzymać. Programiści gier byli w większości zadowoleni z C ++, być może dlatego, że dorastali z C i C ++ i spełnił ich potrzeby. Jeśli przemysł komputerowy znajduje się w stanie, w którym wydajność i upodobanie Javy satysfakcjonuje wystarczającą liczbę osób, być może Java byłaby de facto standardowym językiem programowania gier.
źródło
Dziedzictwo i pęd.
Dawno, dawno temu został napisany kod w asemblerze dla najwyższej wydajności. Wraz ze wzrostem mocy obliczeniowej, języki kompilowane stały się bardziej opłacalne, a C oferował najlepszy kompromis między mocą a produktywnością, na bardzo podstawowym poziomie niewiele więcej niż makro asembler.
C ++ był naturalnym następcą C. Nie wyrzucasz wcześniejszego kodu ani wiedzy, ale masz potencjał, by rozwinąć się w nowe metodologie. C ++ jest ostatecznie bardzo elastyczny i jeszcze nie widziałem paradygmatu projektowania, którego nie można przynajmniej symulować w C ++, a jednocześnie być w stanie utrzymać prawie całkowitą kontrolę nad wydajnością.
źródło
Jeśli tworzysz konsole, nie masz wyboru: profesjonalne zestawy SDK są dostępne tylko w wersjach C ++. Zwykle mają również dostęp do C dla większości rzeczy.
Ponieważ wielu programistów to konsole + PC, sensowne jest, aby cała ich praca na PC odbywała się w tym samym języku i bezpośrednio współdzieliła technologię.
Ponieważ tam mieszka profesjonalna branża i większość z nich chce być tego częścią, większość programistów gier to programiści C ++.
Ponieważ wszystko to się dzieje, większość programistów silników jest również programistami C ++, więc podczas oceny silników klasy profesjonalnej prawie wszystkie wybory to C ++.
To wszystko duży samopodtrzymujący się silnik. Zakłócenie tego wymagałoby więcej niż tylko postępu technicznego.
źródło
FWIW: C # zyskuje na popularności w tworzeniu gier. Zobacz post na blogu Miguela de Icazy . Bardzo ciekawa lektura, IMHO.
źródło
Chociaż jestem dość mocno przeciwny C, C i C ++, jedyną rzeczą, jaką mają, że niewiele innych języków ma, jest pełna kontrola nad platformą, na której działa, możesz być pewien, co dokładnie będzie się działo przez cały czas, nie GC, żadnych błędów.
W dzisiejszych czasach nie jest to tak ważne, ale może być w przypadku słabych platform.
Na PC / Mac / Linux jest to prawdopodobnie najmniej przenośny język, z którym się obecnie spotkasz, a premia do prędkości nie jest już tak istotną różnicą - Minecraft (Java) jest płynny i działa na dość minimalnych platformach (i dowolnym systemie operacyjnym) z jednym plikiem wykonywalnym - jeszcze nie widziałem aplikacji C / C ++ indi o niskiej sile roboczej z taką samą funkcjonalnością i tak małą liczbą błędów, nie mówiąc już o pracy na trzech platformach.
W tym momencie powiedziałbym, że większość z nich to bezwładność i koncepcja, że prawdziwe gry są zawsze wykonywane w C / C ++, chociaż zdolność do „portowania” na iPhone'a i konsole jest znacząca (chociaż jestem całkiem pewny, że większość interfejsu użytkownika gier wymaga dużo wysiłku, aby przenieść je z wyjątkiem Windowsa i XBoxa.
źródło