Onko järkevää kirjoittaa pelimoottori C-muodossa? [suljettu]

Suljettu . Tämä kysymys on mielipidepohjainen . Se ei tällä hetkellä hyväksy vastauksia.

Kommentit

  • Konsolipelit käyttävät c ++ FYI: tä!
  • Luulen itse asiassa, että C: llä olisi helpompi kirjoittaa pelejä tietyssä mittakaavassa, sanotaan kymmeniä tuhansia LOC: itä, lähinnä siksi, että sen avulla voit keskittyä vain bitteihin ja tavuihin ilman monimutkaisia tietotyyppejä ja rakentaa erittäin nopeasti verrattuna C ++: een. Mutta tietyn asteikon jälkeen (sanotaan saavuttaen satoja tuhansia LOC: itä) ' aloin haluta tavoittaa C ++: ta, jossa I ' d haluavat todella haluta monimutkaisia tietotyyppejä, enemmän tyyppiturvallisuutta, mahdollisesti poikkeuksia, malleja ja menevän vielä suuremmassa mittakaavassa (esimerkiksi miljoonia), jotta muut asiat kuin C ++ voidaan yhdistää C- ja C ++ -koodiin.
  • C on myös se lisäetu, että se on laajasti kannettava jopa ABI: lle, joten on melko helppoa ottaa nykyinen C-koodisi ja aloittaa sen käyttö muilla kielillä esimerkiksi FFI: ltä. C ++ on hieman hankalampi nimien sekoittamisen, kyvyttömyyden heittää turvallisesti moduulin rajojen yli, näennäiset edustajat eivät ole samat kääntäjissä, tavalliset kirjastototeutukset eroavat toimittajien välillä jne. Yleensä huomaan, että kirjoittamani C-kirjastot kestävät kauemmin tarvitsematta muutoksia ja menee tyyliin, vaikka mittakaavan kirjoittaminen sen kanssa kestää kauemmin.

Vastaa

Olisiko kokonaisen pelimoottorin kirjoittaminen C: hen tänään kuitenkin kohtuutonta?

Onko se järkevää, mutta Kysymys kuuluu, mitä se sinulle ostaa? Et todennäköisesti tarvitse äärimmäisiä C-siirrettävyystarjouksia, ja on sääli luopua kaikista C ++: n tarjoamista ominaisuuksista, ellet ole todella filosofisesti vastusta sitä.

Mitä mahdollisia etuja C: llä on C ++: een nähden?

Parempi käännösaika?

Miksi joku pos haluatko varmasti käyttää C: tä C ++: n kanssa?

Luulen, että se on enimmäkseen esteettinen valinta. Monet ihmiset pitävät C: stä, koska se on yksinkertainen ja minimaalinen ja tuntuu siistiltä. C ++: lla on paljon mukavia ominaisuuksia (pelkästään nimitilat tekevät sen käyttämisen arvoiseksi), mutta se on myös iso ja sotkuinen.

Kommentit

  • Id Tech 4: een asti
  • @Josh: Helpompi virheenkorjaus !? C-ohjelmia on tunnetusti vaikea virheenkorjaus, mikä johtuu pääasiassa osoittimista ja muistinhallinnasta. C ++ -ohjelmat (kun käytetään todellisia C ++ -ohjelmointidioneja, jotka pyrkivät välttämään osoittimia ja muistinhallintaa aina kun mahdollista) ovat useita suuruusluokkia helpompaa virheenkorjaus.
  • C voidaan ymmärtää pelkästään kuolevaisilla. C ++: lla näyttää olevan paljon ominaisuuksia ja edistyneitä tapauksia, joista kokeneet ohjelmoijat oppivat jopa vuosikymmenen ajan sen jälkeen, kun ovat käyttäneet sitä päivittäin elämiseen.
  • C ++ on iso kieli, mutta se ' Pelottavaa mainetta levittävät enimmäkseen ihmiset, jotka ' ovat juuri lukeneet kauhutarinoita ja eivät ole ' käyttäneet aikaa oppia sitä . Opittavaa on paljon, mutta saat vastineeksi paljon arvoa. C ++: n avulla voit ilmaista paljon asioita, joita C yksinkertaisesti voi ' t.
  • @ BlueRaja-DannyPflughoeft #define malloc(x) my_malloc(x) #define free(x) my_free(x) ja olet nyt virheenkorjaamassa muistia. C ++: n avulla et koskaan tiedä, mitä jaetaan milloin, koska muistia voidaan jakaa niin monella tavalla (uudet, malloc, luokan rakentajat jne.).

Vastaa

Olen työskennellyt paljon puhtaan C-pelimoottorin kanssa, joka on toimittanut useita tuotteita, joten se on ehdottomasti mahdollista. Tässä on henkilökohtainen kokemukseni työskentelystä molemmissa C vs C ++ -moottoreissa:

  1. Pure-C-rakenteiden avulla voit hyödyntää tietoa rakenteiden kohdistamisesta, ja voit sitten käyttää näitä tietoja rakentaa objektisi pysyvyys- ja sarjallisuuskerrokset. Moottorissa, jonka kanssa työskentelin, oli joitain yksinkertaisia otsikkoparametreja, jotka luovat automaattisesti nämä metatiedot rakenteista, ja se teki tietyntyyppisistä datatoiminnoista vähäpätöisiä. Mielivaltaisten C ++ -otsikkotiedostojen jäsentäminen on käytännössä mahdotonta ja heti kun lisäät perintö- ja virtuaalitoimintoja, menetät kyvyn tietää tarkalleen missä muistissa olevat asiat
  2. Kääntöaika on huomattavasti lyhyempi, koska voit pitää otsikkotiedostosi erittäin pieninä ja hyödyntää rakenteiden eteenpäin tulevia ilmoituksia.
  3. Virheenkorjausta voidaan parantaa, koska ilman malleja ja perintöä on erittäin helppo selvittää tarkalleen, mitä tietty objekti on ja mitä se tekee.

Kaikki nämä edut voidaan saavuttaa yhtä helposti käyttämällä pidätettyä c ++ -koodia, joka pidättäytyy käyttämästä malleja ja perintöjä sarjoitetuissa objekteissa, mutta CTO: n päätös oli helpompaa yksinkertaisuuden varmistamiseksi, jos C ++: n sekavampia elementtejä ei ollut saatavilla.

Henkilökohtaisesti luulen, että tämä oli hieman äärimmäistä, koska kaipasin kykyä ilmoittaa muuttujat sanella silmukoita varten ja monet täysin lailliset käytöt Perintö. Mutta se ei todellakaan maksanut meille paljon tuottavuutta lopulta kaikki huomioon otetut asiat.

Kommentit

  • Siellä ' ei todellakaan mikään estä sinua perimän toteuttamisessa C: ssä. Ja jos käytät C99: tä, voit ilmoittaa muuttujat silmukoille.
  • Mene eri kohtaan kohdassa 3. Se ' s yhtä helppoa kirjoittaa sekava, vaikeasti virheenkorjaava koodi C: hen kuin C ++. Parempi virheenkorjaus ei ole ' t jotain C-kielelle ominaista.
  • Jopa puhdasta koodia voi olla vaikeampaa ymmärtää C ++: ssa – ylikuormituksen, mallien, virtuaalisten toimintojen ja Poikkeuksia ' on paljon vaikeampi nähdä yhdellä silmäyksellä tarkalleen, mikä todellinen ohjausvirta on.
  • @Dan: Yksinkertaisesti, kun sinulla on enemmän tavaraa, C ++ on vaikeampaa virheenkorjaus. Voit tietysti rajoittaa itsesi käyttämästä mitään sellaista tavaraa, jolloin virheenkorjaus on yhtä helppoa kuin C – koska siitä tulee C.
  • Vähemmän tavaraa on itse asiassa syy, miksi pidän C. CI: ssä voi vain kopioida bittejä ja tavuja memcpy: n kanssa mihinkään, koska tyyppijärjestelmä ei salli ' ei salli sellaisia asioita kuin kopiolokit ja lääkäri . Voin kirjoittaa koodia tietäen, että minun ei tarvitse ' joutua palauttamaan sivuvaikutuksia melkein millä tahansa tietyllä koodirivillä, koska en voi ' t implisiittisesti poistua toiminnosta, ellet palaa nimenomaisesti siitä pois; ei ole mitään poikkeuksia. Kaikki tämä tekee tietorakenteiden kirjoittamisesta niin paljon helpompaa – C ++ – standardin mukaisen vector kirjoittaminen on erittäin aikaa vievää, varsinkin jos haluat tehdä siitä …

vastaus

Kirjoitan C ++: lla ja Lua: lla kirjoitetun 2D-pelimoottorin uudelleen C: ksi ja Lua: ksi. Toistaiseksi kokemus on ollut varsin hyvä. Ilmeisesti vektori- ja matriisitoimintojen tekeminen ei päädy niin hyvältä C: n näkökulmasta. Mutta sen lisäksi olen kokenut kokemuksen melko virkistävän vietettyäni yli 10 vuotta C ++ -kehittäjänä.

C: llä on useita etuja C ++: een verrattuna:

  1. kääntäjä varmistaa, ettei mitään koodia käytetä staattisella alustuksella. Tämä tekee täysin turvalliseksi globaalien tietojen, kuten avaimina käytettävien merkkijonojen, staattisen allokoinnin.
  2. Läpinäkyvyys. C-määrityksessä tai muuttujan allokoinnissa tai määrittelyssä ei tapahdu koodin kuormitusta. C ++ luo automaattisesti kopiorakentajat sinulle, joten sinulla on vähemmän hallintaa siitä, mitä suoritetaan tehtävää suoritettaessa.
  3. Paljon virheenkorjauksia voi olla helpompaa, koska funktioiden nimiä ei saada sekoitettua
  4. Se on yleensä hyvä käyttää memcpy C: ssä, mutta se aiheuttaa helposti ongelmia C ++: ssa, koska kopiointirakentajia ei suoriteta. tha t memcpy on paljon nopeampi kuin std :: copy sillä on merkitystä.

Sen lisäksi C-ajattelutapaan pääsemisellä on useita etuja. C ++: ssa huomaan usein tekevän asioita hieman yleistetyiksi ja abstrakteiksi. C: ssä leikkaan yleensä asioita, kuten get-set -menetelmät, ja usein paikoitan kiinteän kokoiset taulukot ennenkuin käytän dynaamisia taulukoita. Usein pääsen lyhyempään ja helpommin virheenkorjattavaan koodiin C. Tietorakenteet ovat yleensä tasaisempia ja helpommin tarkasteltavissa virheenkorjaimessa.

Ollakseni oikeudenmukainen, en koskaan tekisi sovellusta yksinomaan C: ssä. se toimii, että yhdistän sen korkeamman tason kieleen, kuten Lua, joka voi täydentää C: tä hyvin, jos C ei ole niin vahva.

Id-ohjelmisto kirjoittaa suurimman osan moottoreistaan CI: ssä. Voit katsoa Palaa Wolfensteinin linnaan , joka kirjoitettiin C: ssä.

Kirjoitin kokemuksistani sivulle C: n skaalautuvuus vs C ++ ja STL-vektorin haittapuolet tavallisiin matriiseihin verrattuna.

Kommentit

  • FYI, kaikissa tapauksissa, jotka olen ' tarkistanut (mikä on mielestäni darwin gcc ja vc2008), std :: copy will vain kääntyä kutsuksi memcpy: lle, jos molemmat tyypit ovat POD.
  • Lisäksi RE: STL-vektori vs. tavalliset taulukot, miksi et käytä vecton hienoja osia r ja käytä normaaleja C-osoittimia iteraattoreiden sijaan, jos et pidä niistä '? Voit tehdä vain & myvector [N].Se ' pitää molempien maailmojen parhaista, olettaen, että C-koodisi jakaa muistia samalla tavalla. Tai katso silmukoita varten BOOST_FOREACH. Tekee siitä vielä yksinkertaisemman kuin C.
  • Kiitos vinkistä std :: copy memcpy: stä. En tiennyt ' sitä. Kun Alexandrescu kohteli tätä muutama vuosi sitten, niin ei ollut. Tietoja C ++ – iteraattoreista. Kyse on lähinnä filosofiasta. Yritän ohjelmoida, miten C ++: n oli tarkoitus olla ohjelmaa sekä ihmisten, joiden kanssa työskentelen, että C ++ -ominaisuuksien hyödyntämiseksi. Pääasiassa huomautettiin, että jotkin C ++ -parannukset, kuten STL-kontit, eivät aina ole parempia kuin tekemällä se vanhalla C-tavalla.

Vastaa

Kuten joku muu huomautti, C ++ tuo etuna suuret hartiat, joilla voit seisoa (BOOST, STL jne.). Loppujen lopuksi se on henkilökohtainen valinta, mutta valitsisin C ++: n käytettävissä olevien resurssien vuoksi. Jos C ++: ssa on ominaisuuksia, joita et halua käyttää, älä käytä niitä.

Kommentit

  • Huomaa, että 99% kaupalliset ja sisäiset pelimoottorit ohjaavat pois Boostista ja STL: stä useista syistä (suorituskyvyn takuu, virheenkorjaus, langan turvallisuus, hallinta).
  • Ja 99% tilastoista on.
  • Minusta tuntuu siltä, että kaikkien tilastojen mainitsemisen pitäisi olla jonkin verran sääntö.

Vastaa

En ” Luulen, että kukaan käyttää C: tä yksinomaan nykyään, se sekoitetaan yleensä ylemmän tason kielen kanssa.

C: n ohjelmoinnilla on joitain etuja verrattuna esimerkiksi C ++: n ohjelmointiin. C ++ voi tehdä konepellin alla monia käyttäjälle näkymättömiä asioita, mikä voi vahingoittaa suorituskykyä, jos et ole varovainen. C ++ voi olla myös kauhea, kun on kyse välimuistin käyttö, mikä taas voi vahingoittaa suorituskykyäsi.

Joten se voi tuoda joitain etuja, kun pelin suorituskyvyn kannalta kriittiset osat kirjoitetaan C-tyyppisellä tavalla perinteisen C ++ -menetelmän sijaan. Olen en ole koskaan kuullut kenenkään viime vuosina kirjoittaneen koko peliä C: ssä.

Joillakin alustoilla, kuten iPhonessa, C ++: n käyttö voi lisätä suoritettavan koon tietyllä palalla kilotavua (unohdin miten paljon, anteeksi), mikä on syy, miksi jotkut iPhone-kehittäjät päättävät kirjoittaa koodinsa yhdistelmään C ja Objective-C.

Vastaa

Annan sinulle vielä pari syytä, miksi olisi kohtuutonta kirjoittaa pelimoottori tänään C: nä C ++: n sijaan: STL ja BOOST.

En voi kuvitella, miten se olisi kannattaa kirjoittaa vielä yksi list impleme esim. kun voit luottaa koodiin, joka toimii heti laatikosta (ja jota sinun ei tarvitse kirjoittaa!)

Kommentit

  • Onko mitään iso studio todella käyttää vauhtia? Jopa STL: n käytöstä keskustellaan edelleen siirrettävyyden takia. Ainakin konsolimoottoreille.
  • Henkilökohtaisesti olen ' m käyttämällä Boost.FunctionTypes-toimintoa c ++ / lua-vuorovaikutukseen (katso gamedev.net/reference/programming/features/CPPLuaExport/ … ) ja Boost-satunnaisnumerokirjasto yhtenäisen satunnaislukun muodostamiseksi (hiukkasjärjestelmille). Myös Boost.Foreach on siisti. BTW, kuka välittää, jos suuret studiot eivät käytä BOOSTia? Heillä on työvoimaa kirjoittaa omat STL-kirjastot tyhjästä, en ' t.
  • Niin, mutta ymmärtävät myös, että siellä ' s samanlaiset kirjastot myös C: lle.
  • Uskon, että monet ihmiset käyttävät boostia peleissä. Mutta se ' ei ole kaukana vaatimuksesta (tai edes toivottavaa) monille meistä.
  • Ihmiset, mitä uskot ei ole merkitystä : joko tiedät tai et tiedä ' ei tiedä .

Vastaa

Pelimoottorin kirjoittaminen C: hen on järkevää. Se on nopea ja voidaan siirtää useisiin järjestelmiin. Voit esimerkiksi käyttää Androidia (NDK: n avulla). Voit käyttää sitä iPhonessa (tavoite c on vain c: n laajennus). Voit myös käyttää se pääkäyttöjärjestelmälle, kuten Linux, Mac tai Windows. Jos tunnet olosi mukavaksi c: n kanssa, suosittelen, että kokeilet sitä!

Vastaa

Tietenkin se on järkevää. Henkilökohtaisesti en tekisi sitä, ja suurin osa tuntemistani C-faneista kirjoittaa vain C-tyyppistä koodia .cpp-tiedostoihin. Mutta kielet ovat riittävän samanlaisia kuin missä sillä ei ole väliä.

Mitä miksi joku haluaisi tehdä tämän, mielestäni se johtuu pääasiassa anti-C ++ -filosofiasta. Henkilökohtaisesti en edelleenkään usko, että tämä on hyvä syy valita C sijaan ”C-tyylinen C ++”. typedef struct -hulluus on tarpeeksi hyvä syy päästä eroon C: stä, ja on monia muita.

Valitettavasti C ja C ++ ovat molemmat melko kauheita kieliä, kun pääsemme siihen. Tämä on yksi syy siihen, että ihmiset ovat yrittäneet tehdä paljon koodia komentosarjassa viime vuosina.

Jos etsit esimerkkejä ihmisistä, jotka työskentelevät C: ssä, voit jättää tunnuksen huomiotta, kun muistan lukemani, että he ovat hylänneet C: n kauan sitten. Cryptic Studios (Star Trek Online) tekee kuitenkin kaiken moottorikehityksensä C: ssä. Sikäli kuin voin kertoa, kyllä, se johtuu filosofiasta enemmän kuin mistään konkreettisista eduista.

Vastaa

Kyllä ja ei. Kyllä, olen tehnyt sen muutama vuosi sitten, mutta tarvitsin pelini toimivan 3D-muodossa 64-bittisellä unix (ei linux) 64-bittisellä etäpalvelimella, jossa soittimet ovat tyhmillä päätelaitteilla. Se ei ollut triviaali. C voi olla mukava on haluat integroida LUA: n, mutta sain lopulta luan työskentelemään C ++: ssa, joten sanoisin kyllä, se on mahdollista, mutta älä tee sitä.

Vastaa

Voiko mahdollinen hyvä vastaus olla” käytä molempia ”?

Koska kuulin, että panda3d-projektit voitaisiin optimoida, tappamalla pullonkaula joko käyttämällä jotakin cythonia tai joko koodaamalla nämä osat.

Suurimman osan ajasta optimoitavat osat ovat osa, jolla on paljon iteraatioita ja sisäkkäisiä tai joissa on paljon numeerista laskentaa, joten (villi) arvaukseni on, että yksi oikeudenmukainen kompromissi olisi käyttää molempia kieliä , käyttämällä C: tä osiin, jotka sisältävät paljon matalan tason ohjelmointia, joten et voi tehdä y käytät C ++ – kieltä väärin nopeuden tarvitsevassa osassa ja C ++: n loppupelissä.

Ihannetapauksessa teet moottorin nopean osan pitäen mielessä korkean tason ja käytä sitten komentosarjakieli tai C ++, joka käyttää paljon vähemmän pesää / silmukoita.

Et tietenkään voi koskaan tehdä sellaista moottoria, joka sopisi kaikkiin kehittäjien tarvitsemiin peleihin, paitsi jos omistat moottorisi erityiseen sellainen peli …

Mutta älä ota neuvojani itsestäänselvyytenä, koska en ole kokenut pelikehittäjä eikä kokenut kehittäjä … Luulen, että C pakottaa sinut kirjoittamaan nopeaa koodia kirjoittaessasi hyvä ja nopea C ++ -koodi yhtä suurelle projektille kuin peli on eri asia …

Vastaus

C työskenteli John Carmack , saatat saada paljon etuja käyttämällä C-merkintää, mutta se voi viedä hetken, kunnes pääset sinne hyötymään niistä.

Täältä löydät luettelon pelimoottoreista joitain Jos ne on kirjoitettu C-kirjaimeksi, saatat saada oivalluksia C-pelimoottorin tekemisestä käymällä läpi heidän lähdekoodin.

Vastaa

C-koodi on normaalisti kelvollinen C ++ -koodi.

C ++: n tärkeimmät ongelmat ovat sen väärä käyttö ( Linus Torvalds vihaa sitä tästä syystä , hänellä oli myös joitain muita ongelmia kirjastojen siirrettävyydessä ja niin edelleen ostaessa hän työskentelee käyttöjärjestelmien tasolla ja hänen on pystyttävä suorittamaan asioita kaikilla siellä olevilla satunnaisilla siruilla).

Esimerkiksi cstyle-taulukon [] käyttämisessä c ++ -standardiin :: vector <> (tai vastaavaan säilöön) ei ole melkein mitään etua.

Vektorit ovat tyypin turvallisia ja ne voidaan rajoittaa (voit käyttää elementtejä joko get () – tai [] -toiminnolla, vaikka et käytä matriisitarkastettua menetelmää, voit silti kysellä kokoa sen sijaan, että kartoit sen ympärille osoittimen avulla.

Mutta vektorit voivat olla hitaampia, jos et esimerkiksi ilmoita oletuskokoa rakentaja. Myös asioiden lisääminen vektoriin voi aiheuttaa hidastumisia, jos se tarvitsee sitten kokoa. C ++ 11 tuo myös monia etuja, kuten yhtenäisen alustuksen (voit nyt julistaa ja alustaa vektorit samalla syntaksilla) ja on olemassa siirtorakentajia, joiden avulla voit välttää kopioinnin. Voit jopa tehdä omat mukautetut alustusohjelmat (jos haluat jostain syystä tehdä jotain muuta kuin mallocin käyttöä).

Tai tietysti, jos sinun tarvitsee muuttaa kokoa, vektorien on silti helpompi tehdä se , sinun ei tarvitse sotkea mallocin kanssa, kopioida asioita manuaalisesti ja niin edelleen.

C ++ antaa sinulle objektisuuntaisen koodin. Käännettäessä se tulee olemaan yhtä tehokasta, koska se on oikeastaan vain abstraktio ihmisille, jotka työskentelevät koodin kanssa. Vaikka rakentajien kaltaiset asiat voivat hidastaa objektin luomista. Mutta joudut joko rakentajaan asettamaan oletusarvot tai muuten voit alustaa objektit käyttämättä konstruktoria (jättämällä () ).

Mutta kohteen suunta tekee pelien ohjelmoinnista paljon helpompaa. Pelit käsittelevät usein esineitä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *