Ist es sinnvoll, eine Spiel-Engine in C zu schreiben? [geschlossen]

geschlossen . Diese Frage ist meinungsbasiert . Derzeit werden keine Antworten akzeptiert.

Kommentare

  • Konsolenspiele verwenden C ++ FYI!
  • Ich denke tatsächlich, dass C einfacher wäre, Spiele in einem bestimmten Maßstab zu schreiben, sagen wir Zehntausende von LOC oder so, hauptsächlich, weil Sie sich nur auf Bits und Bytes ohne komplexe Datentypen konzentrieren können und im Vergleich zu C ++ superschnell erstellen. Aber nach einer bestimmten Skala (z. B. Erreichen von Hunderttausenden von LOC) würde ich ' anfangen, nach C ++ zu greifen, wo ich ' bin d Beginnen Sie tatsächlich damit, komplexe Datentypen, mehr Typensicherheit, möglicherweise Ausnahmen, Vorlagen und eine noch größere Skalierung (z. B. Millionen) zu erhalten, damit andere Dinge als C ++ mit dem C- und C ++ – Code kombiniert werden können.
  • C. hat auch den zusätzlichen Vorteil, dass es selbst für ABI weit verbreitet ist, so dass es ziemlich einfach wird, Ihren vorhandenen C-Code zu übernehmen und ihn dann in anderen Sprachen zu verwenden, beispielsweise von einem FFI. C ++ ist etwas umständlicher mit Namensverfälschung, Unfähigkeit, sicher über Modulgrenzen hinweg zu werfen, vtable-Wiederholungen, die über Compiler nicht gleich sind, Standardbibliotheksimplementierungen, die sich zwischen Anbietern unterscheiden usw. Im Allgemeinen halten die von mir geschriebenen C-Bibliotheken länger, ohne dass Änderungen erforderlich sind aus der Mode kommen, obwohl es länger dauert, etwas Skalierbares damit zu schreiben.

Antwort

Wäre es heute jedoch unvernünftig, eine ganze Spiel-Engine in C zu schreiben?

Es ist vernünftig, aber das Die Frage ist, was es Ihnen kauft. Sie brauchen wahrscheinlich nicht die extreme Portabilität, die C bietet, und es ist eine Schande, alle Funktionen, die C ++ bietet, aufzugeben, es sei denn, Sie sind wirklich philosophisch dagegen.

Welche Vorteile hat C gegenüber C ++, wenn überhaupt?

Bessere Kompilierungszeit?

Warum sollte jemand pos Möchten Sie möglicherweise C über C ++ verwenden?

Ich denke, es ist hauptsächlich eine ästhetische Wahl. Viele Leute mögen C, weil es einfach und minimal ist und sich sauber anfühlt. C ++ hat viele nette Funktionen (Namespaces allein machen es wert, verwendet zu werden), aber es ist auch groß und chaotisch.

Kommentare

  • Bis Id Tech 4
  • @Josh: Einfacher zu debuggen!? C-Programme sind bekanntermaßen schwer zu debuggen, hauptsächlich aufgrund von Zeigern und Speicherverwaltung. C ++ – Programme (bei Verwendung von echten C ++ – Programmiersprachen, bei denen Zeiger und Speicherverwaltung nach Möglichkeit vermieden werden) sind mehrere Größenordnungen einfacher zu debuggen.
  • C kann von bloßen Sterblichen verstanden werden. C ++ scheint viele Funktionen und Randfälle zu haben, die erfahrene Programmierer auch nach einem Jahrzehnt, in dem sie es jeden Tag zum Leben verwenden, kennenlernen.
  • C ++ ist eine große Sprache, aber ' s furchterregender Ruf wird hauptsächlich von Leuten verbreitet, die ' gerade Horrorgeschichten gelesen haben und sich ' nicht die Zeit genommen haben, ihn zu lernen . Es gibt viel zu lernen, aber dafür bekommt man viel Wert. Mit C ++ können Sie viele Dinge ausdrücken, die C einfach ' t.
  • @ BlueRaja-DannyPflughoeft #define malloc(x) my_malloc(x) #define free(x) my_free(x) und Sie debuggen jetzt Speicher. Mit C ++ wissen Sie nie, was wann zugewiesen wird, da es so viele Möglichkeiten gibt, Speicher zuzuweisen (neu, malloc, Klassenkonstruktoren usw.).

Antwort

Ich habe ausgiebig mit einer Pure-C-Game-Engine gearbeitet, die mehrere Produkte ausgeliefert hat, daher ist dies absolut möglich. Hier ist meine persönliche Erfahrung mit der Arbeit in beiden C- und C ++ – Engines:

  1. Wenn Sie reine C-Strukturen verwenden, können Sie das Wissen über die Ausrichtung von Strukturen nutzen und diese Informationen dann verwenden Die Engine, mit der ich gearbeitet habe, verfügte über einige einfache Header-Parser, mit denen diese Metadaten zu Strukturen automatisch erstellt wurden, und bestimmte Arten von Datenoperationen wurden trivial. Das Parsen beliebiger C ++ – Header-Dateien ist im Wesentlichen unmöglich und sobald Wenn Sie Vererbung und virtuelle Funktionen hinzufügen, verlieren Sie die Fähigkeit, genau zu wissen, wo sich die Dinge im Speicher befinden.
  2. Die Kompilierungszeit ist erheblich kürzer, da Sie Ihre Header-Dateien sehr kompakt halten und Vorwärtsdeklarationen von Strukturen nutzen können.
  3. Das Debuggen kann verbessert werden, da es ohne die Verwendung von Vorlagen und Vererbung sehr einfach ist, genau herauszufinden, was ein bestimmtes Objekt ist und was es tut.

All diese Vorteile könnten ebenso einfach mit eingeschränktem C ++ – Code erzielt werden, der keine Vorlagen und keine Vererbung für serialisierte Objekte verwendet. Es war jedoch die Entscheidung des CTO, dass dies einfacher sein würde um die Einfachheit zu erzwingen, wenn die verwirrenderen Elemente von C ++ nicht verfügbar wären.

Persönlich denke ich, dass dies etwas extrem war, da ich die Fähigkeit, Variablen in for-Schleifen zu deklarieren, und die vielen völlig legitimen Verwendungen für wirklich vermisst habe Vererbung. Aber es hat uns am Ende wirklich nicht viel Produktivität gekostet.

Kommentare

  • Dort ' ist wirklich nichts, was Sie daran hindert, die Vererbung in C zu implementieren. Und wenn Sie C99 verwenden, können Sie Variablen für for-Schleifen deklarieren.
  • Sie werden Punkt 3 nicht zustimmen. Es ' Es ist genauso einfach, unordentlichen, schwer zu debuggenden Code in C zu schreiben wie in C ++. Besseres Debuggen ist nicht ' etwas, das der C-Sprache inhärent ist.
  • Selbst sauberer Code kann in C ++ schwieriger zu verstehen sein – mit Überladung, Vorlagen, virtuellen Funktionen und Ausnahmen ist es ' viel schwieriger, auf einen Blick genau zu sehen, wie der tatsächliche Kontrollfluss aussehen wird.
  • @Dan: C ++ ist einfach, wenn man mehr Zeug hat schwerer zu debuggen. Sie können sich natürlich darauf beschränken, diese Dinge zu verwenden. In diesem Fall ist das Debuggen genauso einfach wie bei C – weil es zu C wird.
  • Weniger Dinge sind eigentlich der Grund, warum ich C mag. Zum Beispiel: In CI können nur Bits und Bytes mit einer memcpy für alles kopiert werden, da das Typsystem ' Dinge wie das Kopieren von Ctors und Dtors nicht zulässt . Ich kann Code schreiben, wenn ich weiß, dass ich ' keine Nebenwirkungen in fast jeder Codezeile zurücksetzen muss, da ich ' nicht implizit kann Beenden Sie eine Funktion, es sei denn, ich kehre ausdrücklich zurück. Es werden keine Ausnahmen geworfen. All dies macht das Schreiben von Datenstrukturen so viel einfacher – in C ++ ist das Schreiben eines standardkonformen vector sehr zeitaufwändig, insbesondere wenn Sie es erstellen möchten …

Antwort

Ich schreibe eine in C ++ und Lua geschriebene 2D-Spiel-Engine in C und Lua um. Bisher waren die Erfahrungen recht gut. Offensichtlich sehen Vektor- und Matrixoperationen in C nicht so gut aus. Abgesehen davon habe ich die Erfahrung nach mehr als 10 Jahren als C ++ – Entwickler als ziemlich erfrischend empfunden.

C hat eine Reihe von Vorteile gegenüber C ++:

  1. Der Compiler stellt sicher, dass zum Zeitpunkt der statischen Initialisierung kein Code ausgeführt wird. Dadurch ist es absolut sicher, globale Daten wie als Schlüssel verwendete Zeichenfolgen statisch zuzuweisen, z. B.
  2. li> Transparenz. Bei der C-Zuweisung oder beim Zuweisen oder Definieren einer Variablen wird nicht viel Code ausgeführt. C ++ generiert automatisch Kopierkonstruktoren für Sie, sodass Sie weniger Kontrolle darüber haben, was bei der Zuweisung ausgeführt wird.

    li> Viel Debuggen kann einfacher sein, da Funktionsnamen nicht entstellt werden

  3. Normalerweise ist es in Ordnung, memcpy in C zu verwenden, aber es wird leicht Probleme in C ++ verursachen, da Kopierkonstruktoren nicht ausgeführt werden tha t memcpy ist viel schneller als std :: copy das ist wichtig.

Abgesehen davon bietet der Einstieg in die C-Denkweise eine Reihe von Vorteilen. In C ++ finde ich mich oft dabei, Dinge etwas übergeneralisiert und abstrakt zu machen. In C schneide ich normalerweise Dinge wie Get-Set-Methoden aus und ordne häufig Arrays mit fester Größe vor, anstatt dynamische Arrays zu verwenden. Oft habe ich in C kürzeren und leichter zu debuggenden Code. Die Datenstrukturen sind normalerweise flacher und in einem Debugger einfacher anzuzeigen.

Um fair zu sein, würde ich niemals eine App ausschließlich in C erstellen. Der Grund Es funktioniert so, dass ich es mit einer höheren Sprache wie Lua kombiniere, die C sehr gut ergänzen kann, wenn C nicht so stark ist.

Id-Software schreibt die meisten ihrer Engines in CI, glauben Sie, Sie können es sich ansehen Rückkehr zum Schloss Wolfenstein , das in C geschrieben wurde.

Ich schrieb über einige meiner Erfahrungen auf Skalierbarkeit von C gegen C ++ und Nachteile des STL-Vektors im Vergleich zu einfachen Arrays.

Kommentare

  • FYI, in jedem Fall, den ich ' überprüft habe (was meiner Meinung nach darwin gcc und vc2008 ist), wird std :: copy Kompilieren Sie einfach zu einem Aufruf von memcpy, wenn beide Typen POD sind.
  • Auch RE: STL-Vektor gegen einfache Arrays, warum nicht die netten Teile von vecto verwenden r und verwenden Sie normale C-Zeiger anstelle von Iteratoren, wenn Sie sie ' nicht mögen? Sie können einfach & myvector [N] ausführen.' ist das Beste aus beiden Welten, vorausgesetzt, Ihr C-Code führt die Speicherzuweisung auf die gleiche Weise durch. Oder schauen Sie sich für Schleifen BOOST_FOREACH an. Macht es noch einfacher als C.
  • Vielen Dank für den Tipp zu std :: copy memcpy. Ich wusste das nicht '. Als Alexandrescu dies vor einigen Jahren behandelte, war dies nicht der Fall. Informationen zu C ++ – Iteratoren. Es geht hauptsächlich um die Philosophie, ich versuche zu programmieren, wie C ++ als Programm gedacht ist, sowohl für die Leute, mit denen ich arbeite, als auch um die Vorteile von C ++ – Funktionen zu nutzen. Es wurde hauptsächlich darauf hingewiesen, dass einige C ++ – Verbesserungen wie STL-Container nicht immer besser sind als die alte C-Methode.

Antwort

Wie bereits erwähnt, bietet C ++ den Vorteil großer Schultern, auf denen Sie stehen können (BOOST, STL usw.). Am Ende ist es eine persönliche Entscheidung, aber ich würde C ++ aufgrund der verfügbaren Ressourcen wählen. Wenn es in C ++ Funktionen gibt, die Sie nicht verwenden möchten, verwenden Sie sie nicht.

Kommentare

  • Beachten Sie, dass 99% von Kommerzielle und firmeninterne Spiele-Engines meiden Boost und STL aus verschiedenen Gründen (Leistungsgarantie, Debugbarkeit, Thread-Sicherheit, Kontrolle).
  • Und 99% der Statistiken sind erstellt.
  • Ich denke, es sollte eine Regel sein, alle Statistiken zu zitieren.

Antwort

I don “ Ich glaube nicht, dass heutzutage jemand ausschließlich C verwendet. Es wird normalerweise mit einer höheren Sprache gemischt.

Das Programmieren in C hat einige Vorteile gegenüber beispielsweise dem Programmieren in C ++. C ++ kann viele Dinge unter der Haube tun, die für den Benutzer unsichtbar sind, was die Leistung beeinträchtigen kann, wenn Sie nicht vorsichtig sind. C ++ kann auch schrecklich sein, wenn es darum geht Cache-Nutzung, die wiederum Ihre Leistung beeinträchtigen kann.

Es kann also einige Vorteile bringen, die leistungskritischen Teile eines Spiels auf C-ähnliche Weise und nicht auf herkömmliche C ++ – Weise zu schreiben Ich habe in den letzten Jahren noch nie von jemandem gehört, der tatsächlich ein ganzes Spiel in C geschrieben hat.

Auf einigen Plattformen, wie dem iPhone, kann die Verwendung von C ++ Ihre ausführbare Größe mit einem bestimmten Stück Kilobyte erhöhen (ich habe vergessen, wie viel, sorry), was ein Grund ist, warum einige iPhone-Entwickler ihren Code in einer Mischung aus C und Objective-C schreiben.

Antwort

Ich werde Ihnen noch ein paar Gründe nennen, warum es unvernünftig wäre, heute eine Spiel-Engine in C anstelle von C ++ zu schreiben: STL und BOOST.

Ich kann mir nicht vorstellen, wie es wäre Es lohnt sich, noch ein weiteres list -Impleme zu schreiben Wenn Sie sich auf Code verlassen können, der sofort funktioniert (und den Sie nicht schreiben müssen!)

Kommentare

  • Hat keine großes Studio tatsächlich Boost verwenden? Selbst die Verwendung von STL wird aufgrund der Portabilität noch diskutiert. Zumindest für Konsolen-Engines.
  • Persönlich verwende ich ' Boost.FunctionTypes für die c ++ / lua-Interaktion (siehe gamedev.net/reference/programming/features/CPPLuaExport/ … ) und die Boost-Zufallszahlenbibliothek für die einheitliche Zufallszahlengenerierung (für Partikelsysteme). Auch Boost.Foreach ist ordentlich. Übrigens, wen interessiert es, wenn große Studios BOOST nicht verwenden? Sie haben die Arbeitskräfte, um ihre eigenen STL-Bibliotheken von Grund auf neu zu schreiben. Ich weiß nicht, ' t

s ähnliche Bibliotheken auch für C.

  • Viele Leute verwenden Boost in Spielen, glaube ich. Aber ' ist für viele von uns weit entfernt von einer Anforderung (oder sogar wünschenswert).
  • Menschen, was Sie glauben , ist irrelevant : Entweder Sie wissen oder Sie wissen ' nicht .
  • Antwort

    Das Schreiben einer Spiel-Engine in C ist sinnvoll. Es ist schnell und kann auf mehrere Systeme portiert werden. Sie können es beispielsweise für Android (mit dem NDK) verwenden. Sie können es für das iPhone verwenden (Ziel c ist nur eine Erweiterung von c). Sie können es auch verwenden Wenn Sie sich mit c wohl fühlen, empfehlen wir Ihnen, es auszuprobieren!

    Antwort

    Natürlich ist es vernünftig. Ich persönlich würde es nicht tun, und die meisten C-Fans, die ich kenne, schreiben tatsächlich nur C-ähnlichen Code in CPP-Dateien. Aber die Sprachen sind ähnlich genug, wo es nicht wirklich wichtig ist.

    Was den Grund betrifft, warum sich jemand dafür entscheidet, denke ich, dass dies hauptsächlich auf die Anti-C ++ – Philosophie zurückzuführen ist. Ich persönlich glaube immer noch nicht, dass dies ein guter Grund ist, C anstelle von „C ++“ im C-Stil zu wählen. typedef struct craziness ist ein guter Grund, sich von C fernzuhalten, und es gibt eine Reihe anderer.

    Leider sind C und C ++ beide ziemlich schreckliche Sprachen, wenn wir uns darauf konzentrieren. Dies ist einer der Gründe, warum die Leute in den letzten Jahren versucht haben, einen Großteil ihres Codes in Skripten zu schreiben.

    Wenn Sie nach Beispielen für Personen suchen, die in C arbeiten, können Sie die ID ignorieren, da ich mich daran erinnere, dass sie C vor langer Zeit verlassen haben. Cryptic Studios (Star Trek Online) führt die gesamte Motorenentwicklung in C durch. Soweit ich das beurteilen kann, liegt es mehr an der Philosophie als an einem greifbaren Vorteil.

    Antwort

    Ja und nein. Ja, ich habe es vor ein paar Jahren getan, aber ich brauchte mein Spiel, um in 3D auf einem 64-Bit-Remote-Server unter Unix (nicht unter Linux) mit den Spielern auf dummen Terminals zu laufen. Es war nicht trivial. C kann nett sein, ist Sie möchten LUA integrieren, aber ich habe schließlich lua dazu gebracht, in C ++ zu arbeiten, also würde ich sagen, ja, es ist möglich, aber tun Sie es nicht.

    Antwort

    Kann eine mögliche gute Antwort“ beides verwenden „sein?

    Als ich hörte, dass panda3d-Projekte optimiert werden könnten, würde der Engpass entweder mit Cython beseitigt oder diese Teile neu codiert.

    Meistens sind die Teile, die optimiert werden müssen, Teile mit vielen Iterationen und Verschachtelungen oder mit viel numerischem Rechnen. Meine (wilde) Vermutung ist also, dass ein fairer Kompromiss darin besteht, beide Sprachen zu verwenden Verwenden Sie C für Teile, die viel Low-Level-Programmierung enthalten, sodass Sie keine ausführen können y Missbrauch der C ++ – Sprache für den Teil, der Geschwindigkeit benötigt, und C ++ für den Rest des Spiels.

    Idealerweise erledigen Sie den schnellen Teil der Engine unter Berücksichtigung des hohen Niveaus und verwenden dann a Skriptsprache oder C ++, die viel weniger Nest / Loops verwenden.

    Natürlich könnten Sie niemals eine solche Engine erstellen, die zu allen Spielen passt, die Entwickler benötigen würden, es sei denn, Sie widmen Ihre Engine einem speziellen Art von Spiel …

    Aber nimm meinen Rat nicht als selbstverständlich an, da ich weder ein erfahrener Spieleentwickler noch ein erfahrener Entwickler bin … Ich denke, C zwingt dich, beim Schreiben schnellen Code zu schreiben Guter und schneller C ++ – Code für ein Projekt, das so groß wie ein Spiel ist, ist etwas anderes …

    Antwort

    C hat funktioniert John Carmack , wenn Sie C verwenden, erhalten Sie möglicherweise viele Vorteile, aber bis Sie dort ankommen, um davon zu profitieren, kann es eine Weile dauern.

    Hier finden Sie eine Liste der Spiel-Engines Wenn sie in C geschrieben sind, können Sie vielleicht einige Einblicke in die Ausführung einer C-Game-Engine erhalten, indem Sie ihren Quellcode durchgehen.

    Antwort

    C-Code ist normalerweise gültiger C ++ – Code.

    Die Hauptprobleme bei C ++ sind die falsche Verwendung ( Linus Torvalds hassen ihn aus diesem Grund , er hatte auch einige andere Probleme mit der Portabilität von Bibliotheken und so weiter. Er arbeitet auf Betriebssystemebene und muss in der Lage sein, Dinge auf jedem zufälligen Chip da draußen auszuführen.

    Zum Beispiel Die Verwendung eines cstyle-Arrays [] gegenüber einem c ++ std :: vector <> (oder einem ähnlichen Container) hat fast keinen Vorteil.

    Die Vektoren sind typsicher und können auf Grenzen überprüft werden (Sie können mit get () oder [] auf Elemente zugreifen, auch wenn Sie die Array-Checked-Methode nicht verwenden, können Sie die Größe dennoch abfragen, anstatt sie mit dem Zeiger zu verschieben).

    Aber Vektoren können langsamer sein, wenn Sie beispielsweise nicht die Standardgröße in der deklarieren Konstrukteur. Das Hinzufügen von Elementen zu einem Vektor kann zu Verlangsamungen führen, wenn dann eine Größenänderung erforderlich ist. C ++ 11 bietet auch viele Vorteile, z. B. eine einheitliche Initialisierung (Sie können jetzt Vektoren mit derselben Syntax deklarieren und initialisieren), und es gibt Verschiebungskonstruktoren, mit denen Sie das Kopieren vermeiden können. Sie können sogar Ihre eigenen benutzerdefinierten Initialisierer erstellen (wenn Sie aus irgendeinem Grund etwas anderes als malloc verwenden möchten).

    Oder natürlich, wenn Sie die Größe ändern müssen, sind Vektoren immer noch einfacher zu handhaben Sie müssen nicht mit malloc herumspielen, Dinge manuell kopieren und so weiter.

    C ++ bietet Ihnen objektorientierten Code. Beim Kompilieren wird es genauso effizient sein, da es wirklich gerecht ist Eine Abstraktion für Menschen, die mit dem Code arbeiten. Obwohl Dinge wie Konstruktoren die Objekterstellung verlangsamen können. Sie benötigen jedoch entweder den Konstruktor, um die Standardwerte festzulegen, oder Sie können Objekte auf andere Weise initialisieren, ohne den Konstruktor zu verwenden (indem Sie die () „s weglassen ).

    Aber die Objektorientierung erleichtert das Programmieren von Spielen viel . Spiele beschäftigen sich oft mit Objekten.

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.