ในเกม การสตรีม instance ช่วยให้เอนจิน Roblox โหลดและปลดโหลดเนื้อหา 3 มิติและ instance ที่เกี่ยวข้องใน Workspace แบบไดนามิก ซึ่งสามารถปรับปรุงประสบการณ์การเล่นของผู้เล่นในหลาย ๆ ด้าน รวมถึง:
- เวลาการเข้าร่วมที่เร็วขึ้น— ผู้เล่นสามารถเริ่มเล่นในส่วนหนึ่งของโลกในขณะที่โลกส่วนที่เหลือโหลดอยู่ในพื้นหลัง
- ประสิทธิภาพการใช้หน่วยความจำ— สามารถเล่นเกมบนอุปกรณ์ที่มีหน่วยความจำน้อยลง โดยเนื้อหาจะถูกสตรีมเข้าและออกแบบไดนามิกได้ โลกที่ดื่มด่ำและมีรายละเอียดมากขึ้นสามารถเล่นได้ในอุปกรณ์ที่หลากหลายมากขึ้น
- ประสิทธิภาพที่ดีขึ้น— อัตราเฟรมและประสิทธิภาพที่ดีกว่า เนื่องจากเซิร์ฟเวอร์สามารถใช้เวลาและแบนด์วิธน้อยลงในการซิงโครไนซ์การเปลี่ยนแปลงระหว่างโลกและผู้เล่นในนั้น คลายเออร์ใช้เวลาน้อยลงในการอัปเดต instance ที่ไม่เกี่ยวข้องกับผู้เล่นในขณะนั้น
- ระดับของรายละเอียด— เมื่อกำหนดค่า โมเดลที่อยู่ไกล อวาตาร์ของแพลตฟอร์ม และภูมิประเทศจะยังคงมองเห็นได้แม้ว่าจะไม่มีการสตรีมไปยังคลายเออร์ก็ตาม ทำให้เกมมีประสิทธิภาพโดยไม่เสียสละภาพพื้นหลังทั้งหมด
การสตรีม instance จะถูกควบคุมโดยคุณสมบัติ Workspace.StreamingEnabled ซึ่งเปิดใช้งานโดยค่าเริ่มต้นสำหรับสถานที่ใหม่ที่สร้างใน Studio คุณสมบัตินี้ไม่สามารถตั้งค่าได้ในสคริปต์

พฤติกรรมทางเทคนิค
ขอบเขต
ลอจิกและฟีเจอร์ของการสตรีมจะใช้เฉพาะกับ instance ที่เป็นลูกหลานของ Workspace ขณะที่ instance ที่เก็บอยู่ในคอนเทนเนอร์อื่น ๆ เช่น ReplicatedStorage และ ReplicatedFirst จะไม่สามารถเข้าถึงการสตรีมได้ ตัวอย่างเช่น การวางโมเดล atomic ใต้ ReplicatedStorage ไม่สามารถรับประกันการจำลองแบบ atomic ได้
สตรีมเข้า
เมื่อผู้เล่นเข้าร่วมเกมที่เปิดใช้งานการสตรีม instance:
instance ใน Workspace จะถูกจำลองไปที่คลายเออร์ ยกเว้น ดังต่อไปนี้:

Models ที่ตั้งค่าเป็น Atomic, Persistent, หรือ PersistentPerPlayer; ดู การควบคุมการสตรีมต่อโมเดล

Models ที่ตั้งค่าเป็น Nonatomic (ค่าเริ่มต้น) เมื่อ Workspace.ModelStreamingBehavior ตั้งค่าเป็น Improved

ลูกหลานของ instance เหล่านี้
ในระหว่างการเล่นเกม เซิร์ฟเวอร์อาจสตรีม instance ในหมวดหมู่ที่เลื่อนออกไปข้างต้นไปที่คลายเออร์ขึ้นอยู่กับ คุณสมบัติการสตรีม, ตำแหน่งของผู้เล่น, ประสิทธิภาพของคลายเออร์และเงื่อนไขอื่น ๆ
สตรีมออก
ในระหว่างการเล่นเกม คลายเออร์อาจลบภูมิภาคของ BaseParts ออกจาก Workspace ของผู้เล่นตามพฤติกรรมที่ตั้งค่าโดย Workspace.StreamOutBehavior การดำเนินการเริ่มต้นจากภูมิภาคที่อยู่ห่างไกลจาก จุดเน้นการจำลองแบบ และเคลื่อนเข้ามาใกล้ตามความจำเป็น ภูมิภาคภายในช่วง Workspace.StreamingMinRadius จะไม่ถูกสตรีมออก
โปรดทราบว่า Model ที่ไม่มีลูกหลาน BasePart เช่น โมเดลที่ใช้เป็น "คอนเทนเนอร์" สำหรับ instance ที่ไม่ใช่ BasePart เช่น สคริปต์ จะ ยกเว้น จากการสตรีมออก เว้นแต่ จะทำให้มันเป็นลูกหลานของ BasePart
การประกอบ
การประกอบ ทางกายภาพ จะถูกสตรีม เข้า เป็นหน่วยที่สมบูรณ์รวมถึง Constraints และ Attachments ที่เกี่ยวข้องช่วยให้มั่นใจได้ว่าจะได้รับการอัปเดตกายภาพที่สอดคล้องกันบนคลายเออร์ ข้อยกเว้นเพียงประการเดียวคือเมื่อการประกอบถูก ยึด ในกรณีนั้นเฉพาะ BaseParts ที่อยู่ภายในแนวการสตรีมเท่านั้นที่จะถูกสตรีมเข้ามาพร้อมกับ Constraints และ Attachments ที่เกี่ยวข้อง
การประกอบจะไม่ถูกสตรีม ออก จนกว่าทุก BaseParts จะมีสิทธิ์สตรีมออก
คุณสมบัติการสตรีม
คุณสมบัติที่ตามมาควบคุมวิธีการที่การสตรีม instance จะนำไปใช้กับเกมของคุณ คุณสมบัติเหล่านี้ทั้งหมดเป็น non-scriptable และต้องตั้งค่าบนวัตถุ Workspace ใน Studio

| คุณสมบัติ | คำอธิบาย |
|---|---|
| EnableSLIMAvatars | ควบคุมว่ามีการสร้างโมเดล SLIM สำหรับตัวละครอวาตาร์ในเกมหรือไม่ เมื่อเปิดใช้งานอวาตาร์จะแสดงโดยใช้ SLIM เช่นเดียวกับการตั้งค่า Model.LevelOfDetail เป็น SLIM สำหรับโมเดลอื่น ๆ |
| ModelStreamingBehavior | ควบคุมว่าโมเดล Nonatomic (ค่าเริ่มต้น) จะสตรีมเข้าและออกอย่างไร แนะนำ ใช้ Improved เพื่อเปิดใช้งานการสตรีมที่มีประสิทธิภาพที่สุดสำหรับ Models ที่มีลูกหลานเป็น BasePart |
| StreamingIntegrityMode | เกมอาจแสดงพฤติกรรมที่ไม่ตั้งใจหากผู้เล่นเคลื่อนที่ไปยังภูมิภาคของโลกที่ยังไม่ได้สตรีมไปยังพวกเขา คุณสมบัตินี้เสนอวิธีในการหลีกเลี่ยงสถานการณ์ที่อาจมีปัญหา แนะนำ ใช้ PauseOutsideLoadedArea เพื่อรักษาความสมบูรณ์ของการเล่นเกมโดยไม่หยุดชะงักโดยไม่จำเป็นหรือนานเกินไป คุณยังสามารถ ปรับแต่งหน้าจอหยุดชะงัก |
| StreamingMinRadius | คุณสมบัตินี้แสดงให้เห็นถึงรัศมีรอบ ๆ จุดเน้นการจำลองแบบ ซึ่งการสตรีม instances จะเกิดขึ้นในระดับความสำคัญสูงสุด ควรใช้ความระมัดระวังเมื่อเพิ่มค่าเริ่มต้น เนื่องจากการทำเช่นนี้จะต้องใช้หน่วยความจำมากขึ้นและแบนด์วิธของเซิร์ฟเวอร์มากขึ้นทำให้ส่วนประกอบอื่น ๆ เสียไป แนะนำ ใช้ค่าเริ่มต้นที่ 64 เพื่อเพิ่มขีดจำกัดในการลดขนาดเกมสำหรับอุปกรณ์ระดับล่าง |
| StreamingTargetRadius | คุณสมบัตินี้ควบคุมระยะทางสูงสุดที่อยู่ห่างจาก จุดเน้นการจำลองแบบ ซึ่ง instance จะถูกสตรีมเข้า โปรดทราบว่าเอนจินได้รับอนุญาตให้เก็บ instance ที่โหลดไว้ก่อนหน้านี้เกินรัศมีเป้าหมาย โดยขึ้นอยู่กับหน่วยความจำ การมี StreamingTargetRadius ที่เล็กกว่าลดภาระแบนด์วิธของเซิร์ฟเวอร์ เนื่องจากเซิร์ฟเวอร์จะไม่สตรีมเข้า instance เพิ่มเติมเกินค่าที่ตั้งไว้ อย่างไรก็ตาม รัศมีเป้าหมายก็เป็นระยะทางสูงสุดที่ผู้เล่นจะสามารถเห็นรายละเอียดทั้งหมดของเกมของคุณได้ ดังนั้นคุณควรเลือกค่าที่สร้างสมดุลที่ดีระหว่างเหล่านี้ แนะนำ ใช้ค่าเริ่มต้นที่ 1024 เพื่อสร้างสมดุลที่ดีระหว่างการมองเห็นสำหรับผู้เล่นที่ใช้เครื่องระดับสูงและการใช้หน่วยความจำในระดับที่เหมาะสม |
| StreamOutBehavior | คุณสมบัตินี้ตั้งค่าพฤติกรรม การสตรีมออก ตามค่าของ Enum.StreamOutBehavior หากตั้งค่าเป็น LowMemory (ค่าเริ่มต้น) คลายเออร์จะสตรีมออกเฉพาะภูมิภาคที่อยู่นอกระยะขั้นต่ำในสถานการณ์ที่มีหน่วยความจำต่ำ หากตั้งค่าเป็น Opportunistic ภูมิภาคที่อยู่นอก StreamingTargetRadius สามารถลบออกจากคลายเออร์ได้แม้ว่าจะไม่มีความดันหน่วยความจำ (ในโหมดนี้ คลายเออร์จะไม่ลบ instance ที่อยู่ภายในรัศมีเป้าหมาย ยกเว้นในสถานการณ์ที่หน่วยความจำต่ำ) แนะนำ ใช้ Opportunistic เพื่อให้คลายเออร์เก็บขยะเพิ่มขึ้นอย่างก้าวร้าว ลดการใช้หน่วยความจำและช่วยป้องกันการชนของหน่วยความจำไม่เพียงพอ |
จุดเน้นการจำลองแบบ
โดยค่าเริ่มต้น การสตรีมเกิดขึ้นรอบ ๆ PrimaryPart ของตัวละครของผู้เล่นท้องถิ่น แม้ว่าคุณจะสามารถกำหนดจุดเน้นการจำลองแบบที่แตกต่างได้ผ่าน Player.ReplicationFocus
คุณยังสามารถเพิ่มและลบจุดเน้นการจำลองแบบเพิ่มเติมได้ผ่าน Player:AddReplicationFocus() และ Player:RemoveReplicationFocus() เพื่อเปิดใช้งานการสตรีมในพื้นที่หลาย ๆ แห่งของเกมโดยไดนามิก
การจำลองฟิสิกส์ด้านคลายเออร์ ซึ่งรวมถึงการคาดการณ์และการจำลองใหม่เมื่อมีการใช้ อำนาจเซิร์ฟเวอร์ จะเกิดขึ้นเฉพาะในพื้นที่ที่มีการสตรีม แม้จะเป็น instance ที่สร้างไว้ในท้องถิ่นและสำหรับ instance ที่มีค่า Persistent หากคุณมี instance ที่คุณต้องการให้ยังคงจำลองอยู่แม้ว่าจะอยู่ห่างจากตัวละครไปไกล ให้สร้างจุดเน้นการจำลองแบบเพิ่มเติมใกล้กับ instance เหล่านั้น
การควบคุมการสตรีมโมเดล
เพื่อหลีกเลี่ยงปัญหาเกี่ยวกับการสตรีมในระดับโมเดลและลดการใช้ WaitForChild() คุณสามารถปรับแต่งวิธีการที่ Models และลูกหลานของพวกเขาสตรีมได้ผ่านคุณสมบัติ ModelStreamingMode
Nonatomic
โดยค่าเริ่มต้น โมเดลจะเป็น Nonatomic และจะสตรีมเข้า/ออกตามว่าจะตั้งค่า Workspace.ModelStreamingBehavior เป็น Legacy (ค่าเริ่มต้น) หรือ Improved
Legacy
เมื่อ Workspace.ModelStreamingBehavior ตั้งค่าเป็น Legacy (ค่าเริ่มต้น) คอนเทนเนอร์ Model และลูกหลาน ที่ไม่ใช่ BasePart เช่น Scripts จะถูกจำลองไปยังคลายเออร์เมื่อผู้เล่นเข้าร่วม จากนั้นเมื่อมีสิทธิ์ ลูกหลาน BasePart ของโมเดลจะถูกสตรีมเข้า

Improved
เมื่อ Workspace.ModelStreamingBehavior ตั้งค่าเป็น Improved พฤติกรรมการสตรีมโมเดลจะแตกต่างกันขึ้นอยู่กับว่าโมเดลนั้นมีลูกหลาน BasePart หรือไม่มีลูกหลาน BasePart:
Atomic
หาก Model ตั้งค่าเป็น Atomic ลูกหลานทั้งหมดของมันจะถูกสตรีมเข้ามาพร้อมกันเมื่อ BasePart ที่เป็นลูกหลานมีสิทธิ์สตรีมเข้า ดังนั้นสคริปต์ด้านคลายเออร์ที่ต้องการเข้าถึง instance ภายใน โมเดลจะต้องใช้ WaitForChild() กับโมเดลเอง แต่ไม่ใช่ว่าจะถูกใช้กับลูกหลาน MeshPart หรือ Part เนื่องจากพวกมันถูกส่งพร้อมกับโมเดล
โมเดลเชิงอะตอมจะถูกสตรีมออกเฉพาะเมื่อทุกส่วนลูกหลานมีสิทธิ์สตรีมออก ในจุดนั้น โมเดลทั้งหมดจะถูกสตรีมออกด้วยกัน

Persistent
โมเดล Persistent จะไม่อยู่ภายใต้การสตรีมเข้าและออกตามปกติ พวกมันจะถูกส่งเป็นหน่วยอะตอมที่สมบูรณ์ไม่นานหลังจากผู้เล่นเข้าร่วมและก่อนที่จะมีการเรียกใช้งาน Workspace.PersistentLoaded เหตุการณ์ โมเดลถาวรและลูกหลานของพวกเขาจะไม่มีวันถูกสตรีมออก แต่เพื่อให้จัดการการสตรีมได้อย่างปลอดภัยภายในสคริปต์ด้านคลายเออร์ คุณควรรอให้เหตุการณ์ PersistentLoaded ถูกเรียกใช้

PersistentPerPlayer
โมเดลที่ตั้งค่าเป็น PersistentPerPlayer มีพฤติกรรมเหมือนกับ Persistent สำหรับผู้เล่นที่ถูกเพิ่มด้วย Model:AddPersistentPlayer() สำหรับผู้เล่นคนอื่น ๆ พฤติกรรมจะเหมือนกับ Atomic คุณสามารถย้อนกลับโมเดลจากการทำให้ถาวรของผู้เล่นผ่าน Model:RemovePersistentPlayer().
การปรับแต่งหน้าจอหยุด
สมมติว่า Workspace.StreamingIntegrityMode ตั้งค่าเป็น PauseOutsideLoadedArea ที่แนะนำ เกมจะหยุดหากผู้เล่นเคลื่อนที่ไปยังภูมิภาคของโลกที่ยังไม่ได้สตรีมไปยังพวกเขา ในกรณีเหล่านี้ ค่าคุณสมบัติ Player.GameplayPaused จะแสดงถึงสถานะการหยุดชะงักปัจจุบันของผู้เล่นซึ่งสามารถใช้ร่วมกับการเชื่อมต่อ GetPropertyChangedSignal() เพื่อแสดงหรือซ่อน GUI แบบกำหนดเอง
LocalScript
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- ปิดการแจ้งเตือนหยุดชะงักแบบปกติ
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- แสดง GUI แบบกำหนดเอง
else
-- ซ่อน GUI แบบกำหนดเอง
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
การดีบักระหว่างการทำงาน
เอนจินรวมถึงแผงดีบักหลายตัวที่แสดงบนหน้าจอซึ่งสามารถเปิดใช้งานบนคลายเออร์โดยใช้แป้นพิมพ์ลัด เพื่อนเข้าถึงข้อมูลดีบักการสตรีม:
เปิดการซ้อนทับดีบัก Network Summary ผ่าน ShiftCtrlF3 (Windows) หรือ Shift⌘F3 (Mac).
เมื่อการซ้อนทับดีบักเปิดอยู่ ให้กด Shift1 อย่างต่อเนื่องเพื่อหมุนเวียนผ่านแผงที่มีให้ ใช้แผงที่สี่คือ Streaming ซึ่งจะแสดงข้อมูลการดำเนินงานที่มีประโยชน์:
- การตั้งค่าการสตรีมที่ใช้งาน
- ภูมิภาคที่โหลดอยู่ (ถูกสตรีมเข้า)
- พฤติกรรมและสถานะการสตรีม
เมื่อเปิดใช้งานแล้ว ภูมิภาคที่มีการไฮไลต์สีจะปรากฏในมุมมอง 3D:
| สี | คำอธิบาย |
|---|---|
| น้อยกว่า StreamingMinRadius | |
| มากกว่าหรือเท่ากับ StreamingMinRadius และน้อยกว่า StreamingTargetRadius | |
| เท่ากับ StreamingTargetRadius | |
| มากกว่าที่ StreamingTargetRadius |

