W grze streaming instancji pozwala silnikowi Roblox dynamicznie ładować i usuwać zawartość 3D oraz powiązane instancje w Workspace. Może to poprawić ogólne doświadczenie gracza na kilka sposobów, w tym:
- Szybsze czasy dołączenia— Gracze mogą zacząć grać w jednej części świata, podczas gdy więcej świata ładowane jest w tle.
- Efektywność pamięci— Gry mogą być uruchamiane na urządzeniach z mniejszą pamięcią, ponieważ zawartość jest dynamicznie przesyłana w i na zewnątrz. Bardziej immersywne i szczegółowe światy mogą być odtwarzane na szerszym zakresie urządzeń.
- Poprawiona wydajność— Lepsze liczby klatek na sekundę i wydajność, ponieważ serwer może spędzać mniej czasu i pasma na synchronizowaniu zmian między światem a graczami w nim. Klienci spędzają mniej czasu na aktualizowaniu instancji, które nie są obecnie istotne dla gracza.
- Poziom szczegółowości— Po skonfigurowaniu, odległe modele, awatary platformy i teren pozostają widoczne, nawet gdy nie są przesyłane do klientów, co pozwala na optymalizację gry bez całkowitego poświęcania wizualizacji w tle. SLIM zapewnia najwyższy poziom szczegółowości zarówno dla modeli, jak i awatarów.
Streaming instancji jest kontrolowany przez właściwość Workspace.StreamingEnabled, która jest domyślnie włączona dla nowych miejsc tworzonych w Studio. Ta właściwość nie może być ustawiana w skrypcie.

Zachowanie techniczne
Zakres
Logika i funkcje streamingu mają zastosowanie wyłącznie do instancji, które są potomkami Workspace, podczas gdy instancje przechowywane w innych kontenerach, takich jak ReplicatedStorage i ReplicatedFirst, nie kwalifikują się do streamingu. Na przykład umieszczenie modelu atomowego w ReplicatedStorage nie gwarantuje atomowej replikacji.
Streaming w
Gdy gracz dołącza do gry z włączonym streamingiem instancji:
Instancje w Workspace są replikowane do klienta z wyłączeniem następujących:

Models ustawione na Atomowy, Trwały lub TrwałyNaGracza; zobacz kontrole streamingu per model

Models ustawione na Nieatomowy (domyślnie), gdy Workspace.ModelStreamingBehavior jest ustawione na Improved

Potomkowie powyższych instancji
W trakcie rozgrywki serwer może przesyłać instancje z powyższych kategorii opóźnionych do klienta w zależności od właściwości streamingu, pozycji gracza, wydajności urządzenia klienckiego i innych warunków.
Streaming out
W trakcie rozgrywki klient może usunąć regiony BaseParts z Workspace gracza w zależności od zachowania ustawionego przez Workspace.StreamOutBehavior. Proces zaczyna się od regionów najdalej od fokusu replikacji i przesuwa się bliżej, w razie potrzeby. Regiony wewnątrz zakresu Workspace.StreamingMinRadius nigdy nie są przesyłane.
Należy zauważyć, że Model bez potomków BasePart, na przykład używany jedynie jako "kontener" dla instancji nie będących BasePart, takich jak skrypty, jest zwolniony z przesyłania chyba że stanie się potomkiem BasePart.
Zespoły
Fizyczne zespoły przesyłają w jako kompletne jednostki, w tym ich powiązane Constraints i Attachments, co pomaga zapewnić spójne aktualizacje fizyki na klientach. Jedynym wyjątkiem jest sytuacja, gdy zespół jest zakotwiczony, w takim przypadku tylko BaseParts w zasięgu streamingu są przesyłane wraz z ich powiązanymi Constraints i Attachments.
Zespoły nie są przesyłane na zewnątrz, dopóki wszystkie ich BaseParts nie są kwalifikowane do przesyłania na zewnątrz.
Właściwości streamingu
Następujące właściwości kontrolują, jak streaming instancji ma zastosowanie do twojej gry. Wszystkie te właściwości są nie-skróty i muszą być ustawione na obiekcie Workspace w Studio.

| Właściwość | Opis |
|---|---|
| EnableSLIMAvatars | Kontroluje, czy model SLIM jest generowany dla postaci awatarów w grze. Gdy jest włączony, awatary renderują się przy użyciu SLIM w ten sam sposób, w jaki ustawienie Model.LevelOfDetail na SLIM działa dla innych modeli. Zobacz SLIM po szczegóły. |
| ModelStreamingBehavior | Kontroluje, jak modele Nieatomowe (domyślnie) przesyłają się w i na zewnątrz. Zalecane Użyj Improved, aby włączyć najefektywniejszy streaming dla Models z potomkami BasePart. |
| PredictiveStreamingMode | Włącza streaming predykcyjny, który wykorzystuje sygnały silnika do proaktywnego przesyłania obszarów, które gracz prawdopodobnie będzie potrzebował wkrótce, takich jak miejsca respawnu lub regiony, które gracz niedawno opuścił poprzez zmianę CFrame. Przewidywania są dodawane, wygasają po krótkim czasie, jeśli nie są używane, i są pomijane na urządzeniach z ograniczonymi zasobami. |
| StreamingIntegrityMode | Gra może zachowywać się w niezamierzony sposób, jeśli gracz wchodzi w region świata, który nie został przesłany do niego. Ta właściwość oferuje sposób na uniknięcie tych potencjalnie problematycznych sytuacji. Zalecane Użyj PauseOutsideLoadedArea, aby zrównoważyć integralność rozgrywki bez niepotrzebnego lub zbyt częstego wstrzymywania. Możesz również dostosować ekran wstrzymania. |
| StreamingMinRadius | Ta właściwość wskazuje promień wokół fokusu replikacji, w którym instancje przesyłają się z najwyższym priorytetem. Należy zachować ostrożność przy zwiększaniu wartości domyślnej, ponieważ może to wymagać więcej pamięci i większej przepustowości serwera kosztem innych komponentów. Zalecane Użyj domyślnej wartości 64, aby zmaksymalizować, jak bardzo silnik może zmniejszyć grę dla urządzeń niskobudżetowych. |
| StreamingTargetRadius | Ta właściwość kontroluje maksymalną odległość od fokusu replikacji, w której instancje są przesyłane. Należy zauważyć, że silnik ma prawo zachować wcześniej załadowane instancje poza promieniem docelowym, o ile pozwala na to pamięć. Mniejsza wartość StreamingTargetRadius zmniejsza obciążenie serwera, ponieważ serwer nie będzie przesyłał dodatkowych instancji poza ustawioną wartość. Jednak promień docelowy jest również maksymalną odległością, z jakiej gracze będą mogli zobaczyć pełne szczegóły twojej gry, więc powinieneś wybrać wartość, która tworzy dobrą równowagę między tymi dwoma. Zalecane Użyj domyślnej wartości 1024, aby osiągnąć dobrą równowagę między widocznością dla graczy na urządzeniach wysokobudżetowych a rozsądnym zużyciem pamięci. |
| StreamOutBehavior | Ta właściwość ustawia zachowanie streamingu na zewnątrz zgodnie z wartością Enum.StreamOutBehavior. Jeśli ustawiona na LowMemory (domyślnie), klient przesyła tylko regiony poza minimalnym promieniem w sytuacji niskiej pamięci. Jeśli ustawiona na Opportunistic, regiony poza StreamingTargetRadius mogą być usuwane na kliencie, nawet gdy nie ma presji pamięci (w tym trybie klient nigdy nie usuwa instancji, które są w obrębie promienia docelowego, z wyjątkiem sytuacji niskiej pamięci). Zalecane Użyj Opportunistic, aby pozwolić klientowi agresywnie zbierać nieużywaną zawartość, znacznie zmniejszając zużycie pamięci i pomagając zapobiegać awariom z powodu braku pamięci. |
Fokus replikacji
Domyślnie streaming odbywa się wokół PrimaryPart postaci lokalnego gracza, chociaż możesz określić inny punkt fokusu replikacji przez Player.ReplicationFocus.
Możesz również dodawać i usuwać dodatkowe foki replikacji przez Player:AddReplicationFocus() i Player:RemoveReplicationFocus(), aby dynamicznie włączyć streaming w wielu obszarach gry.
Symulacja fizyki po stronie klienta, w tym przewidywanie i ponowne symulacje, gdy wprowadzona jest autorytet serwera, odbywa się tylko w przesyłanych obszarach, nawet dla instancji tworzonych lokalnie i dla instancji Persistent. Jeśli masz instancje, które chciałbyś, aby nadal symulowały się, nawet gdy są daleko od postaci, utwórz dodatkowy fokus replikacji w pobliżu tych instancji.
Streaming predykcyjny
Streaming predykcyjny to funkcja, która wymaga aktywacji i wykorzystuje sygnały silnika do przewidywania ruchu gracza oraz proaktywnego przesyłania obszarów, które gracz prawdopodobnie będzie potrzebował wkrótce. Gdy jest włączony przez ustawienie PredictiveStreamingMode na Enabled, może zmniejszyć przerwy w streamingu i wizualne pojawianie się zawartości bez jakichkolwiek zmian w kodzie.
Streaming predykcyjny jest dodawany. Tworzy małe, tymczasowe foki streamingu oprócz istniejących fokusu replikacji, przesyła niewielką ilość dodatkowej zawartości i nie zmienia logiki gry ani umów dotyczących streamingu. Jeśli przewidywanie nie jest potrzebne, przewidywany obszar wygasa po krótkim czasie, a silnik usuwa zawartość. Silnik uwzględnia również pamięć i wydajność klienta, pomijając przewidywania na urządzeniach z ograniczonymi zasobami.
Gdy PredictiveStreamingMode jest ustawione na Enabled, następujące funkcje predykcyjne są aktywne:
| Funkcja | Opis |
|---|---|
| Wstępne pobieranie respawnu | Gdy gracz umiera, silnik tworzy małe, tymczasowe foki streamingu w możliwych lokalizacjach respawnu, aby prawdopodobne obszary respawnu zaczęły się przesyłać przed pojawieniem się postaci gracza, co zmniejsza przerwy i brakującą zawartość tuż po respawnie. |
| Optymalizacja zwrotu CFrame | Gdy gracz jest CFrames z dala od obszaru, silnik tworzy mały, tymczasowy fokus streamingu w miejscu, które opuścił. Pomaga to utrzymać ten obszar przesyłanym, jeśli gracz wróci krótko po, co jest powszechnym scenariuszem podczas poruszania się między budynkami, podziemi, sklepami lub hubami. |
Kontrole streamingu modeli
Aby uniknąć problemów z przesyłaniem na poziomie modelu i zminimalizować użycie WaitForChild(), możesz dostosować sposób, w jaki Models i ich potomkowie są przesyłani przez ich właściwość ModelStreamingMode.
Nieatomowy
Domyślnie modele są Nonatomic i przesyłają się w i na zewnątrz w zależności od tego, czy Workspace.ModelStreamingBehavior jest ustawione na Legacy (domyślnie) lub Improved.
Legacy
Gdy Workspace.ModelStreamingBehavior jest ustawione na Legacy (domyślnie), kontener Model i jego nie‑BasePart potomkowie, tacy jak Scripts, replikują się do klienta, gdy gracz dołącza. Następnie, gdy są kwalifikowane, potomkowie BasePart modelu przesyłają się.

Ulepszony
Gdy Workspace.ModelStreamingBehavior jest ustawione na Improved, zachowanie streamingu modeli różni się w zależności od tego, czy model zawiera potomków BasePart, czy nie:
Model z potomkami BasePart przesyła się w tylko wtedy, gdy jeden z jego potomków BasePart jest kwalifikowany do przesyłania. W tym momencie model i kwalifikowany BasePart przesyłają się, wraz z nie‑BasePart potomkami modelu.
Gdy ostatni pozostały BasePart modelu przesyła się na zewnątrz, sam model również przesyła się na zewnątrz.

Atomowy
Jeśli Model jest ustawione na Atomic, wszystkie jego początkowe potomkowie są przesyłani razem, gdy potomny BasePart jest kwalifikowany do przesyłania. W rezultacie skrypt po stronie klienta, który potrzebuje uzyskać dostęp do instancji wewnątrz modelu, musiałby użyć WaitForChild() na samym modelu, ale nie na potomnym MeshPart lub Part, ponieważ są one przesyłane razem z modelem.
Atomowy model jest przesyłany na zewnątrz tylko wtedy, gdy wszystkie jego części potomne są kwalifikowane do przesyłania na zewnątrz, w tym momencie cały model przesyła się na zewnątrz.

Trwały
Modele Persistent nie podlegają normalnemu przesyłaniu w i na zewnątrz. Są przesyłane jako kompletny atomowy jednostka wkrótce po dołączeniu gracza i przed wywołaniem zdarzenia Workspace.PersistentLoaded. Trwałe modele i ich potomkowie nigdy nie są przesyłane na zewnątrz, ale aby bezpiecznie obsługiwać przesyłanie w ramach skryptu po stronie klienta, powinieneś poczekać na wywołanie zdarzenia PersistentLoaded.

TrwałyNaGracza
Modele ustawione na PersistentPerPlayer zachowują się tak samo jak Persistent dla graczy, którzy zostali dodani za pomocą Model:AddPersistentPlayer(). Dla innych graczy zachowanie jest takie samo jak Atomic. Możesz cofnąć model z trwałości gracza za pomocą Model:RemovePersistentPlayer().
Dostosowanie ekranu wstrzymania
Zakładając, że Workspace.StreamingIntegrityMode jest ustawione na zalecane PauseOutsideLoadedArea, gra zostanie wstrzymana, jeśli gracz wejdzie w region świata, który nie został przesłany do niego. W takich przypadkach właściwość Player.GameplayPaused wskazuje aktualny stan wstrzymania gracza, który można wykorzystać z połączeniem GetPropertyChangedSignal(), aby pokazać lub ukryć niestandardowy interfejs GUI.
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Wyłącz domyślny modal wstrzymania
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Pokaż niestandardowy GUI
else
-- Ukryj niestandardowy GUI
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)Debugowanie w czasie rzeczywistym
Silnik zawiera wiele paneli debugowania na ekranie, które można włączyć po stronie klienta za pomocą skrótów klawiaturowych. Aby uzyskać dostęp do informacji debugowania streamingu:
- Otwórz nakładkę debugowania Podsumowanie sieci za pomocą ShiftCtrlF3 (Windows) lub Shift⌘F3 (Mac).
- Gdy nakładka debugowania jest otwarta, naciśnij Shift1 wielokrotnie, aby przełączać się między dostępnymi panelami. Czwarty panel to widok debugowania Streamingu, który wyświetla przydatne informacje w czasie rzeczywistym:
- Aktywne ustawienia streamingu
- Obecnie załadowane (przesyłane) regiony
- Zachowanie i stan streamingu
Po włączeniu, kolorowe podświetlone regiony pojawiają się w widoku 3D:
| Kolor | Opis |
|---|---|
| Mniej niż StreamingMinRadius | |
| Więcej niż lub równo StreamingMinRadius i mniej niż StreamingTargetRadius | |
| Równo StreamingTargetRadius | |
| Więcej niż StreamingTargetRadius |
