Strumieniowanie instancji

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

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.

Okno Właściwości z włączoną właściwością StreamingEnabled.

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:

  1. Instancje w Workspace są replikowane do klienta wykluczając następujące:

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

    Potomkowie powyższych instancji.

  2. 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
EnableSLIMAvatarsKontroluje, 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.
ModelStreamingBehaviorKontroluje 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.
StreamingIntegrityModeGra 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.
StreamingMinRadiusTa 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.
StreamingTargetRadiusTa 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.
StreamOutBehaviorTa 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 nieBasePart 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 nieBasePart potomkami modelu.

    Gdy ostatni pozostały BasePart modelu jest usuwany ze strumienia, sam model zostanie usunięty ze strumienia razem z nim.

  • Model bez potomków BasePart, używany jedynie jako "kontener" dla instancji nie będących BasePart, replikuję się do klienta krótko po dołączeniu gracza. Tego typu model jest wyłączony z usuwania ze strumienia chyba że stanie się potomkiem BasePart.

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.

Diagram ilustrujący strumieniowanie modelu atomowego wraz z dziećmi.

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.

Diagram ilustrujący strumieniowanie modelu trwałego wraz z dziećmi.

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:

  1. Otwórz nakładkę debugowania Podsumowanie sieci przez ShiftCtrlF3 (Windows) lub ShiftF3 (Mac).

  2. 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:

KolorOpis
Mniej niż StreamingMinRadius
Więcej lub równo StreamingMinRadius i mniej niż StreamingTargetRadius
Równo StreamingTargetRadius
Więcej niż StreamingTargetRadius
©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.