Warum wird C / C ++ für Spieleentwickler bevorzugt?


14

Einige Leute sagen, dass es Entwicklern mehr Kontrolle bietet, aber was genau kann durch C ++ gesteuert werden, das nicht zum Beispiel mit Java gesteuert werden kann?

Antworten:


21

Java wird in einer virtuellen Maschine ausgeführt, während C ++ direkt auf der Hardware ausgeführt wird. Dies bedeutet, dass Sie mehr Kontrolle darüber haben, wohin Ihr Speicher verschoben wird und was in C ++ damit gemacht wird.

Java ist eine müllsammelnde Sprache. Sie haben keine direkte Kontrolle über Ihr Gedächtnis. Sie können neue Speicherbereiche zuweisen, haben jedoch keine (Fein-) Kontrolle darüber, wann diese gelöscht werden. Der Garbage Collector überprüft jeden Speicherbereich, den Sie alle x Frames zugewiesen haben, und ermittelt, ob es sich um Müll handelt oder noch verwendet wird.

Für Spiele kann dies katastrophal sein. Alle paar Frames kommt ein Garbage Collector, um jede einzelne Zuordnung zu überprüfen, die Sie vorgenommen haben, um festzustellen, ob sie noch verwendet wird. Sprechen Sie über eine Verlangsamung!

Zweitens wurden die meisten Bibliotheken, die wir verwenden, entweder in C oder in C ++ geschrieben. Ich spreche von Scaleform, Havok Physics Engine, PhysX, SpeedTree usw. Alle professionellen Pakete, die in der Branche häufig verwendet werden. Wenn eine andere Sprache König sein will, unterstützt sie diese besser.

Ich persönlich bin der Meinung, dass Java für Desktop-Anwendungen und -Apps sehr gut ist, aber nicht für Spiele. Java hat viele nützliche Tools für Entwickler und kann theoretisch auf jeder Plattform ausgeführt werden, auf der Java Virtual Machine implementiert ist. Ich bevorzuge jedoch C ++, da ich diese Kontrolle über meinen Arbeitsspeicher benötige . Insbesondere wenn Sie mit exotischen Datenstrukturen (rot-schwarzer Baum, doppelt verknüpfte Liste usw.) arbeiten, ist es hilfreich, einen guten Überblick über alle Ihre Speicherzuordnungen zu behalten.

Ich sage nicht: benutze kein Java. Ich sage: Überlegen Sie, warum Sie Java verwenden. Minecraft wurde in Java erstellt, daher ist es sicherlich möglich, Spiele in Java zu erstellen. Aber wäre es ein besseres Spiel gewesen, wenn es in C ++ gebaut worden wäre? Nun, es wäre sicherlich nicht so billig gewesen, es unter den großen drei Betriebssystemen (Windows, MacOS, Linux) zum Laufen zu bringen, aber dennoch stieß es auf viele plattformspezifische Fehler in seiner Entwicklung, Fehler, die Java nicht beseitigen konnte Über.

Es gibt jetzt Unmengen von C ++ - Frameworks für Programmieranfänger. Es gibt wirklich keine Entschuldigung, es nicht zu lernen, besonders wenn Sie Ihre Karriere in der Branche vorantreiben möchten.


1
Nur ein Trottel, aber in den meisten Betriebsumgebungen wird nativer Code in einer virtuellen Maschine ausgeführt. Java wird in einer virtuellen Maschine in einer virtuellen Maschine ausgeführt.
Skyler Saleh

1
@RTS: Es ist ein bisschen schwierig, op -> micro-op translation als virtuelle Maschine zu bezeichnen, wenn Sie das wollen.

Nein, ich habe über die virtuelle Maschine gesprochen, in die alle Anwendungen von modernen Betriebssystemen eingefügt werden, um sicheres Multitasking zu ermöglichen. Dies tritt auf Betriebssystemen auf, die auf Architekturen ohne Micro-Ops (RISC) ausgeführt werden. Dies umfasst den virtuellen Speicher, Software-Interrupts, Systeme für den gleichzeitigen Hardwarezugriff, den Betriebssystem-Scheduler und die Behandlung der Registerdatei.
Skyler Saleh

@ RTS Ich bin mir nicht sicher, ob die Aufgabenisolierung wirklich als VM qualifiziert ist. Es ist ein RM (Real Machine) mit einem gewissen Schutz. Es gibt keine offensichtliche Anweisungsabstraktionsschicht zwischen fetch / exec. Compiler und Linker generieren nach Bedarf umsetzbaren Code. Die CPU bietet Hardware-Unterstützung für einen Großteil davon - wodurch der "virtuelle" Aspekt beseitigt wird.
3Dave

2

Kurze Antwort: C ++ wird zu nativem Code kompiliert, sodass die Leistung dem Entwickler überlassen bleibt und nicht der Laufzeit oder der VM.

Lange Antwort:

C ++ "schneller" zu sein hat nichts mit C ++ zu tun. Momentan ist es eine der wenigen verfügbaren Sprachen, die von Tools unterstützt werden, die eigenständigen, nativen Code für mehrere Plattformen erstellen.

Früher konnten Sie C, C ++, BASIC / 2, Delphi usw. verwenden und effiziente, freistehende ausführbare Dateien erhalten. Die Wahl der Sprache war eine Frage der persönlichen Vorlieben und der Marktkräfte.

Heutzutage ist die Annahme, dass "C ++ schneller ist" im Wesentlichen eine sich selbst erfüllende Prophezeiung, obwohl LLVM in der Lage ist, dies zu ändern, da alles, was in den Parser einfließt, so wird, wie es einmal war.

Borland hatte es richtig gemacht: Mehrere Sprachen wurden analysiert, zuerst optimiert und dann an einen gemeinsamen Backend-Compiler und -Linker übergeben. Welches ist effektiv eine der wichtigsten Errungenschaften von LLVM.

Java ist so strukturiert, dass es ohne die JVM sehr schwierig zu implementieren wäre. Seltsamerweise wird angenommen, dass C # im Allgemeinen und fälschlicherweise in etwa Java entspricht und bereits auf mehreren Plattformen, einschließlich iOS, zu nativem Code kompiliert wird.

Oben auf meiner Weihnachtsliste? Eine Zeitmaschine, die es ermöglicht, C ++ Eigenschaften, echte Ausnahmebehandlung und tatsächlichen WORKING-Polymorphismus hinzuzufügen und den Syntaxfehler zu beseitigen, den der Parser selbst herausfinden kann. Ich habe für diese 10 Jahre einen Präprozessor geschrieben vor, weil es verdammt dumm ist.


Meinst du indirekten Mitgliederzugriff (wie in h-> x)? Wenn Sie dies entfernen, sind Handle- und Smart-Pointer-Typen weitaus weniger nützlich. Wenn Sie behaupten, es nur für rohe Zeiger zu ändern, haben Sie die Sprache nur weniger konsistent gemacht.
Lars Viklund

1
Was funktioniert am Polymorphismus von C ++ nicht?
Casey

@ LarsViklund ja, das meine ich. Obwohl die Operatoren address, dereference und member (&, *, ::, -> ...) unterschiedliche Bedeutungen haben, ist es meistens möglich, das Ergebnis drsjted aus dem Kontext abzuleiten. Die Dinge könnten von vornherein vereinfacht werden, wie dies auch in anderen Sprachen der Fall ist. Ein kleiner Knackpunkt, der jedoch die Codekomplexität (und damit die Entwicklungszeit und -kosten) erhöhen kann.
3Dave
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.