Ésszerű játékmotort C-be írni? [zárt]

Zárt . Ez a kérdés véleményalapú . Jelenleg nem fogadja el a válaszokat.

Megjegyzések

  • A konzolos játékok c ++ FYI-t használnak!
  • Valójában úgy gondolom, hogy a C-nek könnyebb lenne játékokat írni egy bizonyos méretarányig, mondjuk vagy több tízezer LOC, főleg azért, mert lehetővé teszi, hogy csak a bitekre és a bájtokra összpontosítson komplex adattípusok nélkül, és szuper gyorsan épít a C ++ -hoz képest. De egy bizonyos skála után (mondjuk eléri a LOC százezreit) ' el akarok érni a C ++ felé, ahol I ' d kezdjen el valóban komplex adattípusokra, nagyobb típusú biztonságra, esetleg kivételekre, sablonokra vágyni, és még nagyobb méretben (mondjuk milliókban) haladni, hogy a C ++ kivételével más dolgok kombinálódjanak a C és a C ++ kóddal.
  • C az a további előnye is, hogy széles körben hordozható még az ABI számára is, így elég egyszerűvé válik a meglévő C-kód felvétele, majd más nyelveken való használata, mondjuk egy FFI-től. A C ++ egy kicsit kínosabb a névelhárítással, a modulhatárok biztonságos átdobásának képtelenségével, a fordítható ismétlések nem ugyanazokkal a fordítókon, a standard könyvtári megvalósítások a gyártók között különböznek stb. Általában azt tapasztalom, hogy az általam írt C könyvtárak hosszabb ideig tartanak anélkül, hogy változtatásokra lenne szükségük, és kiment a divatból, bár hosszabb időbe telik bármi méretarányos megírása vele.

Válasz

Ugyanakkor ésszerűtlen lenne ma egy teljes játékmotort C-ben írni?

Ésszerű, de kérdés, hogy mit vásárol meg neked? Valószínűleg nincs szüksége a C szélsőséges hordozhatóságra, és szégyen lemondani a C ++ összes szolgáltatásáról, hacsak nem állsz filozófiailag ellene.

Milyen előnyei vannak C-nek, ha vannak, a C ++ -val szemben?

Jobb fordítási idő?

Miért posztolna valaki szolidan szeretné használni a C-t a C ++ felett?

Szerintem ez leginkább esztétikai választás. Sok ember kedveli a C-t, mert egyszerű és minimális, és tisztának érzi magát. A C ++ sok szép funkcióval rendelkezik (önmagában a névterek miatt érdemes használni), de nagy és rendetlen is.

Hozzászólások

  • Az Id Tech 4-ig
  • @Josh: Könnyebb a hibakeresés !? A C-programokat köztudottan nehéz hibakeresni, főleg a mutatók és a memóriakezelés miatt. A C ++ programok (ha valódi C ++ programozási idiómákat használnak, amelyek hajlamosak elkerülni a mutatókat és a memóriakezelést, amikor csak lehetséges) több nagyságrenddel könnyebb hibakeresni.
  • C érthető puszta halandók által. Úgy tűnik, hogy a C ++ sok funkcióval és éles esettel rendelkezik, a tapasztalt programozók még évtizedek után is megismerhetik a mindennapi élethez való felhasználást.
  • A C ++ nagy nyelv, de ' félelmetes hírnevét leginkább olyan emberek terjesztik, akik ' csak rémtörténeteket olvastak, és ' nem szántak időt arra, hogy megtanulják . Rengeteget kell tanulni, de ennek fejében sok értéket kap. A C ++ segítségével sok olyan dolgot fejezhet ki, amelyet C egyszerűen tud ' t.
  • @ BlueRaja-DannyPflughoeft #define malloc(x) my_malloc(x) #define free(x) my_free(x) és most hibakereső a memória. A C ++ használatával soha nem lehet tudni, hogy mikor kerül kiosztásra, mert nagyon sokféle módon lehet memóriát lefoglalni (új, malloc, osztályalkotók stb.)

Válasz

Széles körben dolgoztam egy tiszta C játékmotorral, amely több terméket szállított, így ez teljesen lehetséges. Ez a személyes tapasztalatom a C és C ++ motorok mindkét munkájában:

  1. A tiszta-C struktúrák használatával kihasználhatja a struktúrák összehangolásával kapcsolatos ismereteket, majd felhasználhatja ezeket az információkat. az objektum-perzisztencia és a sorosítási rétegek létrehozása. A motorral, amellyel dolgoztam, volt néhány egyszerű fejléc-elemző, amely automatikusan létrehozta ezeket a metaadatokat a struktúrákról, és ez bizonyos típusú adatműveleteket elenyészővé tett. Az önkényes C ++ fejlécfájlok elemzése lényegében lehetetlen, és amint az öröklődés és a virtuális függvények hozzáadásakor elveszíti annak a lehetőségét, hogy pontosan megtudja, hol vannak a memóriában a dolgok
  2. A fordítási idő lényegesen rövidebb, mert a fejlécfájlokat nagyon kompaktan tudja tartani, és kihasználhatja a struktúrák előre történő deklarálását. / li>
  3. A hibakeresés javítható, mert a sablonok és az öröklés nélkül nagyon könnyen meg lehet állapítani, hogy mi is egy adott objektum és mit csinál.

Mindezek az előnyök ugyanolyan egyszerűen elérhetők olyan visszafogott c ++ kód használatával, amely tartózkodik a sablonok és az öröklés használatától a sorosított objektumokon, de a CTO döntése szerint könnyebb lesz az egyszerűség érvényesítésére, ha a C ++ zavarosabb elemei nem állnak rendelkezésre.

Személy szerint szerintem ez kissé szélsőséges volt, mivel nagyon hiányoltam a változók ésszerű deklarálásának képességét a hurkokhoz és a sok teljesen jogos felhasználást örökösödés. De valójában ez nem sok termelékenységbe került a végén, ha figyelembe vesszük az összes dolgot.

Megjegyzések

  • Ott ' s semmi sem akadályozza meg az öröklődés megvalósítását a C-ben. Ha pedig a C99-et használja, deklarálhatja a változókat a ciklusokra.
  • Nem értek egyet a 3. ponttal. Ez ' s ugyanolyan könnyen lehet rendetlen, nehezen hibakereshető kódot írni C-ben, mint C ++ -ban. A jobb hibakeresés nem ' t a C nyelvben rejlő dolog.
  • Még a tiszta kódot is nehezebb megérteni a C ++ nyelven – túlterheléssel, sablonokkal, virtuális függvényekkel és kivételekkel ' sokkal nehezebb egy pillanat alatt meglátni, hogy pontosan mi lesz a tényleges szabályozási folyamat.
  • @Dan: Egyszerűen több dolog birtoklásával a C ++ nehezebb hibakeresés. Természetesen korlátozhatja az ilyen dolgok bármelyikének használatát, ebben az esetben ugyanolyan egyszerű lesz a hibakeresés, mint a C-nél – mert C-vé válik.
  • A kevesebb dolog valójában az oka annak, hogy szeretem C. a CI-ben csak biteket és byte-okat másolhat egy memcpy elemre bármi miatt, mert a típusú rendszer nem engedi meg ' az olyan dolgokat, mint a másoló orvosok és a doktorok . Írni tudok kódot, tudván, hogy nem kellett ' visszaállítanom a mellékhatásokat szinte minden adott kódsorban, mivel ' nem tudok implicit módon kilép egy funkcióból, hacsak kifejezetten nem térek ki belőle; nincsenek kivételek. Mindez sokkal könnyebbé teszi az adatstruktúrák írását – a C ++ – ban a szabványnak megfelelő vector megírása nagyon időigényes, különösen, ha meg akarja csinálni …

Válasz

C ++ és Lua nyelven írt 2D játékmotort írok át C és Lua nyelvre. Eddig a tapasztalatok elég jók voltak. Nyilvánvaló, hogy a vektor- és mátrixműveletek végzése C-ben nem tűnik olyan szépnek. Ettől eltekintve azonban a tapasztalat meglehetősen üdítőnek bizonyult, miután 10+ évet töltöttem C ++ fejlesztőként.

A C-nek számos előnyök a C ++ -val szemben:

  1. A fordító gondoskodik arról, hogy statikus inicializálási időben ne fusson kód. Ez teljesen biztonságossá teszi a globális adatok, például kulcsként használt karakterláncok statikus kiosztását, pl.
  2. Átlátszóság. A C hozzárendelésnél, vagy egy változó kiosztása vagy definiálása nem okoz rengeteg kód futtatását. A C ++ automatikusan másolattervezőket generál az Ön számára, így kevésbé tudja ellenőrizni, hogy mi kerül végrehajtásra a hozzárendelés során. li> Sok hibakeresés könnyebb lehet, mert nem kapják meg a függvényneveket.
  3. általában rendben van a memcpy használata C-ben, de könnyen gondot okozhat a C ++ rendszerben, mert a másolatkészítők nem futnak. tha t memcpy sokkal gyorsabb, mint a std :: copy ez számít.

Ettől eltekintve számos előnye van a C gondolkodásmód elsajátításának. A C ++ – ban gyakran azon kapom magam, hogy kissé túl általánosított és elvont dolgokat csinálok. A C-ben általában olyan dolgokat vágok ki, mint a get-set módszerek, és gyakran előre rögzítek fix méretű tömböket, nem pedig dinamikus tömböket használok. Gyakran rövidebb és könnyebben hibakereshető kódot kapok C-ben. Az adatstruktúrák általában laposabbak és könnyebben megtekinthetők a hibakeresőben.

Igazság szerint soha nem készítenék egy alkalmazást kizárólag C-ben. működik, hogy kombinálom egy olyan magasabb szintű nyelvvel, mint a Lua, amely nagyon jól ki tudja egészíteni a C-t, ha a C nem olyan erős.

Az Id szoftver a motorjaik nagy részét a CI-ben írja, hisz, megnézheti Visszatérés a Wolfenstein kastélyhoz , amelyet C-ben írtak.

Néhány tapasztalatomról írtam a C méretezhetősége vs C ++ és az STL vektor hátrányai a sima tömbökhöz képest.

Megjegyzések

  • FYI, minden esetben, amelyet ' ellenőriztem (ami szerintem a darwin gcc és a vc2008), az std :: copy lesz csak fordítsd a memcpy hívására, ha mindkét típus POD.
  • Emellett RE: STL vektor vs sima tömbök, miért ne használhatnád a vecto szép részeit r és használjon normál C mutatókat iterátorok helyett, ha nem tetszik nekik '? Csak megteheti a & myvector [N] műveletet.' mindkét világ legjobbjainak tetszik, ha feltételezzük, hogy a C-kód ugyanúgy rendezi a memóriát. Vagy a ciklusokért nézze meg a BOOST_FOREACH oldalt. Még egyszerűbbé teszi, mint a C.
  • Köszönöm az std :: copy memcpy-vel kapcsolatos tippet. Nem tudtam ezt '. Amikor Alexandrescu néhány évvel ezelőtt ezt kezelte, nem ez volt a helyzet. A C ++ iterátorokról. Elsősorban a filozófiáról szól, megpróbálom programozni, hogy a C ++ programot miként jelentette mind az emberek kedvéért, akikkel dolgozom, mind pedig a C ++ funkcióinak kihasználása érdekében. Elsősorban arra hívták fel a figyelmet, hogy egyes C ++ fejlesztések, például az STL tárolók, nem mindig jobbak, mint a régi C módon.

Válasz

Ahogy valaki más rámutatott, a C ++ előnye a nagy vállak, amelyeken állhatsz (BOOST, STL stb.). Végül személyes választás, de a rendelkezésre álló erőforrások miatt a C ++ -t választanám. Ha vannak olyan funkciók a C ++ – ban, amelyeket nem szeretne használni, akkor ne használja őket.

Megjegyzések

  • Ne feledje, hogy a kereskedelmi és házon belüli játékmotorok különböző okokból (teljesítménygarancia, hibakereshetőség, szálbiztonság, vezérlés) elrugaszkodnak a Boosttól és az STL-től.
  • És a statisztikák 99% -át kitöltik.
  • Úgy érzem, valamilyen szabálynak kell lennie az összes statisztika megemlítése.

Válasz

Nem ” Szerintem manapság senki nem használja kizárólag a C-t, általában egy magasabb szintű nyelvvel keveredik.

A C-ben történő programozásnak van némi előnye, például mondjuk a C ++ – ban történő programozáshoz képest. A C ++ sok olyan dolgot megtehet a motorháztető alatt, amely láthatatlan a felhasználó számára, ami károsíthatja a teljesítményt, ha nem vigyázol. A C ++ tud szörnyű is lenni, amikor gyorsítótár-használat, ami ismét károsíthatja a teljesítményt.

Tehát bizonyos előnyökkel járhat, ha a játék teljesítménykritikus részeit C-szerűen írjuk, nem pedig hagyományos C ++ -ra. soha nem hallottam senkiről, hogy az utóbbi években valóban egy egész játékot C-ben írt volna.

Bizonyos platformokon, például az iPhone-on, a C ++ használata bizonyos kilobájt darabokkal növelheti a futtatható fájl méretét (elfelejtettem, hogyan sok, sajnálom), ez az oka annak, hogy néhány iPhone-fejlesztő úgy dönt, hogy a kódját a C és az Objective-C keverékébe írja.

Válasz

Mondok még néhány okot arra, hogy miért lenne ésszerű ma C ++ helyett C-be írni egy játékmotort: STL és BOOST.

Nem tudom elképzelni, hogy lenne ez érdemes megírni még egy list impleme-t Ilyen esetben támaszkodhat a dobozon kívül működő kódra (amelyet nem kell írni!)

Megjegyzések

  • nagy stúdió valóban használja a lendületet? A hordozhatóság miatt még az STL használata is vita tárgyát képezi. Legalábbis konzolmotorok esetében.
  • Személy szerint én ' m használom a Boost.FunctionTypes c ++ / lua interakciót (lásd: gamedev.net/reference/programming/features/CPPLuaExport/ … ) és a Boost véletlenszám-könyvtár az egységes véletlenszám-generáláshoz (részecskerendszerekhez). A Boost.Foreach is ügyes. BTW, kit érdekel, ha a nagy stúdiók nem használják a BOOST-ot? Megvan a munkaerő, hogy a semmiből megírhassák saját STL könyvtárukat, én nem ' t.
  • Igen, de rájönnek arra is, hogy ' hasonló könyvtárak a C-hez is.
  • Azt hiszem, sokan használják a lendületet a játékokban. De ' sokak számára messze nem követelmény (sőt kívánatos).
  • Emberek, amit hiszel lényegtelen : vagy tudja , vagy nem tudja ' nem tudni .

Válasz

Játékmotor C-be írása ésszerű. Gyors és több rendszerre is portolható. Például használhatja Androidra (az NDK használatával). Használhatja iPhone-ra (a c célkitűzés csak a c kiterjesztése). a fő operációs rendszerhez, például a Linuxhoz, a Mac-hez vagy a Windows-hoz. Ha jól érzi magát a c-vel, javaslom, próbálja ki!

Válasz

Természetesen ésszerű. Én személy szerint nem csinálnám, és az általam ismert C rajongók többsége valójában csak C-szerű kódot ír .cpp fájlokba. De a nyelvek elég hasonlóak ahhoz, ahol ez nem számít.

Amiért valaki ezt választaná, azt hiszem, ez leginkább az anti-C ++ filozófiától függ. Személy szerint én még mindig nem gondolom, hogy ez jó ok arra, hogy a C-t válasszuk a “C-stílusú C ++” helyett. A typedef struct őrültség elég jó ok arra, hogy elkerülje a C-t, és számos más is van.

Sajnos a C és a C ++ is elég szörnyű nyelv, amikor rátérünk. Ez az egyik oka annak, hogy az emberek az utóbbi években sokat próbáltak végrehajtani a kódjukban.

Ha példákat keres a C-ben dolgozó emberekre, figyelmen kívül hagyhatja az azonosítót, amikor arra emlékszem, hogy olvastam, hogy C-t már rég elhagyták. A Cryptic Studios (Star Trek Online) azonban teljes motorfejlesztését C-ben végzi. Amennyire meg tudom mondani, igen, ez inkább a filozófia miatt van, mint bármilyen kézzelfogható előny miatt.

Válasz

Igen és nem. Igen, néhány évvel ezelőtt megtettem, de szükségem volt a játékomra, hogy 3D-ben fussak egy unix (nem linux) 64 bites távoli szerveren, a hallgatók néma terminálokon. Nem triviális volt. C jó lehet integrálni akarod az LUA-t, de végül rávettem a lua-t, hogy dolgozzam a C ++ nyelven, ezért azt mondanám, hogy igen, ez lehetséges, de ne tedd.

Válasz

Lehet, hogy egy lehetséges jó válasz a” mindkettő használata “?

Mivel hallottam, hogy a panda3d projektek optimalizálhatók, megsemmisítve a szűk keresztmetszeteket valamilyen cython használatával, vagy átkódolva ezeket a részeket.

Legtöbbször az optimalizálandó részek a sok iterációval és fészkeléssel rendelkező részek, vagy sok numerikus számítással, tehát (vad) tippem szerint az egyik igazságos kompromisszum mindkét nyelv használata , a C-t olyan alkatrészekhez használja, amelyek sok alacsony szintű programozást tartalmaznak, így nem lehet ” y a C ++ nyelv helytelen használata a sebességet igénylő résznél, a C ++ pedig a játék többi részében.

Ideális esetben a motor gyors részét a magas szintet szem előtt tartva végezze el, majd használjon egy szkript nyelv vagy C ++, amely sokkal kevesebb fészket / ciklust fog használni.

Természetesen soha nem lehet olyan motort készíteni, amely megfelel minden játékfejlesztőnek, kivéve, ha a motorját egy speciális egyfajta játék …

De ne vegye a tanácsomat magától értetődőnek, mivel nem vagyok tapasztalt játékfejlesztő és nem is tapasztalt fejlesztő … Azt hiszem, a C arra kényszerít, hogy gyors kódot írjon írás közben a jó és gyors C ++ kód egy akkora projekthez, mint egy játék, más dolog …

Válasz

A C dolgozott John Carmack , sok előnyhöz juthat a C használatával, de amíg eljutsz oda, hogy részesülj belőlük, addig eltarthat egy ideig.

Itt megtalálhatja a játékmotorok listáját néhány o Ha ezek C-ben vannak írva, talán betekintést nyerhet a C-játék motorjának elkészítésébe, ha áttekinti a forráskódjukat.

Válasz

A C kód általában érvényes C ++ kód.

A C ++ fő problémái a helytelen használata ( Linus Torvalds emiatt utálja , más problémái is voltak a könyvtárak hordozhatóságával kapcsolatban, és így tovább, az operációs rendszerek szintjén dolgozik, és képesnek kell lennie arra, hogy minden véletlenszerű chipen futtassa a dolgokat).

Például szinte nincs előnye a cstyle tömb [] használatának a c ++ std :: vector <> (vagy hasonló tárolóval) szemben.

A vektorok typeafe és korlátozottan ellenőrizhető (az elemekhez a get () vagy a [] használatával férhet hozzá, még akkor is, ha nem használja az ellenőrzött tömb metódust, akkor is lekérdezheti a méretet, ahelyett, hogy a mutatóval körbefogná).

De a vektorok lassabbak lehetnek, ha például nem deklarálja az alapértelmezett méretet a konstruktőr. A dolgok hozzáadása egy vektorhoz lassulást okozhat, ha átméretezésre van szüksége. A C ++ 11 számos előnnyel jár, mint például az egységes inicializálás (most már deklarálhatjuk és inicializálhatjuk a vektorokat ugyanazzal a szintaxissal), és vannak olyan mozgáskonstruktorok, amelyek lehetővé teszik a másolás elkerülését. Akár saját inicializátorokat is készíthet (ha valamilyen oknál fogva valami mást szeretett volna elvégezni, mint a malloc használatát).

Vagy természetesen, ha át kell méreteznie a dolgokat, akkor a vektorokkal még mindig könnyebb ezt megtenni , nem kell a malloc-szal kavarni, manuálisan másolni a dolgokat és így tovább.

A C ++ objektumorientált kódot ad. Összeállításakor ugyanolyan hatékony lesz, mivel valójában csak absztrakció a kóddal dolgozó emberek számára. Bár az olyan dolgok, mint a konstruktorok, lelassíthatják az objektumok létrehozását. De az alapértelmezett értékek beállításához vagy a konstruktorra lesz szükség, vagy más módon inicializálhatja az objektumokat a konstruktor használata nélkül (a () “s elhagyásával. ).

De az objektumorientáció sokkal megkönnyíti a játékok programozását. A játékok gyakran tárgyakkal foglalkoznak.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük