Transmisja instancji w doświadczeniu pozwala silnikowi Roblox na dynamiczne ładowanie i rozładowywanie treści 3D i powiązanych instancji w regionach świata .Może to poprawić ogólne doświadczenie gracza na kilka sposobów, na przykład:
- Szybsze czasy dołączania — Gracze mogą zacząć grać w jednej części świata, podczas gdy w tle ładowane jest więcej świata.
- Wydajność pamięci — Doświadczenia mogą być odtwarzane na urządzeniach z mniejszą pamięcią, ponieważ treść jest dynamicznie przesyłana i odbierana.Bardziej wciągające i szczegółowe światy można odtwarzać na szerszej gamie urządzeń.
- Poprawiona wydajność — Lepsze szybkości ram i wykonywanie, ponieważ serwer może poświęcić mniej czasu i przepustowości na synchronizację zmian między światem a graczami w nim.Klienci spędzają mniej czasu aktualizowania instancji, które nie są obecnie odpowiednie dla gracza.
- Poziom szczegółowości — odległe modele i tereny pozostają widoczne nawet wtedy, gdy nie są przesyłane do klientów, zachowując doświadczenie optymalizowane bez całkowitego poświęcania wizualizacji tła.
Włącz transmisję
Transmisja instancji jest włączona za pomocą właściwości StreamingEnabled obiektu Przestrzeń robocza w Studio.Właściwość ta nie może być ustawiona w skrypcie.Transmisja jest włączona domyślnie dla nowych miejsc utworzonych w Studio.

Po włączeniu zaleca się przestrzeganie następujących praktyk:
- Ponieważ klienty zwykle nie będą miały całej Workspace dostępnej lokalnie, użyj odpowiedniego narzędzia/API, aby upewnić się, że instancje istnieją przed próbą uzyskania do nich dostępu w LocalScript .Na przykład wykorzystaj sterowania przesyłania strumieni per modelu, wykryj przesyłanie instancji lub użyj WaitForChild() na obiektach, które mogą nie istnieć.
- Ogranicz umieszczenie treści 3D poza Workspace .Treść w kontenerach takich jak ReplicatedStorage lub ReplicatedFirst nie jest kwalifikowana do przesyłania strumieniowego i może negatywnie wpłynąć na czas dołączenia i wykorzystanie pamięci.
- Jeśli przeniesiesz postać gracza, ustawiając jego CFrame, zrób to z boku serwera Script i użyj żądań przesyłania strumieniowego, aby szybciej załadować dane wokół nowej lokalizacji postaci.
- Manualnie ustaw grę gracza ReplicationFocus tylko w unikalnych sytuacjach, takich jak w doświadczeniach, które nie używają Player.Character.W tych przypadkach upewnij się, że skupienie jest blisko obiektu(ów), których gracz kontroluje, aby zapewnić, że treść nadal przepływa wokół punktu interakcji gracza.
Zachowanie techniczne
Strumień w
Domyślnie, gdy gracz dołącza do doświadczenia z włączonym strumieniem instancji, instancje w Workspace są replikowane do klienta, wykluczając obserwuje:
- Potomkowie powyższych instancji
- Instancje nie replikujące
Następnie, podczas rozgrywka, serwer może przesyłać niezbędne instancje do klienta, tak jak są potrzebne.
Zachowanie modelu
Modele ustawione na nie domyślne zachowanie, takie jak atomowy strumień w ramach specjalnych zasad opisanych w kontrolach przepływu modeli.Jednak domyślne (nieatomowe) modele są wysyłane inaczej w zależności od tego, czy ModelStreamingBehavior jest ustawiony na Domyślny ( Dziedzictwo ) lub Ulepszony .

Gdy ModelStreamingBehavior jest ustawiony na Domyślny / Legacy , kontener Model i jego nieprzestrzenne potomki, takie jak Scripts, replikują się do klienta, gdy gracz dołącza.Następnie, gdy jest to możliwe, potomkowie modelu BasePart przepływają.
Wyemitowany
Podczas grania klient może przesyłać (usuwać z regionów gracza Workspace ) i zawarte w nich BaseParts na podstawie zachowania ustawionego przez StreamOutBehavior.Proces zaczyna się od regionów najbardziej oddalonych od postaci gracza (lub ReplicationFocus ) i przemieszcza się bliżej w miarę potrzeby.Regiony wewnątrz zakresu StreamingMinRadius nigdy nie są przesyłane.
Kiedy instancja wysyła się, jest ona powiązana z nil tak, że każde istniejące stan Luau ponownie się połączy, jeśli instancja wróci.W wyniksygnały usuwania, takie jak ChildRemoved lub DescendantRemoving ogień na swoim rodzicu lub przodku , ale sama instancja nie jest usuwana w tym samym sensie, co wezwanie Instance:Destroy().
Aby dalej przewidzieć przepływ, przeanalizuj te scenariusze:
Scenariusz | Przykład | Zachowanie strumieniowania |
---|---|---|
Część jest utworzona lokalnie za pomocą Instance.new() w LocalScript . | W grze "zatrzymaj flagę" tworzysz i przymocowujesz niebieskie części hełmu do wszystkich graczy w niebieskiej drużynie za pomocą LocalScript . | Część nie jest replikowana na serwer i jest zwolniona od przesyłania chyba że uczynisz ją potomkiem części, która istnieje na serwerze, takiej jak część w modelu postaci gracza. |
Część jest sklonowana lokalnie z ReplicatedStorage poprzez Instance:Clone() w LocalScript . | Postać czarodzieja rzuca zaklęcie, aktywując Tool, na którym klonuje się obiekt zawierający kilka efektów specjalnych z ReplicatedStorage i przenosi go do przestrzeni roboczej na pozycji czarodzieja. | Część nie jest replikowana na serwer i jest zwolniona z przesyłania chyba że uczynisz ją potomkiem części, która istnieje na serwerze. |
Część jest naprawiona z ReplicatedStorage do przestrzeni roboczej za pomocą LocalScript . | Kapelusz "czarodzieja" jest przechowywany w ReplicatedStorage .Kiedy gracz wybiera grę w drużynie czarodzieja, kapelusz jest przenoszony do modelu postaci za pomocą LocalScript . | Część pozostaje kwalifikowana do strumieniowania, ponieważ pochodziła z serwera i została replikowana do ReplicatedStorage.Unikaj tego wzorca, ponieważ powoduje on desynchronizację między klientem a serwerem, a część może przepływać; zamiast tego klonuj część. |
Zachowanie modelu
Jeśli ustawisz ModelStreamingBehavior na Ulepszony , silnik może przesyłać Domyślne ( Nienatomiastyczne ) modele, gdy są one uprawnione do przesyłania, potencjalnie uwalniając pamięć na klientzie i zmniejszając liczbę instancji, które wymagają aktualizacji właściwości.

Poniżej Ulepszony model strumieniowania zachowania, strumieniowanie z Domyślnego ( Nienaturalnego ) modeli opiera się na tym, czy model jest przestrzenny (zawiera > potomków) lub nieprzestrzenny (nie zawiera potomków).
- Model przestrzenny wyświetla się w pełni tylko wtedy, gdy jego ostatni pozostały BasePart potomek przepływa, ponieważ niektóre części modelu przestrzennego mogą być blisko gracza/koncentracji replikacji i niektóre daleko.
- Model nieprzestrzenny strumieniuje się tylko wtedy, gdy przekazuje strumień przodek, odpowiadający zachowaniu przekazywania strumieni z przeszłości.
Zbiórki i mechanizmy
Gdy co najmniej jedna część z złożenia jest kwalifikowana do strumieniowania, wszystkie części złożenia również strumieniują się.Jednak złożenie nie będzie przesyłać zewnątrz dopóki wszystkie jego części nie będą kwalifikowane do przesyłania.Podczas przesyłania wszystkie Constraints i Attachments spadające z BaseParts i atomowe lub trwałe Models również streamować, pomagając zapewnić spójne aktualizacje fizyki na klientach.
Zauważ, że zespoły z zakotwiczonego częściami są traktowane nieco inaczej niż zespoły z tylko niezakotwiczonymi częściami:
Skład złożenia | Zachowanie strumieniowania |
---|---|
Tylko niezakotwiczone części | Cała złożenie jest wysyłana jako jednostka atomowa. |
Zakotwiczone części korzenne | Tylko części, załączniki i ograniczenia potrzebne do połączenia przesyłanych części z częścią korzenną są przesyłane razem. |
Opóźnienie czasowe
Może wystąpić niewielka opóźnienie ~10 milisekund między tym, kiedy część zostanie utworzona na serwerze, a kiedy zostanie replikowana do klientów.W każdym z poniższych scenariuszy możliwe, że będziesz musiał używać WaitForChild() i innych technik zamiast domniemywać, że wydarzenia i aktualizacje właściwości zawsze występują jednocześnie z częścią przesyłania strumieniowego.
Scenariusz | Przykład | Zachowanie strumieniowania |
---|---|---|
A LocalScript tworzy wezwanie do serwera RemoteFunction w celu utworzenia części | Gracz aktywuje Tool lokalnie, aby wygenerować część na serwerze, z którą wszyscy gracze mogą interakować. | Kiedy funkcja zdalna powraca do klienta, część może jeszcze nie istnieć, mimo że część jest bliska skupieniu klienta i w obszarze przesyłanym. |
Część jest dodawana do modelu postaci na serwerze za pomocą Script i RemoteEvent jest wysyłana do klienta. | Kiedy gracz dołącza do drużyny policyjnej, część "odznaki policyjnej" przechowywana w ServerStorage zostaje sklonowana i przymocowana do modelu postaci gracza.A RemoteEvent jest wystrzeliwany i odbierany przez klient tego gracza, aby zaktualizować lokalny element interfejsu użytkownika. | Chociaż klient otrzymuje sygnał zdarzenia, nie ma gwarancji, że część została już przesłana do tego klienta. |
Część zderza się z niewidocznym regionem na serwerze i uruchamia RemoteEvent na klientzie. | Gracz wyrzuca piłkę nożną do bramki, uruchamiając wydarzenie "bramka zdobyta". | Inni gracze, którzy są blisko celu, mogą zobaczyć wydarzenie "cel zdobyty" przed tym, jak piłka zostanie przesłana do nich. |
Właściwości strumieniowe
Następujące właściwości kontrolują, w jaki sposób przepływ instancji ma zastosowanie do twojego doświadczenia.Wszystkie te właściwości są nie skryptowalne i muszą być ustawione na obiekcie Przestrzeni roboczej w Studio.

ModelStreamingZachowanie
Kontroluje, czy Domyślne ( Nieatomowe ) modele są replikowane, gdy gracz dołącza, lub są wysyłane tylko wtedy, gdy jest to konieczne.Jeśli ta właściwość jest ustawiona na Ulepszony , modele w Workspace będą wysyłane do klientów tylko w razie potrzeby, co może przyspieszyć czas dołączania.Zobacz Zachowanie techniczne dla więcej szczegółów.
Tryb integracji strumienia
Twoje doświadczenie może zachowywać się w niezamierzony sposób, jeśli gracz przeniesie się do regionu świata, który nie został przesłany do niego.Funkcja integralności przesyłania oferuje sposób uniknięcia tych potencjalnie problematycznych sytuacji.Proszę zapoznać się z dokumentacją Enum.StreamingIntegrityMode na temat szczegółów.
StreamingMinRadius
Właściwość StreamingMinRadius wskazuje promień wokół postaci gracza (lub ReplicationFocus ) w których przypadki przepływają z najwyższym priorytetem.Należy zachować ostrożność podczas zwiększania domyślnej wartości, ponieważ zrobienie tego wymaga więcej pamięci i większej przepustowości serwera kosztem innych komponentów.
Promień docelowy strumienia
Właściwość StreamingTargetRadius kontroluje maksymalną odległość od postaci gracza (lub ReplicationFocus), w której przepływa strumień.Zauważ, że silnik może zachować wcześniej załadowane instancje poza zasięgiem celu, pamiętając o możliwościach pamięci.
Mniejszy promienny cel przesyłania zmniejsza obciążenie serwera, ponieważ serwer nie będzie przesyłać w dodatkowych instancjach poza ustawioną wartością.Jednak promień docelowy to również maksymalna odległość, na jaką gracze będą w stanie zobaczyć pełny szczegół twojego doświadczenia, więc powinieneś wybrać wartość, która tworzy miły balans między tymi.
Zachowanie StreamOut
Właściwość StreamOutBehavior ustawia zachowanie przesyłania strumieniowego zgodnie z jedną z następujących wartości:
Ustawienie | Zachowanie strumieniowania |
---|---|
Domyślny | Domyślne zachowanie, obecnie takie samo jak LowMemory . |
Niski poziom pamięci | Klient wyświetla tylko części w sytuacji o niskiej pamięci i może usunąć treści 3D, dopóki nie pojawi się minimalny promień. |
Okazjonalny | Regiony poza StreamingTargetRadius mogą zostać usunięte na klientzie, nawet gdy nie ma presji pamięci.W tym trybie klient nigdy nie usuwa instancji bliższych niż promień docelowy, z wyjątkiem sytuacji o niskiej pamięci. |
elementy sterująceprzesyłania per modelu
Na poziomie globalnym właściwość ModelStreamingBehavior pozwala ci kontrolować, w jaki sposób modele są przesyłane połączeniu.Ponadto, aby uniknąć problemów z przesyłaniem na podstawie modelu i minimalizować wykorzystanie WaitForChild() , możesz dostosować sposób przesyłania Models i ich potomków za pośrednictwem ich właściwości ModelStreamingMode.

Domyślny / nieatomyczny
Gdy Model jest ustawiony na Domyślny lub Nieatomyczny , zachowanie przesyłania zmienia się w zależności od tego, czy ModelStreamingBehavior jest ustawiony na Domyślny ( Legacy ) lub Ulepszony .
ModelStreamingZachowanie | Zachowanie techniczne |
---|---|
Domyślny ( Dziedzictwo ) | Model jest replikowany, gdy dołącza gracz.Może to potencjalnie doprowadzić do wysłania większej liczby instancji podczas ładowania, przechowywania większej liczby instancji w pamięci i dodatkowej złożoności dla skryptów, które chcą uzyskać dostęp do potomków modelu.Na przykład odrębny LocalScript będzie musiał używać WaitForChild() na potomku BasePart wewnątrz modelu. |
Poprawiono | Model jest wysyłany tylko wtedy, gdy jest to konieczne, potencjalnie skracając czas dołączania. |
Zobacz zachowanie techniczne dla więcej szczegółów.
Atomowy
Jeśli Model zostanie zmienione na atomowe , wszystkie jego potomki są przesyłane razem, gdy potomek BasePart jest kwalifikowany.W wynikodrębny LocalScript, który musi mieć dostęp do instancji w modelu, musiałby używać WaitForChild() na samym modelu, ale nie na potomku MeshPart lub Part, ponieważ są wysyłane obok modelu.
Model atomowy jest przesyłany tylko wtedy, gdy wszystkie jego części potomne są uprawnione do przesyłania, po czym cały model przesyła się razem.Jeśli tylko niektóre części modelu atomowego są zwykle przesyłane, cały model i jego potomkowie pozostają na klientzie.
Lokalny skrypt
local Workspace = game:GetService("Workspace")-- Model atomowy nie istnieje w czasie ładowania; użyj WaitForChild()local model = Workspace:WaitForChild("Model")-- Części potomne przepływają z modelem i są od razu dostępnelocal meshPart = model.MeshPartlocal part = model.Part
Trwały
Trwałe modele nie podlegają normalnemu przesyłowi w lub zewnątrz.Wysyłane są jako kompletna jednostka atomowa niedługo po przyłączeniu gracza i przed wystrzeleniem wydarzenia Workspace.PersistentLoaded.Trwałe modele i ich potomkowie nigdy nie są przesyłane, ale aby bezpiecznie obsługiwać przesyłanie w ramach oddzielnego LocalScript , powinieneś użyć WaitForChild() na modelu rodzinnym lub poczekać na wystrzał wydarzenia PersistentLoaded.
Lokalny skrypt
local Workspace = game:GetService("Workspace")-- Model trwały nie istnieje w czasie ładowania; użyj WaitForChild()local model = Workspace:WaitForChild("Model")-- Części potomne przepływają z modelem i są od razu dostępnelocal meshPart = model.MeshPartlocal part = model.Part
Trwały dla gracza
Modele ustawione na PersistentPerPlayer zachowują się tak samo jak Persistent dla graczy, które zostały dodane za pomocą Model:AddPersistentPlayer().Dla innych graczy zachowanie jest takie samo jak Atomic.Możesz odwrócić model z trwałości gracza za pomocą Model:RemovePersistentPlayer() .
Żądaj strumieniowania obszaru
Jeśli ustawisz CFrame gracza do regionu, który nie jest obecnie wczytywany, przerwa streamowania wystąpi, jeśli jest włączona.Jeśli wiesz, że postać będzie przenoszona do określonego obszaru, możesz wezwać Player:RequestStreamAroundAsync(), aby serwer wysłał regiony wokół tej lokalizacji do klienta.
Następujące skrypty pokazują, jak wystrzelić zdalne wydarzenie klienta do serwera aby teleportować gracza w miejsce, wydając żądanie strumieniowania przed przeniesieniem postaci do nowego .
Skrypt - Teleportuj postać gracza
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- Żądanie strumieniowania wokół lokalizacji docelowej
player:RequestStreamAroundAsync(teleportTarget)
-- Teleportuj postać
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- Wezwij funkcję teleportacji, gdy klient wystrzeli zdarzenie zdalne
teleportEvent.OnServerEvent:Connect(teleportPlayer)
LocalScript - Wystrzelenie zdarzenia zdalnego
local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")local teleportTarget = Vector3.new(50, 2, 120)-- Wystrzel zdarzenie zdalneteleportEvent:FireServer(teleportTarget)
Wykryj przepływ instancji
W niektórych przypadkach konieczne jest wykrycie, kiedy obiekt przepływa w lub wyjdzie i reaguje na to wydarzenie.Przydatny wzór wykrywania strumieni jest następujący:
Używając sekcji Tagi właściwości instancji lub edytora Tagów w Studio, przypisz logiczny tag do wszystkich dotkniętych obiektów.
Z pojedynczego LocalScript, wykryj, kiedy oznaczony obiekt przepływa do lub z poprzez GetInstanceAddedSignal() i GetInstanceRemovedSignal(), a następnie obsługuj obiekt odpowiednio.Na przykład następujący kod dodaje oznaczone Light obiekty do pętli "flicker", gdy są przesyłane, i usuwa je, gdy są przesyłane.
LocalScript - Streamowanie wykrywania usługi kolekcjilocal CollectionService = game:GetService("CollectionService")local tagName = "FlickerLightSource"local random = Random.new()local flickerSources = {}-- Wykryj obecnie i nowe oznaczone części strumieniujące się w lub na zewnątrzfor _, light in CollectionService:GetTagged(tagName) doflickerSources[light] = trueendCollectionService:GetInstanceAddedSignal(tagName):Connect(function(light)flickerSources[light] = trueend)CollectionService:GetInstanceRemovedSignal(tagName):Connect(function(light)flickerSources[light] = nilend)-- Pętla migotaniawhile true dofor light in flickerSources dolight.Brightness = 8 + random:NextNumber(-0.4, 0.4)endtask.wait(0.05)end
Dostosuj ekran przerwy
Właściwość Player.GameplayPaused wskazuje stan przerwy obecnego gracza.Właściwość ta może być używana z połączeniem GetPropertyChangedSignal() w celu wyświetlenia lub ukrycia niestandardowego interfejsu GUI.
Lokalny skrypt
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- Wyłącz domyślną tryb przerwania
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- Pokaż niestandardowe GUI
else
-- Ukryj niestandardową GUI
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
Poziom szczegółowości modelu
Gdy transmisja jest włączona, Models poza obszarem przesyłanym obecnie nie będzie domyślnie widoczna.Jednak możesz nakazać silnikowi renderowanie niższej rozdzielczości siatek "imposter" dla modeli, które nie są obecne na klientach za pośrednictwem właściwości LevelOfDetail każdego modelu.



Ustawienie modelu | Zachowanie strumieniowania |
---|---|
Sieć strumieniowa | Aktywuje asynchroniczne generowanie siatki oszusta do wyświetlenia, gdy model nie jest obecny na klientach. |
Wyłączone / Automatyczne | Model znika poza zasięgiem strumienia. |
Podczas używania siatek oszustów zauważ obserwujekwestie:
- Sieci oszustów są przeznaczone do oglądania na odległości 1024 metrów od kamery lub dalej.Jeśli zmniejszyłeś Promocyjny cel docelowy do znacznie mniejszej wartości, takiej jak 256, oszukańcze siatki mogą nie być wizualnie akceptowalne dla modelu, który zastępują.
- Jeśli model i jego modele potomne są wszystkie ustawione na StreamingMesh , tylko najwyższy model przodka jest renderowany jako model oszusta, który owija wszystkie geometrie pod przodkiem, a także jego modele potomne.Aby uzyskać lepsze wykonywanie, zaleca się użycie Wyłączone dla modeli potomnych.
- Nie wspiera się tekstur; siatki oszustów są renderowane jako gładkie siatki.
- Choć Model nie jest w pełni przesłany, siatka oszusta jest renderowana zamiast poszczególnych części modelu.Gdy wszystkie poszczególne części zostaną przesłane, renderują się i ignoruje się siatkę oszusta.
- Sieci oszustów nie mają żadnego znaczenia fizycznego i działają jako niewystępujące w odniesieniu do raycastingu, wykrywania kolizji i symulacji fizycznej.
- Edytowanie modelu w Studio, takie jak dodawanie/usuwanie/przesuwanie części dzieci lub zmienianie kolorów, automatycznie aktualizuje reprezentacyjną siatkę.