W grze strumieniowanie instancji pozwala silnikowi Roblox na dynamiczne ładowanie i odładowywanie treści 3D oraz powiązanych instancji w Workspace. Może to poprawić ogólne doświadczenia graczy 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ć odtwarzane na urządzeniach o mniejszej pamięci, ponieważ treści są dynamicznie przesyłane. Bardziej immersywne i szczegółowe światy mogą być odtwarzane na szerszym zakresie urządzeń.
- Poprawiona wydajność— Lepsza liczba klatek na sekundę i wydajność, ponieważ serwer może spędzać mniej czasu i pasma na synchronizowanie zmian między światem a graczami w nim. Klienci spędzają mniej czasu na uaktualnianiu instancji, które nie są aktualnie 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 utrzymać grę w optymalnym stanie bez całkowitego poświęcania wizualizacji tła.
Strumieniowanie instancji jest kontrolowane za pomocą właściwości Workspace.StreamingEnabled, domyślnie włączonej dla nowych miejsc tworzonych w Studio. Ta właściwość nie może być ustawiona w skrypcie.

Zachowanie techniczne
Zakres
Logika strumieniowania i funkcje stosują się wyłącznie do instancji będących potomkami Workspace, podczas gdy instancje przechowywane w innych kontenerach, takich jak ReplicatedStorage i ReplicatedFirst, nie kwalifikują się do strumieniowania. Na przykład umieszczenie modelu atomowego w ReplicatedStorage nie gwarantuje atomowej replikacji.
Strumień w
Gdy gracz dołącza do gry z włączonym strumieniowaniem instancji:
Instancje w Workspace są replikowane do klienta wykluczając następujące:

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

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

Potomkowie powyższych instancji.
Podczas rozgrywki serwer może strumieniować instancje w powyższych kategoriach odwlekanych do klienta, w zależności od właściwości strumieniowania, pozycji gracza, wydajności urządzenia klienckiego oraz innych warunków.
Strumień out
Podczas rozgrywki klient może usuwać 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, według potrzeb. Regiony wewnątrz zakresu Workspace.StreamingMinRadius nigdy nie będą usuwane.
Należy pamiętać, że Model, który nie ma potomków BasePart, takich jak model używany tylko jako "kontener" dla instancji nie będących BasePart, jest wyłączony z strumieniowania chyba że stanie się potomkiem BasePart.
Zestawy
Fizyczne zestawy strumieniują w jako kompletne jednostki, łącznie z ich powiązanymi Constraints i Attachments, co pomaga zapewnić spójne aktualizacje fizyki po stronie klientów. Jedynym wyjątkiem jest, gdy zestaw jest zakotwiczony, w takim przypadku tylko BaseParts w promieniu przesyłania są przesyłane wraz z ich powiązanymi Constraints i Attachments.
Zestawy nie są strumieniowane out, dopóki wszystkie ich BaseParts nie kwalifikują się do usunięcia ze strumienia.
Właściwości strumieniowania
Poniższe właściwości kontrolują, jak strumieniowanie instancji ma zastosowanie do twojej gry. Wszystkie te właściwości są nieskryptowe i muszą być ustawione w obiekcie Workspace w Studio.

| Właściwość | Opis |
|---|---|
| EnableSLIMAvatars | Kontroluje, czy generowany jest model SLIM dla postaci awatarów w grze. Po włączeniu, awatary są renderowane przy użyciu SLIM w taki sam sposób, jak ustawienie Model.LevelOfDetail na SLIM działa dla innych modeli. |
| ModelStreamingBehavior | Kontroluje sposób w jaki modele Nieatomowe (domyślnie) są przesyłane do strumienia i z niego. ZALECANE Użyj Improved, aby włączyć najefektywniejsze strumieniowanie dla Models z potomkami BasePart. |
| StreamingIntegrityMode | Gra może zachowywać się w niezamierzony sposób, jeśli gracz wejdzie do regionu świata, który nie został do niego przesłany. Ta właściwość oferuje sposób na uniknięcie potencjalnie problematycznych sytuacji. ZALECANE Użyj PauseOutsideLoadedArea, aby zrównoważyć integralność rozgrywki bez zbędnego zatrzymywania lub zbyt częstego przerywania. Możesz również dostosować ekran przerwy. |
| StreamingMinRadius | Ta właściwość wskazuje promień wokół fokusu replikacji, w którym instancje są przesyłane ze szczególnym priorytetem. Należy zachować ostrożność przy zwiększaniu wartości domyślnej, ponieważ może to wymagać więcej pamięci i więcej przepustowości serwera kosztem innych komponentów. ZALECANE Użyj wartości domyślnej 64, aby zoptymalizować możliwości silnika w skalowaniu gry dla urządzeń o niskiej wydajności. |
| StreamingTargetRadius | Ta właściwość kontroluje maksymalną odległość od fokusu replikacji, w której instancje są przesyłane. Należy pamiętać, że silnik może zachować wcześniej załadowane instancje poza promieniem docelowym, jeśli pamięć na to pozwala. Mniejsza wartość StreamingTargetRadius zmniejsza obciążenie serwera, ponieważ serwer nie będzie przesyłał więcej instancji ponad ustaloną wartość. Jednak promień docelowy jest również maksymalną odległością, w jakiej gracze będą mogli zobaczyć pełne detale twojej gry, więc warto wybrać wartość, która tworzy dobry balans między tymi aspektami. ZALECANE Użyj domyślnej wartości 1024, aby uzyskać dobry balans między widocznością dla graczy na urządzeniach o wysokiej wydajności a rozsądnym wykorzystaniem pamięci. |
| StreamOutBehavior | Ta właściwość ustawia zachowanie strumieniowania out zgodnie z wartością Enum.StreamOutBehavior. Jeśli ustawione na LowMemory (domyślnie), klient przesyła tylko regiony wykraczające poza minimalny promień w sytuacji niskiej pamięci. Jeśli ustawione na Opportunistic, regiony poza StreamingTargetRadius mogą być usuwane przez klienta, nawet gdy nie ma presji pamięci (w tym trybie klient nigdy nie usuwa instancji, które znajdują się w promieniu docelowym, z wyjątkiem sytuacji niskiej pamięci). ZALECANE Użyj Opportunistic, aby pozwolić klientowi na agresywne usuwanie zasobów, znacznie zmniejszając zużycie pamięci i pomagając zapobiec awariom z powodu braku pamięci. |
Fokus replikacji
Domyślnie, strumieniowanie odbywa się wokół PrimaryPart postaci lokalnego gracza, chociaż można określić inny punkt fokusowy replikacji za pomocą Player.ReplicationFocus.
Możesz również dodawać i usuwać dodatkowe punkty fokusowe replikacji za pomocą Player:AddReplicationFocus() i Player:RemoveReplicationFocus(), aby dynamicznie włączać strumieniowanie w wielu obszarach gry.
Symulacja fizyki po stronie klienta, w tym predykcja i resymulacja, gdy stosowany jest autorytet serwera, odbywa się tylko w strumieniowanych obszarach, nawet dla instancji stworzonych lokalnie i dla instancji Persistent. Jeśli masz instancje, które chciałbyś, aby kontynuowały symulację, nawet gdy są daleko od postaci, stwórz dodatkowy punkt fokusowy replikacji w pobliżu tych instancji.
Kontrole strumieniowania modeli
Aby uniknąć problemów z strumieniowaniem w skali modelu i zminimalizować użycie WaitForChild(), możesz dostosować sposób strumieniowania Models i ich potomków przez właściwość ModelStreamingMode.
Nieatomowy
Domyślnie modele są Nonatomic i przesyłają się na podstawie tego, czy Workspace.ModelStreamingBehavior jest ustawione na Legacy (domyślnie) lub Improved.
Klasyczny
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 strumieniowania modelu różni się w zależności od tego, czy model zawiera potomków BasePart, czy ich nie zawiera:
Model z potomkami BasePart przesyła się w tylko wtedy, gdy jedna z jego potomków BasePart jest kwalifikowana do przesłania. W tym momencie model oraz kwalifikowany BasePart przesyłają się, wraz z nie‑BasePart potomkami modelu.
Gdy ostatni pozostały BasePart modelu jest usuwany ze strumienia, sam model zostanie usunięty ze strumienia razem z nim.

Atomowy
Jeśli model Model jest ustawiony na Atomic, wszystkie jego początkowe potomki są przesyłane razem, gdy potomny BasePart kwalifikuje się do przesł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 wysyłane wraz z modelem.
Model atomowy jest przesyłany out tylko wtedy, gdy wszystkie jego części potomne są kwalifikowane do przesyłania, w którym to momencie cały model jest przesyłany razem.

Trwały
Modele Persistent nie podlegają normalnemu strumieniowaniu wewnątrz lub na zewnątrz. Są przesyłane jako kompletny atomowy jednostka krótko po dołączeniu gracza i przed wywołaniem zdarzenia Workspace.PersistentLoaded. Modele trwałe i ich potomkowie nigdy nie są usuwane ze strumienia, ale aby bezpiecznie zarządzać strumieniowaniem w skrypcie po stronie klienta, należy 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 same jak w przypadku Atomic. Możesz wycofać model z persystencji gracza przez Model:RemovePersistentPlayer().
Dostosowanie ekranu pauzy
Zakładając, że Workspace.StreamingIntegrityMode jest ustawione na zalecany PauseOutsideLoadedArea, gra wstrzyma się, jeśli gracz wejdzie do regionu świata, który nie został do niego przesłany. W takich przypadkach właściwość Player.GameplayPaused wskazuje aktualny stan pauzy gracza, który można wykorzystać w połączeniu z sygnałem GetPropertyChangedSignal() do pokazywania lub ukrywania niestandardowego GUI.
LocalScript
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Dezaktywacja domyślnego okna pauzy
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Pokaż niestandardowe GUI
else
-- Ukryj niestandardowe GUI
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
Debugowanie w czasie rzeczywistym
Silnik zawiera wiele paneli debugowych, które można włączyć po stronie klienta za pomocą skrótów klawiaturowych. Aby uzyskać dostęp do informacji debugowych strumieniowania:
Otwórz nakładkę debugowania Podsumowanie sieci przez 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 Strumieniowanie widok debugowy, który wyświetla przydatne informacje w czasie rzeczywistym:
- Aktywne ustawienia strumieniowania
- Aktualnie załadowane (wstrumieniowane) regiony
- Zachowanie strumieniowania i stan
Po włączeniu, na 3D wyświetlają się kolorowe podświetlone regiony:
| Kolor | Opis |
|---|---|
| Mniej niż StreamingMinRadius | |
| Więcej lub równo StreamingMinRadius i mniej niż StreamingTargetRadius | |
| Równo StreamingTargetRadius | |
| Więcej niż StreamingTargetRadius |
