Warum sind nicht viele kommerzielle 3D-Videospiele (keine zufälligen Open-Source-2D-Videospiele) in Java geschrieben? Theoretisch macht es sehr viel Sinn: Sie erhalten eine Produktivitätssteigerung und eine plattformübergreifende Anwendung fast kostenlos, unter anderem wie die große Anzahl an Java-Bibliotheken und die integrierte Speicherbereinigung (obwohl ich zugeben muss, dass ich ' Ich bin mir nicht sicher, ob Letzteres eine gute Sache ist. Warum wird es selten verwendet? Ich kann mir nur ein paar beliebte kommerzielle Spiele vorstellen, die für die Java-Plattform geschrieben wurden.
Liegt es an der Leistung? Wenn ja, würde der größte Teil des schweren Hebens nicht von der GPU ausgeführt werden?
Antworten:
Die Welt der Spieleentwicklung ist lustig: Einerseits akzeptieren sie oft schnell neue Ideen, andererseits befinden sie sich noch in der Steinzeit.
Die Wahrheit ist, dass es selten so viele Anreize gibt, auf .NET / Java / etwas anderes als C / C ++ umzusteigen.
Die meisten Spielefirmen lizenzieren Teile der Spiele-Engine von anderen Firmen. Diese Teile sind in C ++ geschrieben, und obwohl Sie möglicherweise Zugriff auf die Quelle haben, um sie zu portieren, ist dies sehr aufwändig (und natürlich muss die Lizenz dies zulassen).
Außerdem ist in C ++ bereits viel Legacy-Code vorhanden. Wenn Code aus früheren Projekten wiederverwendet werden kann (z. B. wenn Sie eine Fortsetzung schreiben), ist dies umso wichtiger, wenn Sie sich an dieselbe Sprache halten, anstatt ihn in einer neuen Sprache neu zu schreiben (mehr, da Sie ihn wahrscheinlich wieder einführen werden) Eine Menge Fehler, die Sie zum Ausbügeln benötigen.
Schließlich ist es sowieso selten, dass Spiele in 100% C ++ geschrieben werden - es wird viel mit Skriptsprachen getan, egal ob sie benutzerdefiniert sind oder nur eine vorhandene Sprache integrieren (Lua ist heutzutage eine der beliebtesten).
Was die Speicherbereinigung betrifft, kann dies ein Problem sein. Das Problem ist nicht so sehr, dass es existiert, sondern vielmehr, wie es funktioniert - der Garbage Collector MUSS nicht blockieren (oder zumindest nur sehr kurz blockieren), da es einfach inakzeptabel ist, das Spiel 10 Sekunden lang einfrieren zu lassen Es durchsucht den gesamten zugewiesenen Speicher, um festzustellen, was freigegeben werden kann. Ich weiß, dass Java beim GC'ing dazu neigt, ziemlich zu ersticken, wenn fast der Speicher knapp wird (und bei einigen Spielen wird dies der Fall sein).
Sie sind auch etwas eingeschränkter in Ihren Möglichkeiten: Sie können die Hardware aufgrund des Overheads der Laufzeit nicht vollständig ausnutzen. Stellen Sie sich vor, Crysis wird in Java geschrieben ... selbst wenn dies der einzige sichtbare Unterschied ist, wäre es nicht der gleiche (ich bin mir auch ziemlich sicher, dass Sie einen Core i7 benötigen würden, um es auszuführen.).
Das bedeutet nicht, dass diese Sprachen nicht ihren Platz in der Spieleentwicklung haben - und nein, ich beziehe mich nicht nur auf die Tool-Programmierung. Für die meisten Spiele benötigen Sie nicht die zusätzliche Leistung, die Sie von C ++ erhalten, einschließlich 3D-Spielen. Wenn Sie alles von Grund auf neu schreiben, kann es durchaus sinnvoll sein, etwas wie XNA zu verwenden - tatsächlich gibt es eine gute Chance wird es.
Was kommerzielle Spiele betrifft - zählt RuneScape ? Das ist vielleicht das erfolgreichste Java-Spiel da draußen.
quelle
Ich denke, John Carmack sagte es am besten mit:
( Quelle )
Zugegeben, er sprach über mobile Plattformen, aber ich habe ähnliche Probleme mit Java als Ganzes gefunden, die aus einem C ++ - Hintergrund stammen. Ich vermisse es, Speicher auf dem Stapel / Heap zu meinen eigenen Bedingungen zuzuweisen.
quelle
Zum einen macht Javas mangelnde Überladung von Operatoren die gesamte Mathematik, mit der Sie sich befassen müssen, um eine funktionierende Grafik-Pipeline zu erhalten, sehr, sehr ärgerlich und schwer zu lesen.
Alle Matrixmultiplikations- und affinen Vektoren, mit denen Sie sich befassen müssen, sind viel einfacher zu verfolgen, wenn sie sich in wohlgeformten mathematischen Ausdrücken befinden und nicht in objektorientierten Ausdrücken wie
Das ist einfach schrecklich. Mathe sollte nicht so aussehen.
quelle
Ich denke, .NET hatte (hat) viele der gleichen wahrgenommenen Probleme wie Java. Microsoft hat gerade beim Marketing für Entwickler mit XNA bessere Arbeit geleistet :-)
quelle
Kleinere Punkte zuerst:
Jede Produktivitätssteigerung durch Java ist hypothetisch. Die Syntax ist fast identisch mit C ++, sodass Sie wirklich nur auf Einsparungen durch Speicherverwaltung und Standardbibliotheken setzen. Die Bibliotheken haben Spieleentwicklern wenig zu bieten, und die Speicherverwaltung ist aufgrund der Speicherbereinigung ein umstrittenes Thema.
plattformübergreifend "kostenlos" ist nicht so gut wie Sie denken, da nur wenige Entwickler OpenGL verwenden möchten und einigen wichtigen Plattformen wahrscheinlich eine gute Java-Implementierung oder Wrapper für ihre nativen Bibliotheken fehlen, sei es für Grafik, Audio, Netzwerk usw.
Das Problem ist jedoch hauptsächlich die Abwärtskompatibilität. Spieleentwickler wechselten von C zu C ++ und von Assembly zu C, nur weil die Migrationsroute reibungslos verlief. Jeder arbeitet eng mit dem vorherigen zusammen, und der gesamte vorherige Code konnte in der neuen Sprache verwendet werden, häufig über einen einzigen Compiler. Daher war die Migration so langsam oder so schnell, wie Sie möchten. Zum Beispiel haben einige unserer alten Header, die heute verwendet werden, noch #ifdef WATCOMCIch glaube nicht, dass hier in einem Jahrzehnt oder länger jemand den Watcom-Compiler verwendet hat. Es gibt eine massive Investition in alten Code und jedes Bit wird nur bei Bedarf ersetzt. Dieser Prozess des Ersetzens und Aktualisierens von Teilen von einem Spiel zum nächsten ist bei weitem nicht so praktisch, wenn Sie zu einer Sprache wechseln, die nicht nativ mit Ihrem vorhandenen Code zusammenarbeitet. Ja, C ++ / Java-Interoperabilität ist möglich, aber im Vergleich zum einfachen Schreiben von "C mit etwas C ++" oder Einbetten von ASM-Blöcken in C sehr unpraktisch.
Um C ++ als bevorzugte Sprache der Spieleentwickler richtig zu ersetzen, muss es eines von zwei Dingen tun:
Subjektiv glaube ich nicht, dass Java beides erfüllt. Eine höhere Sprache könnte die zweite treffen, wenn jemand mutig genug ist, der Pionier zu sein. (EVE Online ist wahrscheinlich das beste Beispiel dafür, dass Python verwendbar ist, verwendet jedoch eine Abzweigung der Hauptsprache Python, viele C ++ - Komponenten für die Leistung, und selbst das ist in moderner Hinsicht ein ziemlich anspruchsloses Spiel.)
quelle
Ich spiele die Sims 3 und habe ein bisschen herumgestochert. Die Grafik-Engine ist C ++, während die Scripting- und Verhaltens-Engine C # / Mono ist. Während C ++ für zeitkritische Dinge da ist, sind andere Dinge wie Interaktion, Spielelogik und KI in einer objektorientierten verwalteten Sprache.
quelle
quelle
Einer der Hauptgründe, warum Java und andere Sprachen der virtuellen Maschine nicht für Spiele verwendet werden, ist die Garbage Collection. Das gleiche gilt für .NET. Die Speicherbereinigung hat einen langen Weg zurückgelegt und funktioniert in den meisten Arten von Anwendungen hervorragend. Um die Speicherbereinigung durchzuführen, müssen Sie die Anwendung anhalten und unterbrechen, um den Papierkorb zu sammeln. Dies kann zu periodischen Verzögerungen führen, wenn die Erfassung erfolgt.
Java hat das gleiche Problem für Echtzeitanwendungen. Wenn Aufgaben zu einem bestimmten Zeitpunkt ausgeführt werden müssen, ist es schwierig, dass eine automatisierte Aufgabe wie die Speicherbereinigung dies berücksichtigt.
Es ist nicht so, dass Java langsam ist. Es ist so, dass Java nicht gut in der Lage ist, Echtzeitaufgaben zu erledigen.
quelle
Ein großer Grund dafür ist, dass Videospiele häufig direkte Kenntnisse der darunter liegenden Hardware erfordern und es für viele Architekturen wirklich keine großartige Implementierung gibt. Es ist das Wissen über die zugrunde liegende Hardwarearchitektur, das es Entwicklern ermöglicht, jede Unze Leistung aus einem Spielesystem herauszuholen. Warum sollten Sie sich die Zeit nehmen, Java auf eine Spieleplattform zu portieren und dann ein Spiel über diesen Port zu schreiben, wenn Sie das Spiel einfach schreiben könnten?
Bearbeiten: Dies bedeutet, dass es mehr als ein Problem mit "Geschwindigkeit" oder "nicht die richtigen Bibliotheken haben" ist. Diese beiden Dinge gehen Hand in Hand, aber es geht eher darum, wie ich ein System wie die Zelle dazu bringe, meinen Java-Code auszuführen. Es gibt keine wirklich guten Java-Compiler, die die Pipelines und Vektoren verwalten können wie ich brauche .. "
quelle
Leistungsprobleme sind der erste Grund. Wenn Sie die Art von hyperoptimiertem C ++ - Code in den Quake-Engines ( http://www.codemaestro.com/reviews/9 ) sehen, wissen Sie, dass sie ihre Zeit nicht mit einer virtuellen Maschine verschwenden werden.
Sicher, es gibt einige .NET-Spiele (welche? Ich bin interessiert. Gibt es einige wirklich CPU- / GPU-intensive?), Aber ich denke, es liegt eher daran, dass viele Leute Experten für MS-Technologien sind und Microsoft beim Start gefolgt sind ihre neue Technologie.
Oh, und plattformübergreifend denken Videospielunternehmen einfach nicht daran. Linux macht nur etwa 1% des Marktes aus, Mac OS einige% mehr. Sie denken definitiv, dass es sich nicht lohnt, nur Windows-Technologien und Bibliotheken wie DirectX zu sichern.
quelle
Sie können sich fragen, warum Webanwendungen nicht auch in C oder C ++ geschrieben sind. Die Stärke von Java liegt in seinem Netzwerkstapel und seinem objektorientierten Design. Natürlich haben C und C ++ das auch. Aber auf einer niedrigeren Abstraktion. Das ist nichts Negatives, aber Sie wollen das Rad nicht jedes Mal neu erfinden, oder?
Java hat auch keinen direkten Hardwarezugriff, was bedeutet, dass Sie mit der API eines Frameworks nicht weiterkommen.
quelle
Missverständnisse über die Leistung und schlechte JVM-Optimierungen sind meine Vermutung. Ich sage falsche Vorstellungen über die Leistung, weil es einige Java-Ports von C ++ - Spielen gibt, die schneller als ihre C ++ - Gegenstücke sind (siehe Jake 2). Das eigentliche Problem, IMHO, ist, dass sich viele Java-Programmierer nicht so sehr auf die neueste Leistung konzentrieren, sondern auf Benutzerfreundlichkeit und Verständlichkeit / Wartbarkeit von Code. Auf der C / C ++ - Seite codieren Sie im Wesentlichen in einer etwas höheren Assemblersprache und es ist ungefähr so nah an der Hardware, wie Sie es nur können, ohne Assembler oder reinen Maschinencode zu schreiben.
quelle
Die Liste der Game Engines auf Wikipedia listet viele Game Engines zusammen mit der Programmiersprache auf, in der sie geschrieben sind.
Es sind mehrere Java-Game-Engines aufgeführt.
Wenn Sie auf einige der Links klicken, gelangen Sie zu Beispielen für Spiele und Demos, die in Java geschrieben wurden. Hier ist ein paar:
Für bestimmte Spiele und Situationen können die Kompromisse zwischen Java akzeptabel sein.
quelle
.NET hat definitiv einige der gleichen Probleme wie Java, wenn es um intensive 3D-Leistung geht. Microsoft hat auch viel mehr Zeit und Geld in die Entwicklung der Bibliotheken investiert, wenn es um die Arbeit mit 3D-Operationen geht.
(... ich persönlich denke auch, dass sie ein Bein hoch hatten, wenn es um die Magie zwischen DirectX und .NET geht)
quelle
Java ist langsam, der größte Teil des schweren Hebens wird nicht von der GPU erledigt. Es gibt immer noch Animation, Physik und KI auf der CPU, die alle sehr zeitaufwändig sind.
Java existiert nicht auf Konsolen, und Konsolen sind ein Hauptziel für kommerzielle Spiele. Wenn Sie Java auf dem PC verwenden, können Sie nicht mehr innerhalb angemessener Zeit und mit angemessenem Budget auf Konsolen portieren.
Viele der erfahreneren Programmierer in der Spielebranche haben C und C ++ verwendet, lange bevor Java populär wurde. Die beiden oben genannten Punkte mögen dazu beitragen, aber ich gehe davon aus, dass viele professionelle Spielecodierer Java einfach nicht so gut kennen.
Der Punkt eines anderen über Middleware oben war gut, also füge ich ihn meiner Antwort hinzu. Es gibt eine Menge Legacy-Code und Middleware, die speziell für die Verknüpfung mit C / C ++ geschrieben wurden, und zuletzt habe ich überprüft, dass Java keine gute Interoperabilität aufweist. Die Verwendung von Java für die meisten Unternehmen würde bedeuten, viel Code wegzuwerfen, von dem ein Großteil auf die eine oder andere Weise bezahlt wurde.
quelle
Tatsächlich ist es für verwalteten Code sehr gut möglich, 3D-Spiele auszuführen. Das Problem sind die Back-Engines. Mit .Net gab es für kurze Zeit einen Managed DirectX-Wrapper für DirectX 9 von Microsoft. Dies war vor der Abstraktion, die jetzt XNA ist.
.Net-Spiele haben vollständigen Zugriff auf DirectX-APIs und sind ein Vergnügen. Das beste Beispiel, das ich kenne, ist www.entombed.co.uk, das in VB.Net geschrieben ist.
Auf der Java-Seite fehlt es leider ernsthaft - hauptsächlich aus dem Grund, dass DirectX nicht für Java verfügbar ist und Spieleprogrammierer die DirectX-API kennen und verstehen - warum sollten Sie noch eine andere API lernen, wenn Sie zu DirectX zurückkehren?
quelle
Spielemarketing ist ein kommerzieller Prozess. Verlage wollen quantifizierbare risikoarme Renditen für ihre Investition. Infolgedessen liegt der Fokus normalerweise auf Technologie-Gimmicks (mit Ausnahmen), die Verbraucher kaufen, um eine zuverlässige Rendite zu erzielen - dies sind in der Regel oberflächliche visuelle Effekte wie Blendung der Linse oder höhere Auflösung. Diese Effekte sind zuverlässig, da sie lediglich eine Erhöhung der Verarbeitungsleistung erfordern - sie nutzen die Hardware- / Moore'schen Gesetzeserhöhungen aus. Dies impliziert die Verwendung von C / C ++ - Java ist normalerweise zu stark von der Hardware abstrahiert, um diese Vorteile zu nutzen.
quelle
Ich würde vermuten, dass Geschwindigkeit immer noch das Problem ist. Plattformübergreifend wird ein Problem sein, nicht wahr, da Sie nicht wissen, welche 3D-Karte verfügbar ist, wenn Sie den Code schreiben? Hat Java irgendetwas, um die automatische Erkennung von 3D-Funktionen zu unterstützen? Und ich würde vermuten, dass es Tools gibt, die das Portieren eines Spiels zwischen Wii, Xbox und PS3 vereinfachen, aber ich wette, es ist teuer.
Das ps3 hat Java über die Blue Ray-Unterstützung. Überprüfen Sie die bd-j-Site.
quelle
Sogar Spiele, die auf der .Net-Plattform geschrieben wurden, sind häufig stark auf Geschwindigkeit wie den direkten Zugriff auf Speicher und Bus optimiert. .Net ermöglicht die Verwendung von C / C ++ und das Mischen mit höheren Sprachen wie C #.
Spieleentwicklungsstudios arbeiten häufig eng mit Hardwareanbietern zusammen, die Zugriff auf Low-Level-Schnittstellen ihrer Produkte bieten. In dieser Welt müssen Sie ASM und C für die Gerätekommunikation verwenden. Eine virtuelle Umgebung würde diese Programmteile verlangsamen.
Wie auch immer, moderne 3D-Spiele verwenden tatsächlich höhere Sprachen. Oft finden Sie die Spielelogik in Sprachen wie Lua oder Python geschrieben. Der Kern (E / A, Threads, Aufgabenplanung) des typischen 3D-Spiels wird jedoch in den nächsten 25 Jahren in einfachen Sprachen geschrieben sein oder solange Geräte selbst keine Abstraktion und Virtualisierung zulassen (was noch kommen wird).
quelle
Ich stimme den anderen Beiträgen über die Nutzung von Elementen einer bereits vorhandenen / lizenzierten Codebasis, Leistung usw. zu.
Eine Sache, die ich hinzufügen möchte, ist, dass es schwierig ist, böse DRM-Tricks durch eine virtuelle Maschine zu ziehen.
Ich denke auch, dass es eine Hybris-Komponente gibt, bei der Projektmanager glauben, sie könnten mit C ++ stabilen / zuverlässigen Code erstellen, mit all den Vorteilen wie der absoluten Kontrolle über ihre Tools und Ressourcen, ABER ohne all die Nachteile, die ihre Konkurrenz erschweren und beeinträchtigen, weil "wir" sind schlauer als sie sind ".
quelle
Runescape von Jagex ist in Java geschrieben. Das Tag "Videospiel" wendet es möglicherweise nicht speziell auf ein Online-Spiel an, hat aber eine anständige Anhängerschaft.
quelle
Es wurde schon viel darüber gesprochen, man kann sogar im Wiki die Gründe finden ...
Und ich höre immer mehr Java-Programmierer, die versuchen, die Leute davon zu überzeugen, dass Java nicht langsam ist. Es ist nicht langsam, ein Widget auf dem Bildschirm und einige ASCII-Zeichen auf dem Widget zu zeichnen, Daten über das Netzwerk zu empfangen und zu senden (und das ist es auch) empfohlen, es in diesen Fällen zu verwenden (Manipulation von Netzwerkdaten) anstelle von C / C ++) ... Aber es ist verdammt langsam, wenn es um ernsthafte Dinge wie mathematische Berechnungen, Speicherzuweisung / -manipulation und viele dieser guten Dinge geht.
Ich erinnere mich an einen Artikel auf der MIT-Site, in dem gezeigt wird, was C / C ++ kann, wenn Sie die Sprach- und Compilerfunktionen verwenden: Ein Matrixmultiplikator (2 Matrizen), 1 Implementierung in Java und 1 Implementierung in C / C ++ mit C / C ++ - Funktionen und entsprechende Compiler-Optimierungen aktiviert, war die C / C ++ - Implementierung ~ 296 260-mal schneller als die Java-Implementierung.
Ich hoffe, Sie verstehen jetzt, warum Leute C / C ++ anstelle von Java in Spielen verwenden. Stellen Sie sich Crysis in Java vor. Es würde keinen Computer auf dieser Welt geben, der damit umgehen könnte ... + Die Garbage Collection funktioniert in Ordnung für Widgets, die gerade ein Bild zerstört haben Aber es ist immer noch zwischengespeichert und muss bereinigt werden, aber nicht für Spiele. Natürlich werden Sie bei jeder Aktivierung der Speicherbereinigung noch mehr Verzögerungen haben.
Bearbeiten : Da jemand nach dem Artikel gefragt hat, habe ich hier im Webarchiv danach gesucht. Ich hoffe, Sie sind zufrieden ... MIT-Fallstudie
Und um hinzuzufügen, nein, Java für Spiele ist immer noch eine schreckliche Idee. Vor ein paar Tagen hat eine große Firma, die ich nicht nennen werde, damit begonnen, ihren Spieleclient von Java auf C ++ umzuschreiben, weil ein sehr einfaches Spiel (in Bezug auf Grafik) i7-Laptops mit leistungsstarken Grafikkarten der Generation nVidia GT 5xx und 6xx verzögerte und heizte ( Nicht nur nVidia, hier geht es auch darum, dass diese leistungsstarken Karten, die die meisten neuen Spiele mit Max-Einstellungen verarbeiten können und dieses Spiel nicht verarbeiten können, und der Speicherverbrauch ~ 2,5 - 2,6 GB RAM betrug. Für solch einfache Grafiken braucht es eine Bestie einer Maschine.
quelle