Je rozumné psát herní engine v C? [uzavřeno]

Zavřeno . Tato otázka je míněna . Momentálně nepřijímá odpovědi.

Komentáře

  • Konzolové hry používají c ++ FYI!
  • Vlastně si myslím, že C by bylo snadnější psát hry až do určité míry, řekněme desítky tisíc LOC nebo tak, hlavně proto, že vám umožňuje soustředit se jen na bity a bajty bez složitých datových typů a ve srovnání s C ++ se staví super rychle. Ale po určitém měřítku (řekněme dosažení stovek tisíc LOC) začínám chtít ' sáhnout po C ++, kde ' d začít ve skutečnosti chtít složité datové typy, větší bezpečnost typů, možná výjimky, šablony a ještě větší měřítko (řekněme miliony), aby se věci jiné než C ++ kombinovaly s kódem C a C ++.
  • C má také tu přidanou výhodu, že je široce přenosný i pro ABI, takže je docela snadné vzít si svůj stávající C kód a poté jej začít používat v jiných jazycích, řekněme od FFI. C ++ je o něco nepříjemnější s manglováním názvu, neschopností bezpečně házet přes hranice modulů, vtable opakování není stejné u překladačů, standardní implementace knihoven lišící se mezi prodejci atd. Obecně považuji knihovny C, které píšu, vydrží déle bez nutnosti změn a jít z módy, i když s tím trvá déle napsat cokoli z rozsahu.

Odpovědět

Bylo by však dnes psaní celého herního enginu v jazyce C nepřiměřené?

Je to rozumné, ale otázkou je, co vám to koupí? Pravděpodobně nepotřebujete extrémní přenositelnost, kterou C nabízí, a je škoda vzdát se všech funkcí, které C ++ nabízí, pokud se proti tomu opravdu nevyjádříte.

Jaké jsou případné výhody, které má C oproti C ++?

Lepší čas na kompilaci?

Proč by někdo poz pravděpodobně chcete použít C nad C ++?

Myslím, že je to většinou estetická volba. Mnoho lidí má rádi C, protože je to jednoduché a minimální a cítíte se čistí. C ++ má spoustu pěkných funkcí (samotné jmenné prostory stojí za to jej použít), ale je také velké a špinavé.

Komentáře

  • Až do Id Tech 4
  • @Josh: Snadnější ladění !? C-programy se notoricky obtížně ladí, hlavně kvůli ukazatelům a správě paměti. Programy v C ++ (při použití skutečných programovacích idiomů v C ++, které mají tendenci se vyhýbat ukazatelům a správě paměti, kdykoli je to možné) je o několik řádů snazší ladit.
  • C lze pochopit pouhými smrtelníky. Zdá se, že C ++ má spoustu funkcí a okrajové případy, o kterých se zkušení programátoři dozvědí i po deseti letech každodenního používání.
  • C ++ je velký jazyk, ale ' šíří hlavně lidé, kteří si ' jen přečetli hororové příběhy a ' si nenašli čas, aby se to naučili . Je toho hodně, co se musíte naučit, ale za to dostanete velkou hodnotu. C ++ vám umožní vyjádřit spoustu věcí, které C jednoduše dokáže ' t.
  • @ BlueRaja-DannyPflughoeft #define malloc(x) my_malloc(x) #define free(x) my_free(x) a vy nyní ladíte paměť. S C ++ nikdy nevíte, co bude kdy přiděleno, protože existuje tolik způsobů přidělení paměti (new, malloc, konstruktory tříd atd.)

Odpověď

Intenzivně jsem pracoval s herním enginem pure-C, který dodával několik produktů, takže je to naprosto možné. Tady jsou moje osobní zkušenosti s prací v obou motorech C a C ++:

  1. Použití struktur čistého C vám umožňuje využít znalosti o zarovnání struktur a tyto informace pak můžete použít k vytvoření vrstev perzistence a serializace objektů. Motor, se kterým jsem pracoval, měl několik jednoduchých analyzátorů záhlaví, které automaticky vytvářely tato metadata o strukturách, a některé typy datových operací byly triviální. Analýza libovolných souborů záhlaví C ++ je v podstatě nemožná a co nejdříve jak přidáváte dědičnost a virtuální funkce, ztrácíte schopnost přesně vědět, kde jsou věci v paměti
  2. Čas kompilace je podstatně kratší, protože můžete zachovat velmi kompaktní hlavičkové soubory a využít předávání deklarací struktur.
  3. Ladění lze vylepšit, protože bez použití šablon a dědičnosti je velmi snadné zjistit, co přesně určitý objekt je a co dělá.

Všechny tyto výhody lze dosáhnout stejně snadno pomocí omezeného kódu c ++, který upustí od používání šablon a dědičnosti na serializovaných objektech, ale ČTÚ se rozhodlo, že to bude jednodušší prosadit jednoduchost, pokud nebyly k dispozici matoucí prvky C ++.

Osobně si myslím, že to bylo trochu extrémní, protože mi opravdu chyběla schopnost rozumně deklarovat proměnné pro smyčky a mnoho zcela legitimních použití pro dědičnost. Ale nakonec nás to opravdu nestálo mnoho produktivity.

Komentáře

  • Tam ' Ve skutečnosti vám nic nebrání v implementaci dědičnosti v C. A pokud použijete C99, můžete deklarovat proměnné pro smyčky.
  • Nesouhlasím s bodem 3. ' je stejně snadné psát chaotický a těžko laditelný kód v jazyce C i v C ++. Lepší ladění není ' něco, co je vlastní jazyku C.
  • I čistému kódu může být v C ++ těžší porozumět – s přetížením, šablonami, virtuálními funkcemi a výjimky, ' je mnohem těžší na první pohled přesně vidět, jaký bude skutečný tok řízení.
  • @Dan: Jednoduše tím, že máme více věcí, je C ++ těžší ladění. Samozřejmě se můžete omezit v používání kterékoli z těchto věcí, v takovém případě bude ladění stejně snadné jako C – protože se stane C.
  • Méně věcí je vlastně důvod, proč se mi líbí C. Například, v CI může jen kopírovat bity a bajty pomocí memcpy pro cokoli, protože typový systém ' neumožňuje věci jako copy ctors a dtors . Mohu psát kód s vědomím, že ' nebudu muset vrátit vedlejší účinky na téměř jakýkoli daný řádek kódu, protože ' t implicitně ukončit funkci, pokud se z ní výslovně nevrátím; neexistují žádné výjimky. Díky tomu je psaní datových struktur mnohem jednodušší – v C ++ je psaní standardu vector velmi časově náročné, zvláště pokud to chcete udělat …

Odpověď

Přepisuji 2D herní engine napsaný v C ++ a Lua na C a Lua. Zkušenosti byly zatím celkem dobré. Je zřejmé, že provádění vektorových a maticových operací nekončí jako hezké v C. Ale kromě toho jsem zjistil, že zkušenost je docela osvěžující poté, co jsem strávil více než 10 let jako vývojář v C ++.

C má řadu výhody oproti C ++:

  1. Kompilátor zajistí, že v době statické inicializace nebude spuštěn žádný kód. Díky tomu je zcela bezpečné staticky přidělit globální data jako řetězce použité jako klíče, např.
  2. Transparentnost. Přiřazení C nebo přidělení nebo definování proměnné nezpůsobí spuštění spousty kódu. C ++ pro vás automaticky vygeneruje konstruktory kopií, takže při přiřazování budete mít menší kontrolu nad tím, co se provede.
  3. Mnoho ladění může být snazší kvůli tomu, že se nezmění názvy funkcí
  4. obvykle je v pořádku používat memcpy v jazyce C, ale v C ++ to snadno způsobí potíže, protože kopírovací konstruktory nebudou spuštěny. tha t memcpy je mnohem rychlejší než std :: copy na čem záleží.

Kromě toho má způsob uvažování v C řadu výhod. V C ++ se často setkávám s tím, že dělám věci trochu generalizované a abstraktní. V C obvykle vynechávám věci jako metody get-set a často předem přiděluji pole pevné velikosti, místo abych používal dynamická pole. Často skončím s kratším a snadněji laděným kódem v C. Datové struktury jsou obvykle plošší a snáze se zobrazují v debuggeru.

Abych byl spravedlivý, nikdy bych nevytvořil aplikaci výhradně v C. Důvod funguje to tak, že to kombinuji s jazykem vyšší úrovně, jako je Lua, který dokáže velmi dobře doplnit C, pokud C není tak silný.

Id software píše většinu svých motorů v CI věřte, můžete se podívat na Návrat na hrad Wolfenstein napsaný v jazyce C.

O svých zkušenostech jsem psal na škálovatelnost C vs C ++ a nevýhody vektoru STL ve srovnání s obyčejnými poli.

Komentáře

  • FYI, v každém případě, který jsem ' zkontroloval (což je, myslím, darwin gcc a vc2008), bude std :: copy stačí zkompilovat volání memcpy, pokud jsou oba typy POD.
  • Také RE: STL vektor vs. prostá pole, proč nepoužívat pěkné části vecto ra použít normální C ukazatele místo iterátorů, pokud se vám ' nelíbí? Stačí udělat & myvector [N].' Je to to nejlepší z obou světů, za předpokladu, že váš kód C přiděluje paměť stejným způsobem. Nebo se podívejte na smyčky, podívejte se na BOOST_FOREACH. Je ještě jednodušší než C.
  • Děkujeme za tip o std :: copy memcpy. Nevěděl jsem to '. Když s tím Alexandrescu před několika lety zacházel, nebylo to tak. O iterátorech C ++. Jde hlavně o filozofii, snažím se naprogramovat, jak měl být C ++ programován jak pro lidi, se kterými pracuji, tak pro využití funkcí C ++. Hlavním cílem bylo poukázat na to, že některá vylepšení v C ++, jako jsou kontejnery STL, nejsou vždy lepší než ve starém způsobu C.

Odpověď

Jak zdůraznil někdo jiný, C ++ přináší výhodu velkých ramen, na kterých můžete stát (BOOST, STL atd.). Nakonec je to osobní volba, ale kvůli dostupným zdrojům bych si vybral C ++. Pokud v C ++ existují funkce, které nechcete používat, pak je nepoužívejte.

Komentáře

  • Všimněte si, že 99% komerční a interní herní enginy se odklánějí od Boostu a STL z různých důvodů (záruka výkonu, laditelnost, bezpečnost vláken, ovládání).
  • A 99% statistik je tvořeno.
  • Mám pocit, že by mělo být trochu pravidlem citovat všechny statistiky.

Odpovědět

Já ne “ Nemyslím si, že by někdo dnes používal výhradně C, obvykle se kombinuje s jazykem vyšší úrovně.

Programování v C má oproti programování v C ++ některé výhody. C ++ umí dělat pod kapotou spoustu věcí, které jsou pro uživatele neviditelné, což může poškodit výkon, pokud si nedáte pozor. C ++ může může být také hrozné, pokud jde o využití mezipaměti, což opět může poškodit váš výkon.

Takže může přinést určité výhody, když budete psát části kritické pro výkon hry způsobem podobným C, spíše než tradičním způsobem C ++. Já nikdy jsem v posledních letech o nikom neslyšel, ale vlastně napsal celou hru v jazyce C.

Na některých platformách, jako je iPhone, může použití C ++ zvýšit vaši spustitelnou velikost s určitým kusem kilobajtů (zapomněl jsem, jak moc, omlouvám se), což je důvod, proč se někteří vývojáři iPhone rozhodli napsat svůj kód do kombinace C a Objective-C.

Odpověď

Uvedu vám několik dalších důvodů, proč by dnes bylo nerozumné psát herní engine v C namísto C ++: STL a BOOST.

Nedokážu si představit, jak by to bylo stojí za to napsat ještě další list impleme Pokud se můžete spolehnout na kód, který funguje po vybalení z krabice (a který nemusíte psát!)

Komentáře

  • Má nějaký velké studio skutečně používá podporu? Dokonce i používání STL je stále předmětem debaty kvůli přenositelnosti. Alespoň pro motory konzoly.
  • Osobně používám ' Boost.FunctionTypes pro interakci c ++ / lua (viz gamedev.net/reference/programming/features/CPPLuaExport/ … ) a knihovna náhodných čísel Boost pro jednotné generování náhodných čísel (pro částicové systémy). Boost.Foreach je také čistý. BTW, koho by zajímalo, jestli velká studia nepoužívají BOOST? Mají pracovní sílu k tomu, aby psali své vlastní knihovny STL od nuly, ne ' t.
  • Ano, ale také si uvědomuji, že ' podobné knihovny i pro C.
  • Myslím, že spousta lidí používá ve hrách podporu. Ale ' to zdaleka není požadavkem (nebo dokonce žádoucím) pro mnohé z nás.
  • Lidé, čemu věříte je irelevantní : buď víte , nebo ' nevíte .

Odpověď

Zápis herního enginu do jazyka C je rozumný. Je to rychlé a lze jej přenést na více systémů. Můžete například použít pro Android (s využitím NDK). Můžete jej použít pro iPhone (Cíl c je pouze příponou c). Můžete také použít a pro hlavní operační systémy, jako jsou Linux, Mac nebo Windows. Pokud vám vyhovuje c, doporučuji vám to zkusit!

Odpovědět

Samozřejmě je to rozumné. Já osobně bych to neudělal a většina fanoušků C, které znám, ve skutečnosti právě píše kód typu C do souborů .cpp. Ale jazyky jsou dost podobné těm, na kterých to opravdu nezáleží.

Pokud jde o to, proč by se někdo rozhodl to udělat, myslím, že je to většinou na anti-C ++ filozofii. Osobně si stále nemyslím, že je to dobrý důvod, proč si vybrat C před „C-stylem C ++“. typedef struct bláznovství je dost dobrý důvod, proč se vyhnout C, a existuje celá řada dalších.

Bohužel C a C ++ jsou oba docela strašné jazyky, když se k tomu dostaneme. To je jeden z důvodů, proč se lidé v posledních letech pokoušejí udělat hodně kódu pomocí skriptu.

Pokud hledáte příklady lidí pracujících v C, můžete ignorovat id, protože si pamatuji, že jsem C dávno opustil. Cryptic Studios (Star Trek Online) však dělá veškerý svůj vývoj motorů v C. Pokud vím, ano, je to více kvůli filozofii než kvůli jakékoli hmatatelné výhodě.

Odpověď

Ano a ne. Ano, udělal jsem to před několika lety, ale potřeboval jsem, aby moje hra běžela ve 3D na unixovém (ne linuxovém) 64bitovém vzdáleném serveru s hráči na hloupých terminálech. Nebylo to triviální. C může být hezké je chcete integrovat LUA, ale nakonec jsem dostal lua k práci v C ++, takže bych řekl, že je to možné, ale nedělejte to.

Odpovědět

Může být dobrou odpovědí„ use both “?

Jak jsem slyšel, že projekty panda3d by mohly být optimalizovány, zabíjet úzké místo buď pomocí nějakého cythonu, nebo buď překódováním těchto částí.

Většinu času je třeba optimalizovat části, které mají spoustu iterací a vnoření nebo spoustu numerických výpočtů, takže můj (divoký) odhad je, že jedním spravedlivým kompromisem by bylo použití obou jazyků , použití C pro části, které obsahují mnoho programování na nízké úrovni, takže nemůžete “ y zneužití jazyka C ++ pro část, která potřebuje rychlost, a C ++ pro zbytek hry.

V ideálním případě uděláte rychlou část motoru s ohledem na vysokou úroveň a pak použijete skriptovací jazyk nebo C ++, který bude používat mnohem méně nest / smyček.

Samozřejmě byste nikdy nemohli vytvořit takový engine, který by vyhovoval všem hrám, které by vývojáři museli dělat, kromě případů, kdy věnujete svůj engine speciálnímu druh hry …

Ale moji radu neberu jako samozřejmost, protože nejsem zkušený vývojář her ani zkušený vývojář … Myslím, že C vás při psaní nutí psát rychlý kód dobrý a rychlý C ++ kód pro projekt velký jako hra je jiná věc …

Odpověď

C pracoval pro John Carmack , můžete pomocí C získat spoustu výhod, ale dokud se tam nedostanete, abyste z nich těžili, může vám to chvíli trvat.

Zde naleznete seznam herních enginů některé Pokud jsou napsány v jazyce C, možná získáte informace o tom, jak udělat herní engine C, prostudováním jejich zdrojového kódu.

Odpověď

C kód je normálně platný kód C ++.

Hlavní problémy s C ++ jsou jeho nesprávné používání ( Linus Torvalds ho z tohoto důvodu nenávidí , měl také nějaké další problémy s přenositelností knihovny, a tak dále pracuje na úrovni operačních systémů a musí umět spouštět věci na každém náhodném čipu).

Například použití pole cstyle [] nad c ++ std :: vector <> (nebo podobným kontejnerem) nemá téměř žádnou výhodu.

Vektory jsou bezpečné a mohou být hraničně kontrolovány (k prvkům můžete přistupovat buď pomocí get () nebo [], i když nepoužíváte metodu checked array, stále můžete dotazovat na velikost, místo aby jste ji ukazovali pomocí ukazatele).

Ale vektory mohou být pomalejší, pokud například nedeklarujete výchozí velikost v souboru konstruktor. Také přidání věcí do vektoru může způsobit zpomalení, pokud potřebuje změnu velikosti. C ++ 11 přidává také mnoho výhod, jako je jednotná inicializace (nyní můžete deklarovat a inicializovat vektory pomocí stejné syntaxe) a existují konstruktory přesunu, které vám umožní vyhnout se kopírování. Můžete si dokonce vytvořit vlastní vlastní inicializátory (pokud jste chtěli z nějakého důvodu udělat něco jiného než použít malloc).

Nebo samozřejmě, pokud potřebujete změnit velikost věcí, pak vektory jsou stále snazší dělat s , nemusíte si dělat problémy s malloc, ručně kopírovat věci atd.

C ++ vám poskytne objektově orientovaný kód. Při kompilaci bude stejně efektivní, protože je to opravdu jen abstrakce pro lidi pracující s kódem. I když věci jako konstruktory mohou zpomalit vytváření objektů. Ale buď budete potřebovat, aby konstruktor nastavil výchozí hodnoty, nebo jinak můžete inicializovat objekty bez použití konstruktoru (vynecháním () ).

Ale objektová orientace mnohem usnadňuje programování her. Hry se často zabývají objekty.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *