Er det rimelig å skrive en spillmotor i C? [lukket]

Stengt . Dette spørsmålet er meningsbasert . Det aksepteres for øyeblikket ikke svar.

Kommentarer

  • Konsollspill bruker c ++ FYI!
  • Jeg tror faktisk C ville være lettere å skrive spill i opp til en viss skala, si titusenvis av LOC eller så, hovedsakelig fordi det lar deg bare fokusere på biter og byte uten komplekse datatyper og bygger super raskt sammenlignet med C ++. Men etter en viss skala (si å nå hundretusenvis av LOC), begynte jeg ' å ønske å nå C ++ hvor jeg ' begynne å ønske kompliserte datatyper, mer typesikkerhet, muligens unntak, maler og enda større skala (for eksempel millioner), for at andre ting enn C ++ kan kombineres med C- og C ++ -koden.
  • C har også den ekstra fordelen av å være bredt bærbar selv for ABI, så det blir ganske enkelt å ta din eksisterende C-kode og deretter begynne å bruke den på andre språk fra for eksempel en FFI. C ++ er litt vanskeligere med navnemangling, manglende evne til å kaste trygt over modulgrenser, vtable-reps er ikke det samme på tvers av kompilatorer, standard biblioteksimplementeringer som er forskjellige fra leverandører osv. Generelt synes jeg C-bibliotekene jeg skriver varer lenger uten å trenge endringer og går ut av stilen, selv om det tar lengre tid å skrive noe av skalaen med den.

Svar

Ville imidlertid å skrive en hel spillmotor i C være urimelig i dag?

Det er rimelig, men spørsmålet er hva kjøper det deg? Du trenger sannsynligvis ikke den ekstreme bærbarheten C tilbyr, og det er synd å gi opp alle funksjonene C ++ tilbyr med mindre du virkelig er filosofisk imot det.

Hva er, hvis noen, noen fordeler som C har fremfor C ++?

Bedre kompileringstid?

Hvorfor skulle noen stille ønsker du å bruke C over C ++?

Jeg tror det stort sett er et estetisk valg. Mange liker C fordi det er enkelt og minimalt og føles rent. C ++ har mange fine funksjoner (navneplasser alene gjør det verdt å bruke), men det er også stort og rotete.

Kommentarer

  • Fram til Id Tech 4
  • @Josh: Enklere å feilsøke !? C-programmer er notorisk vanskelige å feilsøke, hovedsakelig på grunn av pekere og minnehåndtering. C ++ programmer (når du bruker ekte C ++ programmeringsidiomer, som har en tendens til å unngå pekere og minnehåndtering når det er mulig) er flere størrelsesordener lettere å feilsøke.
  • C kan forstås av bare dødelige. C ++ ser ut til å ha mange funksjoner og edge cases erfarne programmerere lærer om selv etter et tiår med å bruke den hver dag for å leve.
  • C ++ er et stort språk, men det ' s fryktelige rykte spres hovedsakelig av mennesker som ' nettopp har lest skrekkhistorier og ikke har tatt ' tid til å lære det . Det er mye å lære, men du får mye verdi i retur for det. C ++ lar deg uttrykke mange ting som C ganske enkelt kan ' t.
  • @ BlueRaja-DannyPflughoeft #define malloc(x) my_malloc(x) #define free(x) my_free(x) og du feilsøker nå minne. Med C ++ vet du aldri hva som skal tildeles når, fordi det er så mange måter å fordele minne på (nytt, malloc, klassekonstruktører osv.)

Svar

Jeg har jobbet mye med en ren-C spillmotor som har sendt flere produkter, så det er absolutt mulig. Her er min personlige erfaring med å jobbe i begge C vs C ++ motorer:

  1. Ved bruk av pure-C strukturer kan du dra nytte av kunnskap om justering av strukturer, og du kan deretter bruke denne informasjonen for å bygge objektets utholdenhets- og serialiseringslag. Motoren jeg jobbet med hadde noen enkle topptekstparsere som automatisk ville lage disse metadataene om strukturer, og det gjorde visse typer datahandlinger trivielle. Å analysere vilkårlige C ++ headerfiler er i det vesentlige umulig, og når du legger til arv og virtuelle funksjoner, mister du muligheten til å vite nøyaktig hvor ting er i minnet.
  2. Kompileringstiden er betydelig kortere fordi du kan holde toppfiler veldig kompakte og dra nytte av fremover erklæringer av strukturer. / li>
  3. Feilsøking kan forbedres fordi det uten bruk av maler og arv er veldig enkelt å finne ut nøyaktig hva et bestemt objekt er og hva det gjør.

Alle disse fordelene kan også oppnås like enkelt ved hjelp av behersket c ++ -kode som avstår fra å bruke maler og arv på serielle objekter, men det var CTOs beslutning at det ville være lettere for å håndheve enkelheten hvis de mer forvirrende elementene i C ++ ikke var tilgjengelige.

Personlig synes jeg dette var litt ekstremt, da jeg virkelig savnet muligheten til å kunngjøre variabler for løkker og de mange helt legitime bruksområdene for arv. Men det kostet oss ikke mye produktivitet til slutt alt tatt i betraktning

Kommentarer

  • Der ' er egentlig ingenting som hindrer deg i å implementere arv i C. Og hvis du bruker C99, kan du erklære variabler for sløyfer.
  • Kommer til å være uenig med punkt 3. Det ' er like enkelt å skrive rotete, vanskelig å feilsøke kode i C som den er i C ++. Bedre feilsøking er ikke ' t noe som ligger i C-språket.
  • Selv ren kode kan være vanskeligere å forstå i C ++ – med overbelastning, maler, virtuelle funksjoner og unntak, det ' er mye vanskeligere å se på et øyeblikk nøyaktig hva den faktiske kontrollflyten vil være.
  • @Dan: Bare ved å ha flere ting, er C ++ vanskeligere å feilsøke. Du kan selvfølgelig begrense deg fra å bruke noe av det, i så fall blir det like enkelt å feilsøke som C – fordi det blir C.
  • Mindre ting er faktisk grunnen til at jeg liker C. For eksempel, i CI kan bare kopiere biter og byte rundt med en memcpy for hva som helst fordi typesystemet ikke tillater ' t ting som copy ctors og dtors . Jeg kan skrive kode, vel vitende om at jeg ikke vil ' ikke trenger å rulle tilbake bivirkninger på nesten hvilken som helst gitt linje med kode siden jeg ikke kan ' t implisitt gå ut av en funksjon med mindre jeg eksplisitt kommer tilbake fra den; det er ingen unntak som kastes. Alt dette gjør det lettere å skrive datastrukturer – i C ++ er det bare å ta en standardkompatibel vector veldig tidkrevende, spesielt hvis du vil gjøre det …

Svar

Jeg skriver om en 2D-spillmotor skrevet i C ++ og Lua til C og Lua. Så langt har opplevelsen vært ganske god. Å gjøre vektor- og matriseoperasjoner ender tydeligvis ikke så bra å se i C. Men bortsett fra det har jeg opplevd opplevelsen ganske forfriskende etter å ha tilbrakt 10+ år som C ++ utvikler.

C har en rekke fordeler fremfor C ++:

  1. Kompilatoren vil sørge for at ingen kode kjøres ved statisk initialiseringstid. Det gjør det helt trygt å statisk tildele globale data som strenger brukt som nøkler f.eks.
  2. Gjennomsiktighet. I C-tildeling eller tildeling eller definering av en variabel vil ikke kjøre masse kode. C ++ genererer automatisk kopikonstruktører for deg, slik at du har mindre kontroll over hva som blir utført når du gjør oppdrag.
  3. Mye feilsøking kan være lettere på grunn av at funksjonsnavn ikke blir manglet
  4. Det er vanligvis greit å bruke memcpy i C, men det vil lett føre til problemer i C ++, fordi kopikonstruktører ikke kjøres. Gitt tha t memcpy er mye raskere enn std :: kopier som betyr noe.

Bortsett fra at det er en rekke fordeler med å komme inn på C-tankegangen. I C ++ finner jeg meg ofte å gjøre ting litt overgeneraliserte og abstrakte. I C kutter jeg vanligvis ut ting som get-set-metoder og forhåndslokaliserer arrays med fast størrelse i stedet for å bruke dynamiske arrays. Ofte ender jeg med kortere og lettere feilsøkt kode i C. Datastrukturene er vanligvis flatere og lettere å se i en feilsøkingsprogram.

For å være rettferdig ville jeg aldri lage en app utelukkende i C. Årsaken det fungerer slik at jeg kombinerer det med et høyere nivå språk som Lua som kan utfylle C veldig bra, hvis C ikke er så sterk.

Id-programvare skriver de fleste av motorene deres i CI tror, du kan se på Gå tilbake til slottet Wolfenstein som ble skrevet i C.

Jeg skrev om noe av min erfaring på skalerbarhet av C vs C ++ og Ulemper ved STL-vektor sammenlignet med vanlige matriser.

Kommentarer

  • FYI, i hvert tilfelle som jeg ' har sjekket (som jeg tror darwin gcc og vc2008), std :: copy will bare kompiler til en samtale om å memcpy hvis begge typene er POD.
  • Også, RE: STL-vektor vs vanlige matriser, hvorfor ikke bruke de fine delene av vecto r og bruk normale C-pekere i stedet for iteratorer hvis du ikke liker '? Du kan bare gjøre & myvector [N].Det ' er som det beste fra begge verdener, forutsatt at C-koden din tildeler minne på samme måte. Eller ta en titt på BOOST_FOREACH. Gjør det enda enklere enn C.
  • Takk for tipset om std :: copy memcpy. Jeg visste ikke '. Da Alexandrescu behandlet dette for noen år siden, var det ikke tilfelle. Om C ++ iteratorer. Det handler i hovedsak om filosofien, jeg prøver å programmere hvordan C ++ var ment å være program både for folk jeg jobber med og for å dra nytte av C ++ funksjoner. Det ble hovedsakelig laget for å påpeke at noen C ++ forbedringer som STL-containere ikke alltid er bedre enn å gjøre det på den gamle C-måten.

Svar

Som noen andre påpekte, gir C ++ fordelen med store skuldre du kan stå på (BOOST, STL osv.). Til slutt er det et personlig valg, men jeg vil velge C ++ på grunn av tilgjengelige ressurser. Hvis det er funksjoner i C ++ som du ikke vil bruke, så bruk dem ikke.

Kommentarer

  • Merk at 99% av kommersielle og interne spillmotorer styrer seg fra Boost og STL av forskjellige årsaker (ytelsesgaranti, feilsøking, trådsikkerhet, kontroll).
  • Og 99% av statistikken består.
  • Jeg føler at det burde være litt av en regel å sitere all statistikk.

Svar

Jeg don » ikke tror noen bruker C utelukkende i disse dager, det er vanligvis blandet sammen med et høyere nivå språk.

Programmering i C har noen fordeler i forhold til, for eksempel programmering i C ++. C ++ kan gjøre mange ting under panseret som er usynlige for brukeren, noe som kan skade ytelsen hvis du ikke er forsiktig. C ++ kan også være forferdelig når det gjelder cache-bruk, noe som igjen kan skade ytelsen din.

Så det kan gi noen fordeler å skrive ytelseskritiske deler av et spill på en C-lignende måte, i stedet for på en tradisjonell C ++ måte. aldri hørt om noen, de siste årene, faktisk å skrive et helt spill i C. Men.

På noen plattformer, som iPhone, kan bruk av C ++ øke den kjørbare størrelsen med en viss kilo kilobyte (jeg glemte hvordan mye, beklager), og det er derfor noen iPhone-utviklere velger å skrive koden sin i en blanding av C og Objective-C.

Svar

Jeg vil gi deg noen flere grunner til at det ville være urimelig å skrive en spillmotor i C i stedet for C ++ i dag: STL og BOOST.

Jeg kan ikke forestille meg hvordan det ville være verdt å skrive enda en list impleme ntasjon når du kan stole på kode som fungerer ut av boksen (og som du ikke trenger å skrive!)

Kommentarer

  • Har noen stort studio bruker faktisk boost? Selv STL-bruk er fortsatt under debatt på grunn av bærbarhet. I det minste for konsollmotorer.
  • Personlig <

bruker Boost.FunctionTypes for c ++ / lua interaksjon (se gamedev.net/reference/programming/features/CPPLuaExport/ … ) og biblioteket for Boost tilfeldige tall for enhetlig generering av tilfeldig tall (for partikkelsystemer). Også, Boost.Foreach er ryddig. Hvem bryr seg om store studioer ikke bruker BOOST? De har arbeidskraft til å skrive sine egne STL-biblioteker fra bunnen av, jeg vet ikke ' t.

  • Ja, men innser også at der ' s lignende biblioteker for C også.
  • Mange bruker boost i spill, tror jeg. Men det ' er langt fra et krav (eller til og med ønskelig) for mange av oss.
  • Folk, det du tror er irrelevant : enten du vet eller du ikke ' vet ikke .
  • Svar

    Å skrive en spillmotor i C er rimelig. Det er raskt og kan porteres til flere systemer. For eksempel kan du bruke til Android (med bruk av NDK). Du kan bruke det til iPhone (mål c er bare en utvidelse av c). Du kan også bruke det for og av hoved-operativsystemet som Linux, Mac eller Windows. Hvis du føler deg komfortabel med c, foreslår jeg at du prøver!

    Svar

    Selvfølgelig er det rimelig. Jeg ville personlig ikke gjort det, og de fleste C-fans jeg kjenner, skriver faktisk bare C-lignende kode i .cpp-filer. Men språkene er lik nok til hvor det ikke betyr noe.

    Når det gjelder hvorfor noen ville velge å gjøre dette, tror jeg det mest skyldes anti-C ++ filosofi. Personlig synes jeg fortsatt ikke dette er en god grunn til å velge C fremfor «C-stil C ++». typedef struct galskap er en god nok grunn til å styre unna C, og det er en rekke andre.

    Dessverre er C og C ++ begge forferdelige språk når vi kommer til det. Det er en grunn til at folk har prøvd å gjøre mye av koden sin i skript de siste årene.

    Hvis du leter etter eksempler på folk som jobber i C, kan du ignorere id når jeg husker at jeg har forlatt C for lenge siden. Cryptic Studios (Star Trek Online) gjør all sin motorutvikling i C, skjønt. Så vidt jeg kan si, er det på grunn av filosofi mer enn på grunn av noen konkret fordel.

    Svar

    Ja og nei. Ja, jeg har gjort det for noen år tilbake, men jeg trengte spillet mitt for å kjøre i 3D på en unix (ikke linux) 64-biters ekstern server med spillerne på dumme terminaler. Det var ikke trivielt. C kan være fint er du vil integrere LUA men til slutt fikk jeg lua til å jobbe i C ++ så jeg vil si ja det er mulig, men ikke gjør det.

    Svar

    Kan et mulig godt svar være» bruk begge deler «?

    Da jeg hørte at panda3d-prosjekter kunne optimaliseres, drepte flaskehalsen enten ved hjelp av noe cython eller omkode disse delene.

    Mesteparten av tiden er delene som må optimaliseres den delen med mange iterasjoner og hekkende eller med mye numerisk databehandling, så mitt (ville) gjetning er at et rettferdig kompromiss ville være å bruke begge språkene , ved å bruke C for deler som inneholder mye lavt nivå programmering, slik at du ikke kan gjøre en y misbruk av C ++ språk for den delen som trenger hastighet, og C ++ for resten av spillet.

    Ideelt sett gjør du den raske delen av motoren med tanke på det høye nivået, og deretter bruker du en skriptspråk eller C ++ som vil bruke mye mindre nest / loops.

    Selvfølgelig kan du aldri lage en slik motor som passer til alle spillene utviklere trenger å gjøre, bortsett fra hvis du dedikerer motoren din til en spesiell slags spill …

    Men ikke ta rådene mine for gitt siden jeg ikke er en erfaren spillutvikler eller en erfaren utvikler … Jeg tror C tvinger deg til å skrive rask kode mens du skriver god og rask C ++ – kode for et prosjekt så stort som et spill er en annen ting …

    Svar

    C jobbet for John Carmack , du kan få mange fordeler ved å bruke C, men til du kommer dit for å dra nytte av dem, kan det ta litt tid.

    Her kan du finne en liste over spillmotorer noen o f dem er skrevet i C, kan du kanskje få litt innsikt i hvordan du gjør en C-spillmotor ved å gå gjennom kildekoden.

    Svar

    C-kode er normalt gyldig C ++ -kode.

    Hovedproblemene med C ++ bruker den feil ( Linus Torvalds hater det av denne grunn , han hadde også noen andre problemer med portabilitet i biblioteket, og så videre kjøper han på operativsystemnivå og må kunne kjøre ting på alle tilfeldige brikker der ute).

    For eksempel det er nesten ingen fordel med å bruke et cstyle-array [] over en c ++ std :: vektor <> (eller lignende container).

    Vektorene er typesafe og kan kontrolleres av grenser (du kan få tilgang til elementer ved hjelp av enten get () eller [], selv om du ikke bruker den matrisekontrollerte metoden, kan du fremdeles spørre størrelsen i stedet for å kartlegge den rundt med pekeren).

    Men vektorer kan være tregere hvis du for eksempel ikke erklærer standardstørrelsen i konstruktør. Hvis du legger til ting i en vektor, kan det føre til avmatning hvis den trenger en størrelse. C ++ 11 legger også til mange fordeler, for eksempel ensartet initialisering (du kan nå erklære og initialisere vektorer ved hjelp av samme syntaks), og det er trekkkonstruktører som lar deg unngå kopiering. Du kan til og med lage dine egne tilpassede initialiserere (hvis du ønsket å gjøre noe annet enn å bruke malloc av en eller annen grunn).

    Eller selvfølgelig hvis du trenger å endre størrelse på ting, så er vektorer fremdeles lettere å gjøre det med , du trenger ikke å rote med malloc, kopiere ting manuelt og så videre.

    C ++ gir deg objektorientert kode. Når du kompileres, blir den like effektiv siden den egentlig bare er en abstraksjon for mennesker som arbeider med koden. Selv om ting som konstruktører kan redusere oppretting av objekter. Men du trenger enten konstruktøren for å angi standardverdiene, eller ellers kan du initialisere objekter uten å bruke konstruktøren (ved å la være med () ).

    Men objektorientering gjør programmering av spill mye lettere. Spill handler ofte om gjenstander.

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *