Sind die Daten während des Spiels wirklich so stark verändert?
Ich gehe davon aus, dass die längere Pause zwischen dem Neustart eines Levels das gesamte Neuladen des Levels ist. Mir scheint jedoch, dass ein gut implementiertes System in der Lage sein sollte, zum Anfang des Levels zurückzukehren.
Es ist auf Konsolen auffälliger, auf PC-Spielen jedoch nicht unbemerkt.
levels
filesystem
Gittergewebe
quelle
quelle
Antworten:
Nun - was für eine einfache, aber interessante Frage.
Beim Neuladen eines Levels müssen so viele Faktoren berücksichtigt werden, dass die Antwort viele Wege gehen kann.
Wenn Ihr Level-Status eine große Liste von Assets enthält, kann es praktischer sein, beim Zurückladen eines Levels in einen Save / Mission-Status von einem sauberen Slate auszugehen, da dies den genauen Status des Levels beim Zurückladen beibehält, aber nicht viel kostet der Verarbeitung. Es ist jedoch effizienter, die Assets alleine zurückzusetzen, wenn nur wenige zu berücksichtigen sind. Stellen Sie sicher, dass Sie die Aktion auf diesen kleineren Ebenen schnell neu starten können. Letzteres ist besonders dann der Fall, wenn Sie nichts in der Szene aufbewahren müssen oder es nicht durch Ihre Entscheidungen im Spiel beeinflusst wird - wenn Sie keine Leichen benötigen, die Sie bei Ihrem ersten Durchlauf durch ein Dorf aufbewahren müssen, werden sie dies nicht tun müssen auf dem Rückweg durch diese Ebene neu geladen werden, wodurch Prozessorzeit und Zugriffszeit für Speichern / Missionsstatus gespart werden.
Ein gutes Beispiel wäre ein Ego-Shooter, der Geländezerstörungs- / Kugelabziehbilder verwendete, die während des Durchspielens einen dauerhaften Zustand aufwiesen, aber nicht blieben, wenn Sie diesen Kontrollpunkt oder dieses Level neu starteten .
Wenn Sie das Level zurückspulen , anstatt es zu zerstören und neu zu laden, müssen Sie jeden Status verfolgen, der geändert wurde. Wenn Sie mit einer Rakete ein Loch in die Wand schießen, erzeugen Sie Geländestücke aus den Stücken, die von der Wand fallen. Das Modell der Wand ändert sich, um das Loch zu erzeugen, und Sie haben Partikeleffekte, die erzeugt wurden, damit es hübsch aussieht . Um dies zu bereinigen, indem Sie es in einen "neustartfähigen" Zustand zurückspulen, müssten Sie:
Bei so vielen Ressourcen, die zum Zurückspulen einer Ebene nachverfolgt werden müssen, ist es oft weniger prozessorintensiv, die gesamte Ebene einfach zu zerstören und alle Ressourcen in ihren Standard- oder missionsspezifischen Zuständen erneut zu laden. Das Zurücksetzen bestimmter Objekte umfasst das Durchsuchen einer Liste der Objekte in der Szene und den Zugriff auf ihre Eigenschaften, um sie zurückzusetzen. Anstatt dass dieses Einschussloch in der Wand durch Aufräumen repariert wird, müssen Sie keine Aufräumaktionen berechnen. Löschen Sie einfach den gesamten Level aus dem Speicher und laden Sie ihn von Grund auf neu.
Dies bedeutet, dass das erneute Laden eines Levels von einem Statusobjekt (einer gespeicherten Spieldatei oder einem Missionsskript) aus erfolgt und keine dynamischen Berechnungen erforderlich sind. Bei Konsolen wird dies durch die Ladezeiten der Discs verschärft. Es hilft auch bei PC-Spielen, da es Computer berücksichtigen kann, die nicht über die Prozessorleistung verfügen, um die Ladezeiten akzeptabel zu machen.
Also für große Inhaltsebenen - Laden eines einzelnen Status, anstatt einen zu berechnen und "zurückzuspulen":
Als Gegenbeispiel muss ein Kampfspiel (zum Beispiel Street Fighter 4) möglicherweise nicht so viele Assets nachladen, um ein Level neu zu starten. Die 2 Spieler, der Umgebungszustand für den Level und die einfachen Level-Timer sind meistens statisch und nicht dynamisch (die Gesundheit der Spieler wird immer zu 100% pro Runde wieder hergestellt, die Timer werden auf 90 Sekunden zurückgesetzt und der Level hat keine Einschusslöcher [oder tut es!] ) und so ist das Zurücksetzen des Levels eine Frage der Gesundheit der Kämpfer und der Wiederherstellung ihrer ursprünglichen Position für die Umwelt (wie die Zuschauer in einigen Levels).
Für ein Kampfspiel bei einem Rückkampf (nicht von Runde zu Runde) müssen Sie also:
Und das ist im Wesentlichen die gesamte Liste - was bedeutet, dass ein schnelles Zurücksetzen des Status anstelle eines vollständigen Nachladens einfacher ist. Dies lässt sich auch an der Ladezeit ablesen, wenn Sie das Match zum ersten Mal starten. Das Laden aller Charaktermodelle und Levelmodelle dauert sehr lange, aber nur wenige Prozessorticks setzen die Startpositionen der Charaktere zwischen Übereinstimmungen mit einem bereits geladenen Modell zurück.
Es ist wichtig anzumerken, dass dies auch für Kampfspiele eine zunehmend gefragte Anforderung ist, da die Spieler in der Regel unglaublich schnell wieder in Aktion treten möchten, da Spiele in der Regel nur eine Minute dauern können und Genre. Die FPS verlangen nach dynamischeren Assets, während die Fighter schnell wiederholbare Aktionen fordern.
Ich hoffe, das hat etwas Licht in Ihre Frage gebracht.
quelle
Um die vorhandenen Antworten auf Ihre Frage zu Konsolen zu verdeutlichen: Sie verfügen nicht über genügend Speicher, um sowohl den Ausgangsstatus als auch den aktuellen Status für größere komplexe Spiele zu speichern.
Ein Spiel kann das Level und den Anfangszustand separat speichern, so dass nur der Zustand wiederhergestellt werden kann, und dies ist sehr wahrscheinlich, was viele Spiele tun. Aber selbst das Streamen wird etwas langsamer sein, als wenn es in Erinnerung geblieben wäre.
Die "beste" Konsole der aktuellen Generation verfügt nur über 512 MB Arbeitsspeicher, der von den CPU-Daten und der Grafik gemeinsam genutzt wird. Das ist winzig. Eines der aktuellen Probleme bei der Entwicklung von Konsolen besteht darin, Spiele zu entwickeln, die mit so wenig Speicher den heutigen Qualitätsstandards entsprechen. Das Zählen von Kilobyte kann besonders kurz vor dem Versanddatum wichtig werden. Das Speichern einer Kopie des Anfangszustands eines Levels ist eine Datenmenge, auf die verzichtet werden kann, sodass mehr Speicher für Dinge verwendet werden kann, die das Spiel während des Spiels interessanter machen, anstatt nur das Neuladen des Levels zu beschleunigen.
Idealerweise verbringt der Spieler mehr Zeit damit, das Spiel zu spielen, als zu sterben und neu zu starten. Daher ist es sinnvoller, für ein besseres Spielerlebnis zu optimieren.
Mit den Konsolen der nächsten Generation und ihren 8 GB Speicher können sich die Dinge drastisch ändern. Oder sie bleiben mit einfach höher aufgelösten Modellen und Materialien und einer großen Anzahl aktiver Objekte im Spiel gleich. Wir werden sehen. Angesichts der Tatsache, dass PC-Spiele in der Regel auf Computer mit 2 GB RAM und 512 MB VRAM abzielen (obwohl viele auf viel größere Werte skaliert werden), sind die 8 GB der neuen Konsolen in Bezug auf die Mindestbasis ziemlich luxuriös. In den kommenden Jahren wird es wahrscheinlich einen Übergang zu Spielen geben, die eine 64-Bit-CPU / OS und 4-8 GB RAM mit 1-2 GB VRAM erfordern. Das Speichern mehrerer Status im Speicher für ein schnelles Snapshot sollte dann viel einfacher sein.
quelle
Ich bin mit der Antwort von Blue nicht einverstanden. Ich glaube nicht, dass es einen technischen Grund gibt, Ebenen nicht zurückzusetzen - ich bin auf keinen Fall auf eine gestoßen. Das Laden von Levels ist fast immer langsamer als das Zurücksetzen von Levels. Tatsächlich fällt es mir schwer, mir einen Zeitpunkt vorzustellen, an dem dies nicht der Fall wäre. In den meisten Fällen könnten Spiele ein sofortiges Laden von Levels bieten, wenn die Entwickler dies wünschen.
Die eigentliche Antwort ist, wie vorgeschlagen, einfacher und schneller. Das wiederholte Laden von Levels ist sowieso etwas, was ein Spiel erfordert, so dass es relativ einfach ist, dies in einen Level-Neustart umzuwandeln. Das Zurücksetzen erfordert komplexe neue Pfade mit einem hohen Potenzial für neue Fehler und Speicherlecks und erfordert eine angemessene Investition an Entwicklerzeit. In einigen Fällen kann es auch zu Speicherbeschränkungen kommen. Da Spiele nur selten mit viel Entwicklerzeit entwickelt werden, neigen Elemente wie das Zurücksetzen von Leveln leider dazu, auf dem Weg dorthin verloren zu gehen, insbesondere wenn die Spielarchitektur nicht die beste ist, die überhaupt erstellt wurde.
Ich nehme an, man könnte eine Situation finden, in der "Zurückspulen" zum Zurücksetzen erforderlich war, in der Tat müssen die meisten Spiele nur den ursprünglichen Zustand speichern, ein wirksames Mittel zum vollständigen Zurücksetzen auf diesen Zustand für zurückgehaltene Objekte und ein Mittel zum Kennzeichnen von Objekten bereitstellen Beim Zurücksetzen abbrechen. Spielstatusinformationen müssen ebenfalls gespeichert und wiederhergestellt werden. Diese Art von Informationen ist in der Regel im Vergleich zu den Anforderungen für eine gesamte Ebene relativ speicherarm. Dadurch entfällt das langsame und teure Laden von Daten von der Festplatte (einschließlich großer Elemente wie Texturen und Modelle) und es wird eine schnelle ersetzt -Erinnerungspass der Szene.
quelle
Um auch bei begrenztem Arbeitsspeicher große Level oder nahtlose Level-Spiele zu ermöglichen (der Arbeitsspeicher ist immer zu klein. Die Frage ist, ob Sie zuerst das RAM-Limit oder die Grafikkarte erreichen), gibt es eine andere Strategie:
Habe nur den Teil des Levels im Speicher, den der Spieler gerade benötigt oder in ein paar Sekunden benötigt. Modelle, Texturen, Klangbeispiele, ..., die wahrscheinlich nicht mehr benötigt werden, werden aus dem Speicher entfernt.
Dungeon Siege kommt einem in den Sinn (Entwickler behaupteten einmal, die Speicherverwaltung benötige mehr Rechenleistung als das eigentliche Gameplay), die meisten MMORPGs tun dies, Shooter mit einer offenen Umgebung müssen dies tun ... In diesen Fällen ist der Beginn der Level (oder sogar ein Respawn-Punkt vor 30 Sekunden) ist möglicherweise nicht mehr (vollständig) im Speicher.
Oft ist ein erneutes Aufladen der einfachste, billigste und vielleicht schnellste Weg.
Bearbeiten: Hier ist ein Artikel über die Lademechanismen von Dungeon Siege: The Continuous World of Dungeon Siege
quelle
Angesichts der hervorragenden Antworten von Sean und Blue in Bezug auf Einschränkungen der physischen Plattform und Pro-Con-Entscheidungen werde ich einen Kommentar auf einen anderen Ansatz ausweiten:
Warum sollten Sie wahrscheinlich nur das Level komplett neu laden
Ihr loadLevel () -Aufruf funktioniert also einwandfrei, yay! Sie streamen Dateiinformationen auf einer Ebene ein und erstellen schrittweise die darauf basierende Welt, erstellen Objekte und laden Texturen und Sounds, während Sie unterwegs sind. Dann, wenn alles erledigt ist - oder "genug" getan, um das Spiel beginnen zu lassen, rufst du startPlay () auf und deine Welt wird enthüllt und deine Musik beginnt zu spielen.
Wenn Sie mit dem Level fertig sind, zum Menü wechseln oder das Spiel beenden, rufen Sie unloadLevel () auf, um alle Ressourcen und den Speicher freizugeben, an denen Sie festgehalten haben, um ein reibungsloses Erlebnis zu ermöglichen.
Was passiert nun, wenn Sie eine Funktion "Ebene neu starten" hinzufügen möchten? Gut...
Und du bist fertig! Kein neuer Code, höchstens ein paar einfache Funktionsaufrufe, und all das haben Sie bereits geschrieben und getestet, sodass Ihre neue, glänzende Neustart-Funktion jetzt von Ihrer Liste gestrichen ist und wahrscheinlich nie wieder vorkommt - cruftloser, nicht rostender Code ist die beste Art! Verschieben Sie den Code in eine restartCurrentLevel () -Funktion, und Sie können den Code wegklappen und ihn nie wieder anzeigen - möglicherweise, nachdem Sie sichergestellt haben, dass eine Ebene zum Neustarten vorhanden ist :)
Aber dann fragt man sich, ob dies keine Verschwendung ist, wenn man Dinge entlädt, die man sowieso gerade neu laden möchte. Nun, wenn Ihr Level und Ihre Ressourcen klein sind, müssen Sie höchstens ein paar Sekunden Ladezeit gewinnen, wenn "Neustart" auch auf langsamen Systemen (und möglicherweise älteren Smartphones) aufgerufen wird. Wen interessiert das? "Vorzeitige Optimierung", Sie haben bessere Dinge mit Ihrer Zeit zu tun.
Ah, aber jetzt wachsen deine Levels und deine Texturen werden detaillierter und der Soundtrack wurde in 512 kbps mit separaten Kanälen für jede Stimme und Musikebene gerippt (es schien zu der Zeit eine gute Idee zu sein, obwohl du dich nicht erinnern kannst warum). ..) und etwas über "zustandsabhängige mehrdimensionale Fouriertransformationsmatrizen mit Voxel-Raytracing", von dem Sie denken, dass es komplett erfunden und nicht real ist, und das Laden des Pegels dauert eine Weile und beginnt Sie zu ärgern. Sie haben sogar mit echten Leuten getestet und sie zeigen tatsächlich eine Abneigung gegen die Wartezeiten, da es schlimmer ist als bei ähnlichen Spielen (Sie erwarten nicht, dass eine MMORPG-Hauptstadt mit 100 Spielern in <2 Sekunden vollständig geladen wird, oder?). und es ist ein Problem.
Wie optimieren Sie? Nun, wenn Ebene re -loading ein Problem ist, ist dann nicht eben Laden ein Problem? Wenn du denkst, dass es nur ein Neuladen ist, warum um alles in der Welt laden die Leute dein Level so viel öfter neu, als sie das Level überhaupt nur laden? Klingt nach einem Spielproblem, nicht nach einem Code-Engineering-Problem. Wer glaubt, dass es Spaß macht, ein Level immer und immer wieder neu zu laden, und wünscht sich, es wäre schneller als völlig vermeidbar ?
Beheben Sie zuerst das eigentliche Problem!
Nehmen wir jedoch an, Ihr Spiel ist so konzipiert, dass Sie es zumindest gelegentlich neu starten müssen und die Ladezeit so lang ist, dass es nur einmal ausgeführt werden kann und absolut unvermeidlich ist, aber Sie möchten nicht, dass Sie es erneut ausführen müssen. Was für ein Spiel ist das überhaupt? Scheint ein komisches Problem zu sein ... vielleicht ein hochauflösendes Portal-ähnliches Spiel, bei dem davon ausgegangen wird, dass Sie das Rätsel wiederholt durcheinander bringen werden?
Zuallererst muss man sich darüber im Klaren sein, dass dies nicht trivial sein wird. Sie müssen völlig neuen, ungetesteten Code schreiben, der "zustandsabhängig" ist, sodass Sie möglicherweise nicht einmal wissen, was zwischen Levelspielen wiederverwendet wird oder nicht. Gibt es zufällige Elemente, Spawns, variable Texturen (tragen deine Skelette manchmal nur Rüstungen?) Oder andere sich ändernde Elemente in deinem Level? Gibt es Dinge, die je nach Spieler variieren, wie z. B. ein Outfit oder ein angepasstes Modell oder Farben / Türen / Fallen?
Sie werden Vergleiche anstellen und viele davon. Sie durchlaufen Level-Elemente und vergleichen, was gerade benötigt wird, mit dem, was gerade geladen wird (was tun Sie mit Sachen, die für das letzte Level geladen wurden, aber nicht für dieses - lassen Sie sie los oder warten Sie, um eine Zukunft zu verhindern Belastung?). Wenn dies wirklich eine große Sache für Ihr Spiel ist, werden Sie wahrscheinlich Ihren Lade- / Entladecode ändern wollen, um zu sehen, ob etwas bereits geladen ist, bevor Sie es laden (wodurch der Code mehrzweckfähig wird, aber möglicherweise neue Fehler in zuvor funktionierende Features und Funktionen einführt) Ressourcen, die in naher Zukunft nicht mehr verwendet werden sollen, vorsichtig freigeben). Seufzer.
Egal was Sie tun, selbst wenn Ihr Spiel einfach ist, werden Sie in undurchsichtige Fehler geraten, die auf dem Level / Player-Status basieren, als ein Level neu gestartet wurde, das Ihnen beim ersten Laden des Levels nicht passiert. So können Sie Spieleupdates mit folgendem Text schreiben:
"Wenn Sie einen Helm auf eine Bombe auf ein Plättchen fallen lassen, auf dem eine Rakete explodiert ist, die sich ebenfalls innerhalb eines Bereichs von 200 Pixeln um Wasser befindet, werden Ihre Spieldaten nicht mehr beschädigt und das Spiel stürzt nicht mehr ab."
Der wahre Grund, warum sich die meisten Spiele nicht darum kümmern
Ist Ihnen jemals aufgefallen, dass die meisten Menschen ihre vorhandenen Wände nur streichen oder trocken bauen, anstatt sie auf eine Unterlage abzustreifen, oder Teppiche direkt auf Hartholzböden legen, anstatt sie hochzuziehen?
Die einfache Tatsache ist, dass es mehr Arbeit für minimale Belohnung ist. Malen über Ihre vorhandenen Wände funktioniert die meiste Zeit einwandfrei, und der Wert, Hartholzböden abzureißen, ist oft minimal oder nicht vorhanden.
Dasselbe gilt für Software, von Spielen bis hin zu Multimedia-Power-Point-Präsentationen. Wenn Sie sich nur ein paar Sekunden vom Ladebildschirm abschneiden und 1% Ihrer Zeit damit verbringen, sich das anzuschauen, ist dies am einfachsten, oder Sie werden es tun eine sehr schlechte Rendite für Ihre investierte Zeit.
Die meisten Spiele stören also nicht, und ich habe Probleme, an sehr viele Spiele zu denken, bei denen das Laden von Bildschirmen ein ansonsten gutes Spiel weniger lohnenswert machte, mit Ausnahme einiger extremer Beispiele. Die extremen Beispiele sind, wo die Optimierung für ein schnelleres Laden von Levels Sinn macht, und das sind winzige Bruchteile von Spielen, die es in die Öffentlichkeit schaffen, und wahrscheinlich sogar kleinere Bruchteile von Spielen, die niemand jemals sieht, weil sie niemals veröffentlicht werden.
quelle
Weil es schwieriger ist, das gegenteilige Verhalten zu entwickeln, bei dem die statischen Spieldaten (wie Texturen, Geologieinformationen, nicht betroffene Mobs) im Speicher bleiben und nur die dynamischen Daten (wie Spielerposition, Spielerstatistik, Queststatus, Inventar) neu geladen werden. .
Da es mehr Geld und Zeit kostet, tun dies Spieleentwickler im Allgemeinen nicht.
quelle