Zunächst möchte ich eine echte Antwort haben, ich versuche immer, mehr aus verschiedenen Quellen und Artikeln herauszuholen, und wenn ich Dinge wie C ++ lese, ist das langsam, weil es virtuelle Funktionen hat und weil C deshalb besser ist Ich weiß nicht, was ich als Mensch mit Gehirn sagen und denken soll. Vermeiden Sie es daher, diese Stufe in Ihren Antworten zu erreichen.
Meine Frage bezieht sich auf eine massive Umstellung auf C ++, die mehr oder weniger mit Doom 3 abgeschlossen wurde.
Das Interessante für mich ist, dass vor diesem Meilenstein die meisten Spiele-Engines und die Spiele selbst in C geschrieben waren, genau wie es seit der Quake-Ära war . Interessant ist auch, dass die ID-Software beschlossen hat, die Codebasis für IdTech 4 vollständig in C ++ umzuschreiben. Dies ist eine Menge Arbeit, die ich ehrlich gesagt ohne eine wirklich gute Liste von Gründen nicht verstehen kann.
Ich konzentriere mich auf Doom 3, weil ich mich hauptsächlich für die OpenGL-Welt interessiere und auf meiner Reise versuche ich, mich auf dieses Thema zu konzentrieren, also lese ich viel darüber, aber ich denke, dass eine solche Frage eine Render-API sein kann -Agnostiker ohne zu viele Probleme.
Warum ist die Branche zu einem bestimmten Zeitpunkt massiv auf C ++ umgestiegen? Was sind die Gründe für die Wahl, die ID gemacht hat?
Das Letzte, was ich sagen möchte, ist, dass die C-Sprache viel einfacher zu implementieren ist und eine geringere Anzahl von Funktionen bietet, da dies viel weniger Chancen hat, in Teile "fragmentiert" zu werden, als es C ++ wirklich oft tut. Im einfachsten Sinne habe ich viel mehr Chancen, einen wirklich guten C-Compiler zu finden als einen guten C ++ - Compiler, der alle Funktionen auf gute Weise implementiert hat.
Zum Beispiel hat das NDK für Android immer noch keine gute C ++ - Unterstützung (mit dem r8b-Release) mit den neuesten und besten Funktionen, und es ist das native Toolkit für das beliebteste mobile Betriebssystem der Welt!
Wenn ich meinen Code in einem modernen C ++ geschrieben hätte, würde ich jetzt wahrscheinlich Schmerzen haben, weil eines der beliebtesten Betriebssysteme der Welt für mich tabu wäre. Und wie Android sind viele andere Compiler nicht so toll.
Ich sollte C ++ - Code schreiben, der sich auf eine C ++ - Version bezieht, die 2-3 Jahre alt ist.
Antworten:
C ++ macht alles, was C macht. Sie können C und C ++ problemlos mischen, wenn die Vorteile von C die von C ++ überwiegen. Dies ist eine sehr absichtliche Entwurfsentscheidung von C ++.
C ++ macht Dinge, die C nicht tut. Dies beinhaltet einen einfachen Polymorphismus, aber auch eine einfache Generierung von Timecode über Vorlagen. Dies ist sehr praktisch für Dinge wie Container, die die größte Schwäche von C darstellen. Benutzerdefinierte zeigerähnliche Typen (Smart Handles), die viel Zeit sparen, sowie benutzerdefinierte primitivähnliche Typen wie Vektoren und Matrizen mit Operatorunterstützung sind ebenfalls möglich (dies spart auch viel Zeit).
Virtuelle Funktionen sind langsamer als nicht virtuelle Funktionen. Sie müssen sich jedoch für virtuelle Funktionen entscheiden, und ein kompetenter Programmierer tut dies nur, wenn sie von Vorteil sind. C-Programmierer haben Funktionszeiger und speichern häufig Auflistungen derer in Strukturen, auf die von anderen Strukturen verwiesen wird. Mit anderen Worten, sie müssen zusätzliche Arbeit leisten, um genau dasselbe wie virtuelle Funktionstabellen wiederherzustellen. In Fällen, in denen nur ein einziger Funktionszeiger benötigt wird und keine Tabelle erforderlich ist, lässt C ++ dies immer noch zu und entspricht C. Mit einem modernen Compiler ist C ++ nur in den speziellen Fällen langsamer als C, in denen sich der Programmierer für ein Feature entscheidet . Außerdem ist der Aufwand für virtuelle Funktionen in der Praxis bei Modem-CPUs sehr gering. Hardware ist heutzutage auf die Verwendungsmuster von C ++ ausgelegt und wird zunehmend auch auf die Bedürfnisse von hochinterpretierten Sprachen zugeschnitten.
C ++ - Ausnahmen verursachen in der Vergangenheit einen hohen Overhead, wodurch C ++ langsamer wird, selbst wenn Sie sie nicht verwenden. Ausnahmen waren eine schreckliche Sache, die man zu C ++ hinzufügen konnte, wenn auch aus keinem anderen Grund als der immensen Zunahme der Komplexität, die mit dem Schreiben von ausnahmesicherem Code verbunden ist, und tatsächlich ist es bei einigen Containerentwürfen buchstäblich unmöglich, Ausnahmen sicher zu machen. Spielprogrammierer ignorieren oft die Existenz von Ausnahmen und deaktivieren sie sogar auf dem Compiler. Moderne Compiler haben keine Overhead-Ausnahmen (dh Sie zahlen die Kosten nur, wenn Sie sie tatsächlich verwenden).
C ist einfacher zu lernen, alle Regeln von. C ++ ist eine sehr große, komplexe Sprache. C ++ ermöglicht das Schreiben von Code auf höherer Ebene, wodurch einfachere und einfachere APIs erstellt werden. Einige Leute möchten die Sprache leichter verstehen, andere möchten fortgeschrittenen Code leichter schreiben. Es ist ein Kompromiss zwischen der Einfachheit, zu verstehen, was der Compiler mit einem bestimmten Teil des Codes tut, und der Einfachheit, große komplexe, miteinander verbundene Anwendungen zu schreiben. Einige Leute schätzen eines aus verschiedenen Gründen viel mehr als das andere.
Am Ende ist C ++ eine Obermenge von C. Meiner Meinung nach gibt es keinen hochkompetenten C ++ - Programmierer, der auch kein passabler C-Programmierer ist (obwohl es viele C ++ - Programmierer gibt, die unter meine Latte fallen, die dies tun würden) in reinem C) verloren gehen. Während C ++ Funktionen hinzufügt, um den Programmierer von einem Großteil von C zu isolieren, muss nicht-trivialer C ++ - Code häufig C verwenden, um Dinge zu erledigen. Dies ist einer der Hauptunterschiede zwischen C ++ und Java und C #. Es gibt einen Grund, warum Sie oft sehen, dass "C / C ++" zusammengewürfelt ist.
Mein persönlicher Glaube - der mit den meisten anderen Fachleuten der Spielebranche geteilt wird, mit denen ich interagiert habe - ist, dass die verbesserte Ausdruckskraft und die hochwertigen Programmierfunktionen von C ++ die zunehmende Komplexität der Sprache gegenüber C überwiegen und die meisten anderen häufigen Anti-C ++ - Behauptungen sind mit der heutigen Technologie einfach veraltet.
quelle
Id Software ist nicht "die Industrie". Sie sind eine Firma. Obwohl sie einflussreich sein mögen, sind sie nicht jedermanns Sache.
Ich habe an einigen Game-Engines gearbeitet, die aus dem Jahr 1999 stammen, und sie verwendeten C ++.
Die Hauptgründe für die Einführung von C ++ "um diese Zeit" sind:
Es wurde standardisiert . C ++ 98 heißt so, weil es 1998 als ISO-Standard veröffentlicht wurde. Bis dahin gab es mehrere Dialekte von C ++ ohne klare Vorstellung, welche "real" oder "korrekt" waren. Sobald es standardisiert war und Compiler damit begannen, den Standard zu implementieren, konnten sich Spieleentwickler auf den tatsächlichen Standard verlassen.
Erinnern Sie sich an den alten Witz: Ein Mann geht in eine Arztpraxis und sagt: "Es tut weh, wenn ich meinen Arm so hebe." Also sagt der Arzt: "Heben Sie Ihren Arm nicht so hoch."
Wenn virtuelle Funktionen für Ihre Anforderungen langsam sind, werden Sie von C ++ nicht dazu gezwungen, sie zu verwenden. Alles in C ++ ist opt-in. Sie wählen die Verwendung der einzelnen Funktionen. Wenn Sie sich in leistungskritischem Code befinden und keinen virtuellen Overhead wünschen, verwenden Sie keine virtuellen Funktionen. Genau wie bei leistungskritischem Code in C werden keine Funktionszeiger verwendet.
In der Tat führte dies dazu, dass viele C ++ - Spiele kein idiomatisches C ++ waren (zumindest kein modernes idiomatisches C ++), sondern lediglich "C mit Klassen". Und dies ist eine perfekt funktionierende Möglichkeit, C ++ zu programmieren. Zum
typedef struct
Teufel, es ist ein Vorteil, wenn Sie beim Erstellen eines neuen Typs nicht tippen müssen .C ++ ist eine Fülle von Funktionen, und Sie können auswählen, welche Sie möchten.
Ihr Punkt ist? Google toleriert kaum Menschen, die NDK verwenden. Es ist klar, dass jeder Java verwenden soll. Der einzige Grund, warum NDK existiert, besteht darin, dass es bestimmte wichtige Entwickler gibt, die die Plattform ohne diese einfach nicht nutzen werden. Daher gibt es NDK, um sie und ihre Funktionsanforderungen zu bedienen.
Ja, C ++ ist eine umfangreichere und kompliziertere Spezifikation, die implementiert werden muss. So ist Java. So ist jede Sprache außer C.
Und was meinst du mit "den neuesten und besten Features"? Wenn es um C ++ 11 geht, implementiert das noch niemand vollständig. Die Spezifikation ist jetzt kaum ein Jahr alt. Ich weiß auch nicht, ob NDK C11 unterstützt. Ja, C hat auch "neueste und beste Funktionen", die nicht überall unterstützt werden.
Das bringt einen wichtigen Punkt auf den Punkt: Wenn Sie möchten, dass Ihre Pure-C-Anwendung in Visual Studio kompiliert wird, muss sie C89-konform sein und nichts Höheres. Es besteht also bereits eine Fragmentierung mit C. Einige Plattformen unterstützen nur C89. Einige unterstützen C99. Einige unterstützen C11 in unterschiedlichem Maße. Etc.
Wenn Sie C verwenden möchten, dann C verwenden . Die Tatsache, dass andere Leute diese Wahl nicht getroffen haben, bedeutet nicht, dass Ihre Wahl falsch ist oder dass ihre Wahl falsch ist. Sie müssen sich nicht vor ihnen rechtfertigen, und sie müssen sich nicht vor Ihnen rechtfertigen.
quelle
Es war für sie üblich, so ziemlich die gesamte Engine für jede Veröffentlichung neu zu schreiben (zumindest bis vor kurzem - ich weiß nicht viel über die letzten paar Spiele), und da C ++ immer beliebter wird, ist es sinnvoll, dies anstelle von Stick zu verwenden Mit der Zeit werden immer weniger Menschen mit C vertraut sein.
Weil es Ihnen viele Funktionen auf höherer Ebene bietet, während es fast vollständig abwärtskompatibel mit C-Code ist.
Google hätte dies für Sie beantwortet: http://fabiensanglard.net/doom3/interviews.php
"... die Hälfte der Programmierer hatte am Anfang wirklich C ++ - Hintergrund. Ich hatte C- und Objective-C-Hintergrund und bin irgendwie in C ++" hineingeschlüpft ", indem ich mir nur den Code angesehen habe, den die C ++ - Leute geschrieben haben. Im Nachhinein habe ich Ich wünschte, ich hätte die Zeit eingeplant, um die Sprache gründlich zu erforschen, bevor ich anfing, sie zu benutzen.
Möglicherweise können Sie immer noch feststellen, dass der Renderer-Code größtenteils in C entwickelt und dann sozusagen in C ++ gehäutet wurde.
Heute bin ich fest davon überzeugt, dass C ++ die richtige Sprache für große Projekte mit mehreren Entwicklern und kritischen Leistungsanforderungen ist und Tech 5 für das Doom 3-Erlebnis viel besser geeignet ist. "
Warum interessiert dich das? Sei nicht gefangen, wenn du das Neueste verfolgst. Wenn es vor 5 Jahren gut genug gewesen wäre, wäre es jetzt nicht plötzlich schlimmer geworden.
quelle
Nun, C ++ ist seit den 80er Jahren nicht mehr verfügbar. Wenn ein Compiler dies nicht unterstützt, sollten Sie möglicherweise einen anderen Compiler verwenden. Außerdem ist C ++ nicht viel langsamer als C. Es ist wirklich nur langsamer, wenn Sie es mit virtuellen Funktionen und anderen Abstraktionen laden. C ++ wird heutzutage jedoch häufig in der Nicht-Unix-Welt verwendet, da es flexibel ist und neuere Funktionen bietet, die C nicht bietet. Das Schreiben von modularem Code in C ++ ist viel einfacher als in C und hilft Ihnen, mehr portablen Code zu schreiben. Zurück zum Thema Compiler, ich kenne keinen Compiler, der C ++ nicht unterstützt (vielleicht nicht vollständig C ++ 11, aber jeder halbwegs vernünftige Compiler sollte C ++ unterstützen).
quelle