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:
- 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
- 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>
- 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:
- 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.
- Á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.
- á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.