Streamowanie 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.

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.

The Properties window with the StreamingEnabled property enabled.

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:

Następnie, podczas rozgrywka, serwer może przesyłać niezbędne instancje do klienta, tak jak są potrzebne.

Diagram showing when various instances and their descendants in the Workspace stream in.
1 Teren jest traktowany wyjątkowo, ponieważ instancja replikuje się do klienta, gdy doświadczenie się ładuje, ale regiony terenu przesyłają się tylko wtedy, gdy jest to 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 .

The Properties window with the ModelStreamingBehavior property set to Default.

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ą.

Diagram showing default model stream in behavior.

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:

ScenariuszPrzykładZachowanie 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.

The Properties window with the ModelStreamingBehavior property set to Improved.

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żeniaZachowanie strumieniowania
Tylko niezakotwiczone częściCała złożenie jest wysyłana jako jednostka atomowa.
Zakotwiczone części korzenneTylko 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.

ScenariuszPrzykładZachowanie strumieniowania
A LocalScript tworzy wezwanie do serwera RemoteFunction w celu utworzenia częściGracz 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.

The Properties window with the ModelStreamingBehavior, StreamingIntegrityMode, StreamingMidRadius, StreamingTargetRadius, and StreamOutBehavior property highlighted.

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:

UstawienieZachowanie 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.

The Properties window with the ModelStreamingMode property set to Default. The property is also highlighted.

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 .

ModelStreamingZachowanieZachowanie 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.

A diagram showing Atomic model streaming along with children.
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ępne
local meshPart = model.MeshPart
local 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.

A diagram showing Persistent model streaming along with children.
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ępne
local meshPart = model.MeshPart
local 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 zdalne
teleportEvent: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:

  1. 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.

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

    local 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ątrz
    for _, light in CollectionService:GetTagged(tagName) do
    flickerSources[light] = true
    end
    CollectionService:GetInstanceAddedSignal(tagName):Connect(function(light)
    flickerSources[light] = true
    end)
    CollectionService:GetInstanceRemovedSignal(tagName):Connect(function(light)
    flickerSources[light] = nil
    end)
    -- Pętla migotania
    while true do
    for light in flickerSources do
    light.Brightness = 8 + random:NextNumber(-0.4, 0.4)
    end
    task.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.

LevelOfDetail property indicated for Model instance
A globe model displays in its actual level of detail.

Model aktualny
>

The same globe model displays as a low resolution imposter mesh with rough edges that obscure the globe's details.

Niska rozdzielczość siatki "impostera"
>

Ustawienie modeluZachowanie 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ę.