Die Leistung zu optimieren bedeutet, eine Handvoll bewährter Verfahren während des Aufbaus Ihres Spiels zu befolgen. Im Vergleich zum Auffinden und Beheben von Leistungsproblemen später im Entwicklungsprozess kann das frühe Optimieren der Leistung Ihnen viel Zeit und Aufwand sparen.
Niedrigleistungsgeräte
Niedrigleistungsgeräte, insbesondere mobile Geräte, haben erhebliche Speicherbeschränkungen und sind anfällig für Abstürze aufgrund von Fehlern durch unzureichenden Speicher (OOM):
Wenn Sie niedrigleistungsfähige Geräte unterstützen möchten, wählen Sie mindestens ein "Basis"-Gerät, testen Sie Ihr Spiel darauf während des gesamten Entwicklungsprozesses und achten Sie genau auf die Bildrate und den Speicherverbrauch. Wenn Sie Problemzonen in Ihrem Spiel finden, nutzen Sie diese Bereiche, um die Grenzen Ihres Geräts zu identifizieren.
Zum Beispiel könnten Sie ein Spiel mit den Debug-Statistiken Render (ShiftF2) und Zusammenfassung (ShiftF2) aktivieren. Wenn die Bildrate in einem besonders überfüllten Bereich zu sinken beginnt, könnten Sie die Draw (Szene)-Zahlen prüfen und feststellen, dass Sie unter 1.000 Draw-Calls und 1.000.000 Dreiecken bleiben müssen, damit das Spiel gut auf Ihrem Basisgerät läuft.
Oder Sie könnten die Entwicklerkonsole (F9) überprüfen und feststellen, dass der Speicherverbrauch etwas hoch ist, es sei denn, Sie aktivieren Streaming. Ein klares Verständnis der Gerätegrenzen kann Ihnen helfen, diese beim Fortfahren mit dem Bau Ihres Spiels einzuhalten.

Der Geräteemulator in Roblox Studio ist nützlich, um das Seitenverhältnis und die Steuerung zu überprüfen, ist jedoch für den Speicherverbrauch nicht genau. Wenn Sie ein Spiel im Studio testen, werden der Server und der Client ausgeführt, sodass der Speicherverbrauch erheblich höher ist.
Allgemeiner betrachtet kann das Testen auf verschiedenen Geräten helfen, sicherzustellen, dass das Spiel Ihren visuellen und Leistungsanforderungen bei verschiedenen Grafikeinstellungen entspricht. Für ein viel detaillierteres Beispiel, wie Sie über die Optimierung Ihres Spiels für niedrigleistungsfähige mobile Geräte nachdenken könnten, siehe Echte Welt - Bau- und Skriptoptimierung.
Streaming und Teleportation
Instance Streaming ermöglicht es Roblox, 3D-Inhalte dynamisch zu laden und zu entladen und ist eine großartige Option für die meisten Orte, insbesondere für größere. Streaming verbessert die Beitrittszeiten, reduziert den Speicherbedarf und erhöht die Bildrate.
Zum Beispiel, wenn Sie Workspace.EnableSLIMAvatars aktivieren und die LevelOfDetail-Eigenschaft Ihrer Weltmodelle auf SLIM einstellen, können Sie Welten mit sozialen Räumen und überfüllten Veranstaltungen erstellen, die visuell bevölkert bleiben, während sie sich über eine breite Palette von Gerätetypen skalieren. Weitere Informationen finden Sie unter SLIM und Leistung verbessern.
Erwägen Sie, große Orte in handlichere aufzuteilen und Teleportation zu verwenden, um Spieler zwischen ihnen zu bewegen. Dieser Ansatz kann die initialen Beitrittszeiten reduzieren, führt jedoch zu zusätzlichen Beitrittszeiten, während Spieler von Ort zu Ort teleportiert werden. Die Vorteile für den Speicherverbrauch variieren je nach Größe des Ortes und ob Sie Streaming aktiviert haben.
Selbst wenn man die Leistungsüberlegungen außen vor lässt, könnten Sie feststellen, dass mehrere Orte den Entwicklungsprozess vereinfachen, insbesondere wenn Sie regelmäßig neue Inhalte zu Ihrem Spiel hinzufügen oder Teil eines größeren Teams sind.
Materialien und Duplikation
Eingebaute Materialien verbrauchen viel weniger Speicher als benutzerdefinierte Texturen, entsprechen aber möglicherweise nicht Ihrer künstlerischen Vision. Versuchen Sie, Materialien wann immer möglich zu verwenden, um das Speicherbudget für die Texturen zu sparen, die zentral für Ihr Spiel sind.
Wenn Sie Assets erstellen, konvertieren Sie sie in Pakete. Pakete Teil Ihres Workflows zu machen hilft, das häufige Problem von doppelten Assets mit unterschiedlichen IDs zu vermeiden, was die Leistung beeinträchtigen kann.
Wenn Sie Meshes und Texturen hinzufügen, verwenden und wiederverwenden Sie diese, anstatt doppelte Kopien zu importieren. Durch Verkleinern, Drehen und Überlappen können Sie reiche, abwechslungsreiche Umgebungen schaffen, die sehr wenige Draw Calls erfordern. Für weitere Informationen siehe Doppelte Texturen entfernen.
Transparenz
- Vermeiden Sie Transparenzwerte außer 0 (sichtbar) und 1 (unsichtbar). Wenn Sie teilweise Transparenz verwenden, seien Sie besonders vorsichtig, hohe Transparenzüberlagerungen zu vermeiden.
Skripting
Schreiben Sie wann immer möglich ereignisgesteuerten Code anstelle von frame-basierten Berechnungen. Bei 60 FPS beträgt das gesamte Budget für jeden Frame 16,67 Millisekunden (ms). Selbst scheinbar geringfügige frame-basierte Berechnungen können einen erheblichen Teil dieses Budgets verwenden.
Finden Sie Möglichkeiten, langwierigen Code in handhabbare Abschnitte aufzuteilen. Wenn ein Codefragment 100 ms benötigt, um ausgeführt zu werden und Sie es in jedem Frame ausführen, kann Ihr Spiel nur mit 10 FPS laufen. Wenn Sie sich entscheiden, den Code nur einmal pro Sekunde in einem Spiel auszuführen, das ansonsten mit 60 FPS läuft, kommen 59 Ihrer Frames nach 16,67 ms... und dann einer nach 100 ms, was ein ruckartiges Stottern verursacht.
Untersuchen Sie stattdessen, wie Sie den Code aufteilen können. Vielleicht können Sie 5 ms Arbeit pro Frame leisten, task.wait() verwenden und die Berechnung alle 20 Frames durchführen, während Sie weiterhin 60 FPS aufrechterhalten. Multithreading, manchmal als Parallel Luau bezeichnet, kann ebenfalls helfen.
Verwenden Sie die Methode RBXScriptConnection:Disconnect(), um zu verhindern, dass Funktionen unnötig beim nächsten Auslösen eines Ereignisses aufgerufen werden.
Rufen Sie nicht die gleiche Methode jedes Mal auf, wenn Sie einen Wert benötigen. Rufen Sie die Methode einmal auf, speichern Sie den Wert und überschreiben Sie ihn später nach Bedarf.
Speichern Sie nicht alles in ReplicatedStorage. Der Client lädt alles, was sich in diesem Container befindet. Verwenden Sie stattdessen ServerStorage für alles, auf das der Client keinen Zugriff benötigt.