Mit C ++ um die Programmierung von Spielen konkurrieren

21

Ich bin gespannt, warum C ++ für die Spieleentwicklung so beliebt ist und nicht für andere Sprachen. Ich weiß, dass Sie damit sehr schnellen Code erstellen können, aber was genau macht ihn so beliebt?

Ist es nur, weil es schnell ist? Ist es ein anderes Merkmal in der Sprache, wie das OO-Paradigma oder die Portabilität? Liegt es an all den Bibliotheken, die im Laufe der Zeit erstellt wurden? Oder eine Kombination all dieser (und anderer) Gründe?

Wenn mich jemand darüber informieren könnte, würde ich mich sehr freuen. :-)

KasMA1990
quelle
7
Geschwindigkeit ist für mich Grund genug, zumal die Beschwerden aller über die Sprache für mich keinen Sinn ergeben.
Benjamin Lindley
Eine schnelle Vermutung: Die meisten Spiele sind für Windows geschrieben. C- und C ++ - Sprachen wurden von Microsoft in hohem Maße unterstützt. Und schließlich wird C ++ wegen der OOP- und Template-Metaprogrammierung bevorzugt.
@Matt Danke, wusste nicht, dass es das gibt. Kann ich das Thema dorthin verschieben oder sollte ich dieses löschen und dort neu erstellen?
Dies wurde bereits mehrmals gefragt.
Zan Lynx
1
@Benjamin: Dann haben Sie vermutlich nicht genug in C ++ geschrieben oder nie eine ausdrucksstärkere Sprache wie Python (oder sogar C # mit LINQ) verwendet. Selbst wenn Sie aus irgendeinem verrückten Grund lieber 20 Zeilen Code für das schreiben, was viele andere Sprachen in 1 können, bedeutet die extrem schlechte Grammatik von C ++, dass die Kompilierung von Programmen erheblich länger dauert, als sie sollten, und geeignete IDE-Tools (Refactoring usw.). sind schwieriger, wenn nicht unmöglich zu schaffen.
BlueRaja - Danny Pflughoeft

Antworten:

29

Zahlreiche Gründe:

  • Großer Fehler, den Sie verpasst haben: Es ist portabel und vereinfacht die Anbindung Ihrer Game-Engine an iOS, XBOX, PS3 usw.
  • Es ist schnell
  • Alle SDKs unterstützen es von Haus aus
  • Viele Bibliotheken zur Verfügung
  • Jeder, der Spiele schreibt, weiß, dass es einfach ist, erfahrene Spieleentwickler für Ihr Team zu engagieren
  • Es ist trivial, eine Game-Engine-Skriptsprache wie Lua einzubetten

quelle
Okay, danke für deine Antworten, du hast alles abgedeckt, was ich brauchte, denke ich. :-)
KasMA1990
14

Es gibt ein paar Gründe, die ich zusätzlich zu @Graham erwähnen möchte.

  • Legacy-Code - Viele Studios haben viel C ++ - Code. Dies gilt auch für Bibliotheken.
  • C ++ ist wirklich ein Assembler auf hoher Ebene, der direkten Zugriff auf Hardware hat (so direkt Sie zumindest auf einem Betriebssystem ausgeführt werden können) und recht schnell ist. Wenn Sie möchten, können Sie in C ++ direkt in die Assemblersprache wechseln, um die Befehlsebene zu steuern (nicht, dass dies immer sinnvoll ist, es ist nur mit Java, C #, Python usw. nicht möglich).
  • DirectX und OpenGL unterstützen C ++ nativ, die meisten anderen Sprachen haben "Bindungen" zu den zugrunde liegenden Bibliotheken über Zwischenebenen, das heißt, sie sind nicht schnell oder können nicht viele der gleichen Dinge tun, aber es wird eine Ebene von Software dazwischen hinzugefügt dein Spiel und die Hardware.
  • Wie @Graham erwähnt, ist es vielen Programmierern bekannt, daher sind erfahrene Entwickler leicht zu finden und es ist auch ziemlich portabel im Vergleich zu C #, das auf dem .NET Framework steckt (es gibt Mono, aber es liegt im Allgemeinen eine Generation hinter der Implementierung von Microsoft zurück .)
Nate
quelle
Meinst du nicht Low-Level?
Jhocking
5
C ++ ist eine low-levelSprache; aber ein high-levelAssembler, IMO.
Nate
3
Ich stimme dir nicht zu. C ++ ist eine Hochsprache mit der eingebauten Funktion, auf C (eine Niedrigsprache) zurückzugreifen.
Foo
7
C ++ ist eine Hochsprache, ebenso wie C. Assembly ist eine Niedersprache. Jetzt ist C ++ höher als C, genauso wie C # höher als C ++ und Ruby / Python höher als C # sind.
AA Grapsas
4
Warum sollte Legacy-Code nicht mehr weiterentwickelt werden? "Legacy Code" bedeutet nur, dass es alt ist, nicht, dass es schlecht ist.
8

Rohe Geschwindigkeit ist der Hauptgrund, aber tatsächlich ist es keine Entweder-Oder-Entscheidung, so dass viele Spielefirmen beginnen, andere Sprachen für Teile des Spiels zu verwenden. Bestimmte Aufgaben erfordern, dass der Computer so schnell wie möglich arbeitet (z. B. Core-Rendering-Routinen), aber viele Aufgaben im Gameplay-Code müssen nicht so schnell ausgeführt werden (z. B. Öffnen der Tür, wenn der Spieler darauf klickt) Es ist klug, für diese Teile eine viel einfachere Sprache zu verwenden (und damit schneller Programme in dieser Sprache zu schreiben). Aus diesem Grund sind viele Spiele-Engines in C ++ geschrieben, enthalten jedoch eine Skriptsprache wie Lua zum Schreiben von Gameplay-Code.

Das Schwierige ist, dass bei der Auswahl der Programmiersprachen ein Kompromiss zwischen der Effizienz des Computers und der Effizienz des Programmierers besteht. Das heißt, was ist für Sie wichtiger, wie schnell der Computer den Code ausführt oder wie schnell der Programmierer den Code schreibt?

schockierend
quelle
3

In C ++ können Sie lokale Variablen zuweisen, die nach dem Ende der Funktion verschwinden. In der Regel werden diese auf einem Stapel zugeordnet.

Die Stapelvariablen tragen nicht zu den dynamischen Speicherzuordnungsproblemen bei, die Fragmentierung und Overhead betreffen. Das Zuweisen von Raum auf dem Stapel ist schnell und einfach (nur Anpassen eines Zeigers). Bei der dynamischen Speicherzuweisung wird normalerweise in einem Container nach einem geeigneten Speicherblock gesucht, der Speicher markiert und dann als belegt markiert. Bei der Freigabe wird der Speicherblock einem Container hinzugefügt und möglicherweise mit vorhandenen Blöcken zusammengeführt. Viel mehr Aufwand als nur das Ändern eines Zeigers.

Java und C # ordnen den Speicher dynamisch zu, mit Ausnahme von primitiven Typen. Diese Sprachen hängen von einer Laufzeitumgebung ab, die eine zu löschende Variable markiert und dann in zufälligen (ungeplanten) Intervallen einen Garbage Collector ausführt, um den Speicher freizugeben. Im Allgemeinen hat der Programmierer keine Kontrolle darüber, wann die Variable zum Löschen markiert oder wann sie zurückgefordert wird (die Rückgewinnung von verwendetem Speicher ist ein fortgeschrittenes Thema, das die meisten C ++ - und Java-Programmierer nicht kennen).

Die Geschwindigkeit von C ++ beruht hauptsächlich auf der direkten Übersetzung in ausführbaren Code. Java und C # werden zu einem Zwischencode kompiliert, der dann von einer virtuellen Maschine interpretiert wird. Im Allgemeinen sind interpretierende Sprachen langsamer als direkt übersetzte Sprachen.

Thomas Matthews
quelle
1
-1 (wenn ich könnte) - lokale Grundelemente werden auf dem Stapel sowohl in Java als auch in C # zugewiesen, und in C # können Sie einen Stapel mit zugewiesenen Elementen erstellen structs. Mehr zu dem Punkt, der extrem extrem diese Netze geringe Erhöhung der Geschwindigkeit , die Sie nicht ist fast genug , um eine Sprache über die andere zu rechtfertigen. Der wahre Grund wird von @Graham Perks angegeben: Es ist das, was Spieleentwickler wissen müssen, also ist es das, was neue Spieleentwickler lernen und wofür neue SDKs gedacht sind. Es gibt viele Sprachen (ex. Go) , die genauso schnell oder schneller, und nicht annähernd so unbequem zu schreiben für.
BlueRaja - Danny Pflughoeft
C ++ ist bei der Stapelzuweisung nicht sehr gut; Tatsächlich ist es sehr schwierig, STL-kompatible Objekte auf dem Stapel zuzuweisen. ZB war die letzte große Engine, an der ich gearbeitet habe, in C, und wir hatten eine Zeichenfolge, die Sie mit einer festgelegten Größe (normalerweise 1 KB) auf dem Stapel starten konnten. Wenn es vorbei war, bewegte es sich transparent auf den Haufen. Sie können mit benutzerdefinierten Zuweisern für std :: string in C ++ einige ähnliche Aktionen ausführen, aber der Code ist viel schwieriger zu finden.
1
@ Joe Wreschnig: C ++ eignet sich hervorragend für die Stapelzuweisung. Erstellen Sie einfach eine Assembler-Liste. Die meisten Compiler-Anbieter weisen dem Stapel jedoch keine große Menge an Speicher zu. Ein allgemeines Verständnis erfahrener C ++ - Programmierer ist, dass riesige Objekte dynamisch zugewiesen werden (Heap), nicht lokaler Speicher (Stack). Auf einigen Plattformen können riesige Objekte auf dem Stapel in den Haufen geraten, wenn der Stapel und der Haufen aufeinander zuwachsen.
Thomas Matthews
1
Ein allgemeines Verständnis erfahrener C ++ - Programmierer, insbesondere von Spielekonsolen, ist, dass alles, was den Stapel nicht überläuft, einem Stapel zugewiesen oder vorbelegt wird. C macht dies einfach, da der Allokator nicht zum Strukturtyp des Objekts gehört. Dies macht es auch möglich, etwas falsch freizugeben, aber meiner Erfahrung nach ist dies ein seltenes Problem im Vergleich zu jemandem, der stdlib-kompatible Allokator-Implementierungen / Kompatibilität vermasselt. Es gibt auch einige Tricks mit Platzierung neu, aber das ist nochmal komplizierter als das Äquivalent in C.
2
Nein. Der Geschwindigkeitsvorteil von C ++ beruht auf der Möglichkeit, Ihren eigenen benutzerdefinierten Speichermanager für die Heap- Zuweisung zu verwenden. Jede vernünftige Sprache ordnet die Einheimischen auf Stapel zu.
Nevermind
3

Spiele wurden früher in Maschinensprache geschrieben, weil es exotische Hardware gab, für die es keinen Compiler gab. Der Hardware fehlten auch Funktionen, die C-Programmierer für selbstverständlich halten, wie z. B. eine effiziente 16-Bit-Ganzzahl-Mathematik.

Sobald sich die Spiele mit vertrauter Hardware abgefunden hatten, wurden C-Compiler verfügbar und in kurzer Zeit wurden alle Spiele in C geschrieben.

C ++ schien auf einmal eine gute Idee zu sein, und die meisten Spiele sind heute C ++, aber die Ingenieure murmeln jetzt über eine Rückkehr zu C, und das könnte tatsächlich passieren. Ich würde gerne an einem Spiel in C arbeiten, und viele Kollegen auch. Es gibt keine neue Funktion in C ++, die meiner Meinung nach die Spiele verbessert.

Es scheint, dass Computer 1000-mal schneller sind als noch vor einigen Jahren. Eine Hochsprache würde die Entwicklungszeit ($) verkürzen und C obsolet machen.

Dies ist nicht geschehen, weil Spielekäufer wissen, dass die Hardware 1000x besser ist, und ihre Dollars für ein Spiel eintauschen möchten, das 1000x besser aussieht und sich so anhört. Dies beseitigt die Lücke aus dem System, die eine Hochsprache verbrauchen würde.

Leistungsanforderungen in Spielen sind brutal. Ein neuer Grafikrahmen muss unbedingt in weniger als 33 ms (oder 16 ms!) Gerendert werden. Alles, was die Hardware tut, muss berücksichtigt werden, damit dieses Budget eingehalten werden kann. Jede Sprache, die ausfällt und etwas mit der Hardware macht, die der Programmierer nicht versteht oder erwartet, wird es sehr schwer machen, dieses Budget zu erreichen. Dies ist ein automatisches Minus gegen alles Hohe.

Spielprogrammierer arbeiten nicht nur in einer einfachen Sprache, sondern meiden auch komplexe Datenstrukturen und Algorithmen. Spiele haben normalerweise keine verknüpften Listen und selten Bäume. Es gibt eine Tendenz, Zeiger zu vermeiden, wann immer dies möglich ist *. Jeder Algorithmus mit mehr als O (N) Zeit oder O (1) Raum findet in der Regel keine breite Anwendung.

* Wenn ein Zeiger keinen Cache-Fehler verursacht, warum dann 32 Bit ausgeben, um ihn zu speichern? Wenn ein Zeiger einen Cache-Fehler verursacht, sollten Sie diesen Cache-Fehler am besten beseitigen.

bmcnett
quelle
1
"Es gibt keine neue Funktion in C ++, die meiner Meinung nach die Spiele verbessert." LOL? OOP? Eine Klasse humanmit Derivaten playerund enemy?
Orlp
2
@ nightcracker: Basic is-a-Vererbung funktioniert in C einwandfrei; Die von Ihnen beschriebene Beziehung wird aus Gründen der Leistung und Sauberkeit ohnehin besser mit has-a umgesetzt.
3
Es besteht ein wachsender Konsens darüber, dass die OOP-Funktionen von C ++ nicht für Spiele geeignet sind, da diese Funktionen von Annahmen ausgehen, die sich negativ auf die Cache-Leistung auswirken.
bmcnett
Selbst wenn Sie der Meinung sind, dass C ++ keine Vorteile gegenüber C bietet, sollten Sie sicher erkennen, dass eine Rückkehr zu C auch keine Vorteile gegenüber C ++ bietet.
Dan Olson
@Dan Eine Rückkehr zu C bietet den Vorteil, dass "Best Practices" wie das Nichtverwenden von Vorlagen oder OOP durch Fehler bei der Kompilierung erzwungen werden, anstatt Junior-Programmierer mit einem Stock zu verfolgen. Auch da die Sprache vermutlich einfacher ist, ist die Compiler- und Debuggerwartung auch billiger.
bmcnett
3

Jede Programmiersprache hat Stärken und Schwächen in einer Reihe von Faktoren. Beispiele für diese Faktoren sind:

  • Geschwindigkeit auf einer bestimmten Plattform
  • Speichernutzung auf einer bestimmten Plattform
  • Welche Funktionalität es leichter verfügbar macht
  • Auf welchen Plattformen existiert es?
  • Welche Überlegungen muss ein Programmierer berücksichtigen?

Einer der wichtigsten Faktoren, die einem Spielprogrammierer am Herzen liegen, ist die Leistung. Sie möchten ein interaktives Erlebnis erzeugen, das heißt, es muss reaktiv sein und so viele nützliche (oder interessante) Daten wie möglich ausgeben können. Sie möchten jederzeit wissen, wie viel Gesundheit Sie haben und möchten nicht darauf warten. Und wenn Sie auf eine Schaltfläche klicken, können Sie davon ausgehen, dass eine Waffe abgefeuert wird oder Ihr Charakter springt, wenn Sie dies sagen. Eine kleine Verzögerung kann diese Interaktivität beeinträchtigen, sodass Sie Leistung benötigen.

Ein weiterer wichtiger Faktor ist, lieber in der Sprache des Problems zu programmieren, als in der Sprache der Implementierung. Ein Spielprogrammierer möchte sich mit Menschen, Orks und Rennwagen befassen, nicht mit dem Speicherregister ED0. Sie möchten weiterhin die Möglichkeit haben, in die Implementierungsdetails einzutauchen, wenn sie Leistung benötigen, aber es wäre großartig, wenn sie sich größtenteils mit der Ebene der Entitäten in ihrer Spielwelt befassen könnten. Sie müssen sich genug Sorgen machen, um die Spielwelt zu simulieren, ohne sich immer darum kümmern zu müssen, wie eine verknüpfte Liste funktioniert.

C ++ passt sehr gut zu diesen beiden Hauptfaktoren. Sie können die Leistungsvorteile von Assembly- oder C-Code mit der Ausdruckskraft von Objekten nutzen. Vergleichen Sie mit einigen anderen Sprachoptionen, um zu sehen, warum dies für Spiele geeignet ist:

  • Montage: Das ist rohe Kraft. Was Sie schreiben, ist im Grunde das, was die CPU tut. Aber in jeder Phase müssen Sie wissen, was mit Registern und den Auswirkungen davon los ist, und es sieht nie wie die Entitäten in Ihrer Spielwelt aus. Der Programmierer muss die mentale Entsprechung dessen herstellen, was sein Code im Vergleich zu dem, was im Spiel passiert, tut. Dies kann ein ziemlicher mentaler Aufwand sein.
  • C: Hier haben wir gute Leistungen, aber wir können die Erfahrung von Gurus nutzen, um Standardaufgaben zu erledigen (z. B. Speicher zuweisen, Zeichenfolgen bearbeiten und mathematische Standardfunktionen verwenden). Wir nähern uns hier der Ausdruckskraft, aber die Sprache zwingt Sie mehr oder weniger dazu, sich auf die Implementierung zu konzentrieren, da Sie wirklich nur mit normalen Datentypen arbeiten können. Alles ist wirklich ein Char, ein Int oder ähnliches. Strukturen, Zeiger und Arrays können Dinge zusammenhalten, müssen aber noch über die Interna nachdenken.
  • Java: Wir springen über C ++ und kommen zu Java. Java entfernt sich weiter von Implementierungsdetails. Tatsächlich haben Sie die meiste Zeit keinen Zugang zu den unteren Ebenen. Java abstrahiert viele Implementierungsdetails (z. B. welche CPU oder welches Betriebssystem Sie verwenden) aus dem Grund, dass es plattformübergreifend sein möchte. Sie können nicht auf die Details zugreifen, da diese nicht vorhanden sind. Sie programmieren nicht für den Computer, sondern für die Plattform (die Java-Plattform, die auf den meisten Computern vorhanden ist). Darüber hinaus hat Java eine wohl bessere Sprache für den Umgang mit der Sprache des Problems als C ++. Der Kompromiss ist, dass Sie nicht für einen bestimmten Computer optimieren können. Ob dies einen praktischen Unterschied ausmacht oder nicht, hängt von den Besonderheiten des Programms und des Computers ab.
  • Spieleskriptsprache: Damit meine ich etwas wie UnrealScript oder benutzerdefinierte Skriptsprachen, die auf einer Game-Engine gespeichert sind. In diesen haben Sie keinen Zugriff auf die zugrunde liegende Engine. Sie delegieren Leistungsüberlegungen an die Engine, sodass Sie sich um die Erstellung eines Spiels kümmern können. Es ist einfacher, das Spiel zu schreiben, und schwieriger, die Leistung selbst zu optimieren.
  • Haskell (oder Ihre obskure Lieblingssprache): Jede Programmiersprache von Turing-complete entspricht jeder anderen. So , während Sie können jedes Programm in jeder Sprache schreiben, stellen Sie Vor- und Nachteile, einige Ziel, einige subjektiv. Eine Sprache wie Haskell konzentriert sich mehr auf mathematisches Arbeiten. Die Probleme, auf die es ausgerichtet ist, sind etwas anders als bei Spielen. Es bedeutet nicht, dass es nicht für Spiele verwendet werden kann oder sollte, es ist einfach nicht einfach dafür geeignet.

Der letzte Punkt ist, dass ein Teil davon historisch und politisch ist. Viele Flammenkriege wurden zwischen den verschiedenen Programmiersprachen geführt. C # zum Beispiel ist möglicherweise genauso gut für die Spieleentwicklung geeignet, wurde jedoch nach C ++ entwickelt. Oder die Leute mögen das nicht, es ist von Microsoft. Einige Leute sind auf C # umgestiegen, andere nicht. Einige Leute programmieren immer noch Spiele in BASIC, Pascal und C. Was auch immer Programmierer mögen, sie bleiben dabei. Spieleprogrammierer haben sich mit C ++ größtenteils wohlgefühlt, möglicherweise weil sie mit C und C ++ aufgewachsen sind und es ihren Bedürfnissen entsprach. Wenn die Computerindustrie in einem Zustand ist, in dem die Leistung und Akzeptanz von Java genügend Menschen zufriedenstellt, dann wäre Java möglicherweise die de facto Standardsprache für die Spieleentwicklung.

BrettW
quelle
2

Vermächtnis und Dynamik.

Es war einmal ein Zeitcode in Assembler für die ultimative Leistung geschrieben. Als die Rechenleistung zunahm, wurden kompilierte Sprachen praktikabler, und C bot den besten Kompromiss zwischen Leistung und Produktivität. Auf einer sehr einfachen Ebene war es kaum mehr als ein Makro-Assembler.

C ++ war nur der natürliche Nachfolger von C. Sie werfen keinen früheren Code oder Wissen weg und haben dennoch das Potenzial, in neue Methoden zu expandieren. C ++ ist letztendlich sehr flexibel, und ich habe noch kein Designparadigma gesehen, das nicht zumindest in C ++ simuliert werden kann, während es in der Lage ist, nahezu die vollständige Kontrolle über die Leistung zu behalten.

Simon Lacey
quelle
2

Wenn Sie für die Konsolen entwickeln, haben Sie keine andere Wahl: Die professionellen SDKs sind nur in C ++ erhältlich. Normalerweise haben sie auch Zugriff auf die meisten Dinge.

Da es sich bei vielen Entwicklern um Konsolen + PCs handelt, ist es sinnvoll, die gesamte PC-Arbeit in derselben Sprache zu erledigen und die Technologie direkt gemeinsam zu nutzen.

Da hier die Pro-Industrie lebt und die meisten daran teilnehmen möchten, sind die meisten Spieleprogrammierer C ++ - Programmierer.

Weil all dies passiert, sind die meisten Motorenentwickler auch C ++ - Entwickler. Wenn Sie also professionelle Motoren evaluieren, werden fast alle Ihre Entscheidungen C ++ sein.

Es ist alles ein großer selbsttragender Motor. Eine Störung würde mehr erfordern als nur technischen Fortschritt.

Chris Subagio
quelle
2

FWIW: C # wird für die Spieleentwicklung immer beliebter. Siehe Miguel de Icazas Blogbeitrag . Sehr interessant zu lesen, IMHO.


quelle
2
Wie üblich pusht Miguel seine bevorzugten (normalerweise marginalen) Technologien und ignoriert dabei die Art und Weise, in der C # tatsächlich zu einem großen Player in der Branche geworden ist, z. B. XNA.
2

Obwohl ich ziemlich stark gegen C, C & C ++ bin, ist das Einzige, was sie haben, dass nur wenige andere Sprachen die vollständige Kontrolle über die Plattform haben, auf der sie ausgeführt werden, Sie können sicher sein, dass genau das passiert, nein GC, keine Störungen.

Dies ist heutzutage nicht so wichtig, kann aber für Plattformen mit geringer Leistung gelten.

Auf PC / Mac / Linux ist es wahrscheinlich die am wenigsten tragbare Sprache, die Sie heutzutage antreffen, und der Geschwindigkeitsbonus macht keinen großen Unterschied mehr - Minecraft (Java) ist flüssig und funktioniert auf ziemlich minimalen Plattformen (und jedem Betriebssystem). mit einer einzigen ausführbaren Datei - Ich habe noch keine leistungsschwache indi C / C ++ - App mit so viel Funktionalität und so wenig Fehlern gesehen, geschweige denn mit drei Plattformen.

An diesem Punkt würde ich sagen, dass das meiste davon Trägheit und die Vorstellung ist, dass echte Spiele immer in C / C ++ ausgeführt werden, obwohl die Fähigkeit zum "Portieren" auf iPhone und Konsolen von Bedeutung ist (auch wenn ich mir ziemlich sicher bin, dass es die meisten sind) der Benutzeroberfläche von Spielen ist mit viel Aufwand zu portieren (außer zwischen Windows und XBox).

Bill K
quelle
1
Oh, ich weiß nicht, ob es nur für "unterlastete" Plattformen wichtig ist. Die andere Sichtweise ist, dass Spiele auf jeder Plattform immer an der Spitze der Leistung stehen: Jede neue Leistung wird sofort verschlungen. Wenn es um professionelle Spieleentwicklung geht, ist die Leistung so ziemlich das Hauptanliegen: Sie schreiben nicht Unreal, ohne jeden einzelnen Zyklus, den die Maschine zu bieten hat, zu maximieren. Jeden; Single; Zyklus. Auf jeder Ebene, von der Grafik-Engine und dem Festplattenzugriff bis zu Ihrer UI-Schleife.
Chris Subagio
@ Chris: Ich habe festgestellt, dass Spiele eine Domäne sind, in der Geschwindigkeit ein Wettbewerbsvorteil ist. Wenn Ihre Textverarbeitung in 5 Sekunden gestartet wird, wobei MS Word 10 benötigt, oder in 0,1 Sekunden neu gestartet wird, wobei Word 0,2 benötigt, ist dies wertlos. Aber wenn Ihr Spiel noch 10% mehr Fragmente herauspumpt oder noch einen detaillierteren Charakter zeigt, kann dies ein enormer Wettbewerbsvorteil sein.
Wäre es dann nicht dumm, jemals etwas anderes als Assembler zu programmieren? Es wäre sicherlich mindestens 10% schneller. Es gibt einen Punkt, an dem Sie die Leistung in Abrede stellen müssen, um Wartbarkeit und Entwicklungsgeschwindigkeit zu gewährleisten. Im Allgemeinen ist dieser Punkt heutzutage C ++. Es wäre schön, wenn die Fähigkeit, plattformübergreifend wie Minecraft zu fahren, mehr Gewicht hätte.
Bill K
Ah, aber es ist ein Trugschluss, dass das Codieren in Assemblern schneller ist: Aktuelle Chips sind so komplex, dass es für einen Programmierer schwierig ist, einen Compiler konsistent zu übertreffen. Nur in eingeschränkteren Bereichen wie SPUs auf der PS3, inneren Physikschleifen und Shadern auf GPUs gibt es noch klare Vorteile. C ++ ist derzeit in der Tat der Sweet Spot, mit dem Vorbehalt, dass OOP nicht immer die beste Wahl ist: Die laufende Diskussion zwischen Struktur von Arrays und Array von Strukturen ist nicht gerade eine Sprachdiskussion, aber C ++ führt Sie natürlich zu AoS. Manchmal ... du willst wirklich nur C.
Chris Subagio
Die Effizienzsteigerung der Programmierer zwischen Assembler und C / C ++ ist ebenfalls um eine Größenordnung höher als die Effizienzsteigerung der Programmierer zwischen C und C ++ oder C ++ und C # / Java. Fred Brooks wies vor 25 Jahren darauf hin.