Ladezeiten einst und jetzt

Hallöchen,

gerade habe ich im Podcast zu Ultima VII gehört, dass Christian tatsächlich bei Nutzung eines 386 eine geschlagene Minute auf den Ladebildschirm des Spiels gucken musste.
Wenn ich die alten Spiele, die ich in letzter Seit so gespielt habe so ansehe, dann laden die alle flott. Man hat den Eindruck, es dauert nicht länger als es nötig ist, ein Savegame von ein paar hundert kB bis einigen MB von einer SSD in den Speicher zu laden. Das sind Spiele wie Anno 1503, Serious Sam First Encounter oder Empire Earth I.
An neuen Sachen spiele ich Anno 1800 und im Moment sehr viel Transport Fever 2 als virtuelle Modellbahn. Vor allem TPF2 lädt ewig, der letzte Ladevorgang hat 24 Minuten gedauert. Ein Savegame ist etwa 130.000kB groß, dazu kommen etwa 900 Mods mit Fahrzeugen, Gebäuden und zig Assets. Das sind sicher etliche MB und es wird sicher auch noch dies und das im Hintergrund berechnet. Aber 24 Minuten? So ein bisschen habe ich auch selbst programmiert. Zwar keine Spiele, aber ich habe eine Vorstellung davon, was man tun muss, um Dateien von der Festplatte zu lesen. Was daran 24 Minuten dauern muss, kann ich mir nicht so richtig vorstellen, woraus sich der Verdacht nährt, dass die Ladezeiten der Spiele künstlich in die Länge gezogen werden. Nochmal, ich lade nichts von Datasette, sondern von einer SSD-Festplatte.
Bei Anno 1800 dauert das Laden des Spielstands auch einige Minuten, was sie aber wohl mit dem letzten großen Update etwas beschleunigt haben. Da ist ein Savegame etwa 16.400kB groß, das sind auch keine gewaltigen Datenmengen. Was machen die in den modernen Spielen so lange hinter ihren Ladebildschirmen?

2 „Gefällt mir“

Du würdest dich wundern, wie ineffizient heutzutage oft programmiert wird. :see_no_evil:

2 „Gefällt mir“

Es ist ein Graus was man da jeden Tag sehen muss …

Früher wurde optimiert und nah an der Hardware programmiert. Hacks und extreme Coding-Stile führen aber generell zu weniger gut wartbarem Code. Warum ist das wichtig? Nun, wenn nicht mehr eine Person sondern ein Team oder mehrere Teams an einem Projekt arbeiten, ist es wichtig, dass der geschriebene Code verständlich und leicht erweiterbar ist, weil man Softwareentwicklung sonst nicht ordentlich skalieren kann. Außerdem wird es schwieriger den Code dauerhaft zu warten. Deshalb werden Optimierungen eigentlich immer zuerst ausgeklammert und dann später dort nachgezogen wo man sie braucht.

Dazu sind die Abstraktionsschichten heute anders. Bei den alten Heimcomputern hören wir immer wieder, dass die guten Sachen in Assembler geschrieben wurden. Das ist im Zeitalter der Engines nicht mehr üblich. Diese sind selbst schon auf einer Hochsprache geschrieben und benutzen wie z.B. Unity dann noch Sprachen die auf einer virtuellen Maschine basieren. Das heißt da gibt es einen Abstraktionslevel der schon von der eigentlichen „Maschine“ wegführt.

Das was früher gemacht wurde kann man vom Programmierskill her sicher als großartig und beeindruckend bezeichnen - wenn es allerdings um eine Engineering-Perspektive für große Projekte geht, kann das nicht funktionieren. Zumindest nicht wenn man „industriell“ Software herstellt.

Dass sowas wie ein AAA Softwareprodukt überhaupt das Licht der Welt erblickt und kein komplettes Wrack ist, zeugt schon von ganz guten Fähigkeiten. Wenn man ein paar Hundert Entwickler hat sind mindestens 50 Gurken dabei. Dann noch planbar ein Softwareprodukt zu liefern ist nicht ganz einfach und bedarf einem hohe Reife in der agilen Zusammenarbeit der einzelnen Teams.

Ich wehre mich daher ein bisschen dagegen, dass man die eigentlichen Herausforderungen in der Softwareentwicklung immer so ein bisschen abtut. Ein einzelnes Genie macht heute kein große Spieleproduktion mehr.

13 „Gefällt mir“

Großartiger Kommentar! Ich hab’ keine Ahnung vom Programmieren, dachte mir aber schon, dass das inzwischen alles überkrass sein muss, gerade bei Großproduktionen. Ich finde, du hast kurz gebündelt, knackig abstrahiert den Kern der Sache einfach verständlich gemacht, soweit ich das aus meiner Laien-Perspektive beurteilen kann. Wirklich gut. Und ich meine das.

wer gerne in den Genuss langer Ladezeiten kommen möchte, dem Empfehle ich den Konsolenport von Pillars of Eternity 1/2. Wirklich beeindruckend was man mit einer schlecht optimierten Engine so an Ladezeiten erzeugen kann :smiley:

1 „Gefällt mir“

Keine Frage, dass Großprojekte wie Transport Fever 2 oder Anno 1800 gut gemanaged sein müssen, damit das Ganze auch nach ein paar Updates und mit einer unüberschaubaren Anzahl von Mods, bei denen niemnd weiß, in welcher Kombination die User die anwenden werden, trotzdem immer noch funktioniert. Ich sags immer so: Leute, die das hinkriegen, können mehr als Brot essen.

Aber hier geht es um das Laden eines Spielstands. Bytes in den Speicher schaufeln und möglicherweise daran auch schon etwas herumrechnen. Der langsamste Teil dieser Operation wird immer noch der Festplattenzugriff sein. Windows zeigt mir für meine Festplatte bei Kopiervorgängen einige MB/s an, also die genannten Dateigrößen zu laden kann nicht 24 Minuten dauern, selbst wenn das in GW-Basic geschrieben wurde.

Was machen die da noch? Oder sind lange Ladezeiten irgendwie ein Qualitätsmerkmal, frei nach dem Motto: Was sofort geladen ist, war nicht viel, da kann die Spielewelt ja nicht so groß sein? Dem Kunden Minuten seiner Lebenszeit zu stehlen kann doch eigentlich kein Marketingargument sein?

Möchte in diesem Zusammenhang nur bemerken, dass „Ghost of Tsushima“ auf der PS5 vom Anwählen im Home-Bildschirm bis ich Jin steuern kann etwa 30 Sekunden braucht und danach gefühlt nur noch beim Ableben lädt.
Lass’ ich jetzt einfach mal so stehen. Soll kein „Ach wie geil ist doch die PS5“-Kommentar sein (deren Bedienoberfläche nebenbei bemerkt sogar noch beschissener als bei der PS4 ist).
Aber das beeindruckt mich jedes Mal und ich weiß nicht wie die das hinbekommen haben. Ich glaube aber, es gibt einen GDC-Vortrag genau dazu.

1 „Gefällt mir“

das lädt selbst auf einer PS4 der ersten Stunde nicht viel länger, das passiert halt wenn spiele für die entsprechende Hardware optimiert werden.

1 „Gefällt mir“

Hmm, vielleicht ein Bug? 24 Minuten sind hardcore und werden mit absoluter Sicherheit auch vom Entwickler nicht beabsichtigt sein und schon gar nicht als Qualitätsmerkmal. Eine etwas sonderbare Vermutung, wo doch gerade die Konsolenhersteller damit werben wie schnell ihre Maschinen die Software starten.

Ich erinnere mich noch an die Werbepräsentationen als die PS5 angekündigt wurde. Da haben sie stolz so ein Spiderman Spiel gezeigt, von Ihrer ach-so-schnellen SSD gelabert, und ernsthaft behauptet, Ladezeiten würden mit der PS5 Vergangenheit sein. :slight_smile:

Jetzt ist die PS5 da, und, naja 30 Sekunden ist schon die Ausnahme, die meisten Spiele laden immer noch ziemlich lang. Das war wohl nix mit „say goodbye to loading times.“

Ich habe das Gefühl, dass es zum Teil am inhärenten Bloat von Engines wie Unreal Engine 4 liegt, die universell funktionieren müssen, und nicht auf den Anwendungsfall eines spezifisches Spieles optimiert sind. Auf die Unreal Engine 5 Spiele warten wir immer noch. Auch da wird es Bloat geben, denke ich.

Zum Thema Ladezeiten fällt mir auch Valve ein, beziehungsweise die Source Engine. Ich habe auf dem Steamdeck mal Half Life, Half Life 2, Portal und Portal 2 installiert, und die laden immer noch lange, obwohl die Spiele jetzt von SSD auf einem modernen Gerät laufen. Ich habe damals schon nie verstanden, warum die Valve Spiele immer so lange laden müssen, zwischen den Levelabschnitten, zwischen Levels usw. Das muss einfach eine Schwäche der Source Engine sein.

Ich vermute mal es geht nicht um die Zugriffszeiten per se, sondern eher um das Herumschieben der Daten im Speicher selbst. Es müssen wahrscheinlich in einem riesigen Loop alle Spielobjekte neu initialisiert werden. Eine optimierte Engine könnte da wahrscheinlich viel Zeit sparen, aber ich denke, die meisten Engines versuchen alles komplett zurückzusetzen und hakelig neu zu initialisieren. Der Zustand der Spielobjekte ändert sich während des Spieles im Speicher, und das muss alles auf den Urprungsstand zurückgesetzt werden. Da die Objekte bei C++ wild fragmentiert im Speicher herumliegen, und nur einzeln indirekt über Setter-Funktionsaufrufe zurückgesetzt werden, ist das viel langsamer als ein einfaches memset(). Man muss wahrscheinlich Millionen von Pointern folgen, während man den ganzen Vererbungsbaum der Objekte durchläuft.

Ich verstehe es ehrlich gesagt auch nicht ganz. Vielleicht wird das Spielstand Handling gar nicht in C++ geschrieben sondern in einer langsamen Sprache wie Python, oder sogar irgendeiner noch viel langsameren Skriptsprache? Das würde mich nicht wundern.

Hier ist ein Beispiel, dass manche Sprachen wie Python oder Java zum Teil 10-50 Mal langsamer sein können, als C oder Assembler, da fasst man sich tum Teil schon an den Kopf.

Ich habe leider keine Ahnung, in welcher Sprache bei modernen Spielen das Laden und Speichern von Spielständen implementiert wird. Oft wird hauptsächlich in C++ oder C# programmiert. Aber Dinge wie zum Beispiel die Skripte, die die Spiellogik in Missionen bestimmen, werden in viel langsameren Sprachen wie Lua geschrieben.

Es stimmt natürlich, dass ein grosses AAA Spielprojekt mit mehr beteiligten Leuten als bei einem Blockbuster Hollywoodfilm eine Mammutaufgabe ist, und man sich daher freuen sollte, dass es am Ende überhaupt funktioniert.

1 „Gefällt mir“

Zumindest am Anfang war das auch so.
Demon‘s Souls, Ratchet & Clank, Miles Morales und Astrobot waren alles Spiele die super schnell geladen wurden. In Demon‘s Souls fehlen deshalb sogar die Itembeschreibungs-Bildschirme, die man in den anderen Souls Spielen bei jeder Pause sieht.

Hab sonst aber bisher keine PS5 First Party Spiele mehr probieren können und kann nicht sagen ob ein Last of Us Part 1 oder Returnal auch noch so schnell laden.

1 „Gefällt mir“

Nee, ich hab den Eindruck, dass das reine Datenladen hier den kleinsten Anteil ausmacht. 100MB Savegame ist bei einer SSD doch völlig vernachlässigbar. Die ganzen Assets sind vermutlich der größere Anteil, aber bei einem Spiel wie Transport Fever sollte das auch überschaubar sein. Ich denke der größte Anteil geht dabei in den Aufbau der Simulation und der Generierung der Welt aus dem Savegame drauf. Das ist bestimmt CPU-intensiv. Genauso wie das Dekomprimieren der Assets und sonstiger Daten. Und was hast du da geschrieben? 900 Mods? War das ein Typo? Ich könnte mir vorstellen, dass Mods sowas heftigst ausbremsen können. Die sind gerne ineffizient programmiert und durch diverse Abstraktionsschichten nur eher mäßig in den Hauptprogrammcode integriert. In beiden Fällen wäre CPU der Flaschenhals und nicht IO. Aber ich weiß nicht genau wie Mods bei Transport Fever 2 funktionieren.

Ich habe TF2 übrigens auch eine Weile gespielt (ohne Mods) und ich hatte glaub ich nie Ladezeiten > 1 Minute. Und das erscheint mir schon lang (subjektiv). 24 Minuten ist schon heftig. Ich glaub nach 3 Minuten würde ich mutmaßen, dass das Spiel abgestürzt ist :sweat_smile:

Die Sprache in der das Laden der Rohdaten vom Festspeicher implementiert ist sollte eigentlich egal sein, weil am Ende nur eine Betriebssystemfunktion aufgerufen wird, die das übernimmt. Vorteile durch hardwarenahe Sprachen hat man eher bei heftigen Berechnungen mit vielen Daten. Ich bin kein Fan davon, diese Geschwindigkeitsvergleiche von Programmiersprachen zu überinterpretieren. „Schnelle“ Sprachen können in der Realität seltener ihren Geschwindigkeitsvorteil ausspielen als solche Vergleiche mit ihren synthetischen Szenarios suggerieren.

Aber ich bin auch nur „normaler“ Softwareentwickler und habe von Spieleentwicklung und (3D)-Spiele-Engines wenig Ahnung.

3 „Gefällt mir“

Mit der Generierung der Welt aus den Daten wirst du sicher recht haben beim Transport Fever. Das Lesen der Daten von der Festplatte wird wohl nicht so viel Zeit beanspruchen

Das war kein Typo, es sind tatsächlich um die 900 Mods auf einer mittelgroßen Karte. Fahrzeuge, Häuschen, zig Sachen, die irgendwo rumstehen als Deko usw.
Die Mods sind in LUA geschrieben, zumindest haben die Dateien diese Endung. Das ist also eine langsame Skriptsprache, wie ich jetzt aus diesem Thread weiß. Je mehr Mods, umso langsamer. Ich habe die Ladezeit der Karte vor einer Weile mal mit dem Handy gestoppt, da waren es gute 18 Minuten. Inzwischen sind ein paar mehr Mods dazu gekommen, weil unbedingt auch noch diese Lok dort fahren muss und jenes Häuschen total interessant aussieht. Beim letzten Laden habe ich ein Video des Youtubers Hans Dampf angesehen, der unter Anderem auch TPF2 spielt. Das war ziemlich genau 24 Minuten lang. Als das Video zu Ende war, war auch meine Karte geladen.

Es gibt beim Laden einen Fortschrittsbalken, der steht zuerst ewig bei etwa 4%, dann bei etwa 70% nochmal eine Ewigkeit. So lange im Ladescreen immer neue Ratschläge für das Spiel angezeigt werden, kann man annehmen, dass sich da noch was tut.
Trotzdem, 24 Minuten… Ein mit 2,8GHz getakteter i7, was kann der in dieser Zeit alles berechnen? Bis zum wirklichen Beweis des Gegenteils glaube ich, dass da viel Leerlauf drin ist.

1 „Gefällt mir“

Ich tippe jetzt schwer darauf, dass es an den Mods liegt. Am i7 wird es nicht liegen :slight_smile: Da sind bestimmt diverse Ineffizienzen drin, die bei 30-40 Mods nicht auffallen. Aber 900 … :smiley: Vielleicht werden die Lua-Scripts beim zu irgendwas Effizientem kompilliert, damit die während des Spiels schon schnell ausgeführt werden. Aber das dauert dann halt beim Laden lange.

Ich hab lange Zeit WOW und TESO gespielt und mit der Zeit hab ich immer mehr Mods angesammelt. Irgendwann wurde immer das Spiel so langsam, dass ich bei den Mods Kahlschlag gemacht habe und dann war alles wieder gut :smiley:

Allgemein finde ich aber, dass Ladezeiten im Vergleich zu „früher“:tm: kaum noch eine Rolle spielen, zumindest am Computer seit der SSD. Man erinnere sich an Tape- und Floppy-Ladezeiten auf C64 und Amiga. 10 Minuten waren da schon nicht selten. Oder die End-90er, wo man minutenlang vor dem PC saß und das CD-Rom-Laufwerk Geräusche machte, bei denen man sich wunderte, wie diese kleine Kiste die fabrizieren kann. Heute dauert ein Ladevorgang am PC doch selten mehr als 1 Minute, oder? Und das meiste davon ist Logos wegdrücken.

2 „Gefällt mir“

Ja klar, früher hatten wir Dinge wie Floppys oder gar Datasetten mit epischen Zugriffszeiten, da war klar, dass das jetzt ein Weilchen dauern wird. Oder man musste dauernd Disketten nachschieben.
Heute haben wir SSD-Festplatten mit astronomischen Datenraten und CPUs mit Taktraten, die hätten einen 80486 verglühen lassen. Trotzdem beschleicht mich der Eindruck, dass moderne Spiele eher langsam laden. Mein TPF2 mag ein krassses Negativbeispiel sein mit jetzt 24 Minuten, aber z.B. Anno 1800 braucht auch ein paar Minuten.
Alte Spiele auf heutiger Hardware laden dagegen schnell. Ich habe verdrängt, wie lange die früher geladen haben auf der damaligen Hardware, aber wahrscheinlich hat sich insgesamt nicht wirklich was verbessert. Wenn die Hardware mehr kann, wird auch sofort mehr in die Software reingestopft und jeder Performancegewinn ist wieder futsch.

Meine TPF2 Karte an sich läuft auch mit den 900+ Mods noch einigermaßen flüssig, wenn sie erstmal geladen ist. Aber eben 24 Minuten, das ist schon krass.

2 „Gefällt mir“

Schmeiß die doch mal temporär raus, und schau, wie lang er dann braucht. Würde mich mal interessieren, so aus Neugier. ;-)

Und wenn ich dieselbe Funktion in C ineffizient umsetze und in Javascript effizient, wird die Javascript-Version schneller laufen. Oder anders gesagt, eine schnellere/systemnähere Sprache hilft mir nicht, wenn ich nicht gut programmieren kann. :see_no_evil:

Oft stößt man auch auf „gewachsenen“ Code, wo Funktionen, die ursprünglich für einen speziellen Einsatzzweck entwickelt wurden (und da vielleicht auch da schon nicht optimiert), immer mehr erweitert werden, bis am Ende ein Frankenstein herauskommt, der aus dem letzten Loch pfeift. Man macht ja nicht ohne Grund Refactoring.

Ich würde sagen, schlechter Code resultiert zur Hälfte aus „Zeitdruck, optimieren wir später“ und zur Hälfte aus Schlamperei/Unwissen/Copy&Paste von StackOverflow. :see_no_evil:

2 „Gefällt mir“

Dann wird die Karte nicht laden, wie sollen die Sachen dargestellt werden ohne Daten? Nicht jeder der 900 Mods wird auch benutzt, aber doch die meisten davon.

Ich habe es jetzt mal ganz ohne Mods ausprobiert. Das läuft natürlich schneller, man kann sehen, dass sich der Fortschrittsbalken schnell bewegt. Aber noch in der ersten Minute während des Ladens gab es einen „Internal Error“. Also es liegt ganz sicher an den Mods, dass das Laden so lange dauert.

1 „Gefällt mir“

Das.

Im übrigen dreht sich Spielentwicklung stark um Ressourcenmanagement. Was ist gerade knapp, wovon habe ich genug? Daraus abgeleitet: Was nervt den Spieler am wenigsten, wie groß ist unser Team, welche technischen Abhängigkeiten haben wir, was können wir selber machen und wie lange soll das Spiel laufen?

Deswegen ist die Nutzung einer Engine nicht automatisch Bloatware, sondern eine bewusste Entscheidung, ebenso wie die Nutzung einer „langsameren“, aber populären Programmiersprache keine Faulheit ist, sondern größere Teams ermöglicht. LUA als Scriptsprache ist leicht zu erlernen und daher bei Moddern populär, also nimmt man das, was alle kennen und können.

3 „Gefällt mir“