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. :-)
Antworten:
Zahlreiche Gründe:
quelle
Es gibt ein paar Gründe, die ich zusätzlich zu @Graham erwähnen möchte.
quelle
low-level
Sprache; aber einhigh-level
Assembler, IMO.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?
quelle
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.
quelle
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.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.
quelle
human
mit Derivatenplayer
undenemy
?Jede Programmiersprache hat Stärken und Schwächen in einer Reihe von Faktoren. Beispiele für diese Faktoren sind:
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:
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.
quelle
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.
quelle
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.
quelle
FWIW: C # wird für die Spieleentwicklung immer beliebter. Siehe Miguel de Icazas Blogbeitrag . Sehr interessant zu lesen, IMHO.
quelle
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).
quelle