คู่มือนี้อธิบายเทคนิคหลายประการในการใช้ การสตรีมอินสแตนซ์ ในเกมอย่างมีประสิทธิภาพและมีประสิทธิผล แม้ว่าจะไม่มี "วิธีเดียวที่เหมาะกับทุกคน" สำหรับการออกแบบเกมสตรีม แต่การปฏิบัติตามขั้นตอนระดับสูงเหล่านี้จะช่วยให้คุณไปถึงจุดหมายได้มากที่สุด
คุณสมบัติการสตรีม
เมื่อ StreamingEnabled ถูกเปิดใช้งานสำหรับวัตถุ Workspace ใน Studio ให้ตั้งค่าคุณสมบัติที่เกี่ยวข้องเป็นค่าที่แนะนำดังต่อไปนี้:
| คุณสมบัติ | คำแนะนำ |
|---|---|
| EnableSLIMAvatars | ใช้ Enabled เพื่อเรนเดอร์อวตาร R15 เป็นแบบเบาและเคลื่อนไหวเมื่อเหมาะสม ดูข้อมูลเพิ่มเติมที่ SLIM avatars |
| ModelStreamingBehavior | ใช้ Improved เพื่อเปิดใช้งานการสตรีมที่มีประสิทธิภาพที่สุดสำหรับ Models ที่มีลูกหลาน BasePart |
| StreamingIntegrityMode | ใช้ PauseOutsideLoadedArea เพื่อรักษาความสมบูรณ์ของการเล่นเกมโดยไม่หยุดชะงักโดยไม่จำเป็นหรือบ่อยเกินไป |
| StreamingMinRadius | ใช้ค่าเริ่มต้นที่ 64 เพื่อเพิ่มขีดความสามารถในการปรับขนาดเกมให้เหมาะสมสำหรับอุปกรณ์ที่มีประสิทธิภาพต่ำ |
| StreamingTargetRadius | ใช้ค่าเริ่มต้นที่ 1024 เพื่อสร้างสมดุลที่ดีระหว่างการมองเห็นสำหรับผู้เล่นในอุปกรณ์ที่มีประสิทธิภาพสูงและการใช้หน่วยความจำที่เหมาะสม |
| StreamOutBehavior | ใช้ Opportunistic เพื่อให้ไคลเอนต์สามารถเก็บขยะเนื้อหาได้อย่างเข้มข้น ลดการใช้หน่วยความจำอย่างมีนัยสำคัญและช่วยป้องกันการชนิดหน่วยความจำหมด |
ระดับรายละเอียดของโมเดล
Model.LevelOfDetail ช่วยเติมเนื้อหาของ Model ที่ไม่ได้สตรีมด้วยเมชแบบเบาหรือแบบเลียนแบบ ทำให้โลกดูสมบูรณ์ทางสายตา SLIM (Scalable Lightweight Interactive Models) มีประสิทธิภาพโดยเฉพาะ เนื่องจากผู้เล่นมักไม่สามารถแยกแยะเมช SLIM ออกจากต้นฉบับที่ถูกสตรีมเข้ามาได้
เพื่อผลลัพธ์ที่ดีที่สุด:
- จัดกลุ่มชิ้นส่วนที่เกี่ยวข้องทางกายภาพและตรรกะ เช่น ชิ้นส่วนทั้งหมดของรถยนต์
- ตั้งค่า LevelOfDetail เป็น SLIM บนโมเดลที่มีเมชและชิ้นส่วน คงที่ โมเดลที่ถูกปรับเปลี่ยนในระหว่างการทำงานหรือเล่นอนิเมชันจะไม่ได้รับการสนับสนุน
- รักษาขนาดพื้นที่ของแต่ละโมเดลให้น้อยกว่า ~64 ลูกบาศก์สตัดเพื่อเพิ่มโอกาสที่โมเดลจริงทั้งหมดจะถูกสตรีมเข้ามาพร้อมกัน หากโมเดลมีขนาดใหญ่เกินไป ให้แบ่งออกเป็นโมเดลขนาดเล็กที่เป็นโมดูลและใช้ LevelOfDetail ที่เหมาะสมกับแต่ละโมเดล
โครงสร้างโมเดล
นอกเหนือจากการตั้งค่า ระดับรายละเอียดของโมเดล โครงสร้างและการตั้งค่าของ Models ของคุณมีผลกระทบอย่างมากต่อประสิทธิภาพการสตรีม เมื่อคุณสร้างหรือแปลงเกมที่มีอยู่:
ใช้โมเดลอะตอมสำหรับการจัดกลุ่มตรรกะ — เมื่อสคริปต์ต้องเข้าถึงชิ้นส่วนทั้งหมดภายในโมเดล ให้ตั้งค่า ModelStreamingMode เป็น Atomic สิ่งนี้ช่วยให้สคริปต์ด้านไคลเอนต์สามารถเข้าถึงอินสแตนซ์ภายในโมเดลได้อย่างปลอดภัยโดยไม่ต้องใช้ WaitForChild() มากเกินไป (แม้ว่าสคริปต์ดังกล่าวยังต้องใช้ WaitForChild() สำหรับโมเดลอะตอมโดยรวม)
ลดโมเดลที่คงอยู่ — โมเดลที่ คงอยู่ จะโหลดหลังจากเข้าร่วมและไม่เคยสตรีมออก ทำให้ใช้หน่วยความจำถาวร ตั้งค่า ModelStreamingMode ของโมเดลเป็น Persistent เฉพาะเมื่อมัน ต้อง คงอยู่และเข้าถึงได้จากสคริปต์ตลอดเวลา
แยกโมเดลคอนเทนเนอร์ — รูปแบบการไม่สตรีมทั่วไปคือโมเดล Model ขนาดใหญ่ที่มี NPCs, props หรือกลุ่มที่คล้ายกันอยู่มากมาย ภายใต้การสตรีม โมเดลคอนเทนเนอร์จะลดประสิทธิภาพการสตรีมและไม่เหมาะสมสำหรับ ระดับรายละเอียดของโมเดล ซึ่งทำงานได้ดีที่สุดกับอินสแตนซ์ที่จัดกลุ่มอย่างใกล้ชิด แยกโมเดลคอนเทนเนอร์ออกเป็นโมเดลขนาดเล็กที่มีชิ้นส่วนที่อยู่ใกล้กันทางกายภาพหรือเกี่ยวข้องกันทางตรรกะ
อวตาร SLIM
อวตารของแพลตฟอร์มนอกพื้นที่ที่ถูกสตรีมในปัจจุบันจะไม่สามารถมองเห็นได้ตามค่าเริ่มต้น แต่การเปิดใช้งาน Workspace.EnableSLIMAvatars จะเรนเดอร์อวตาร R15 เป็นแบบเบาและเคลื่อนไหวเมื่อเหมาะสม โดยมีการทำงานของเอนจินดังนี้:
- เรนเดอร์เวอร์ชัน SLIM เมื่อโมเดลอวตารจริงถูกสตรีมออก
- สลับระหว่าง SLIM และการแสดงผลความละเอียดเต็มตามทรัพยากรที่มีอยู่ แม้ในรัศมีการสตรีม
- จำกัดอนิเมชัน SLIM ตามความสำคัญของฉากและแบนด์วิดธ์ที่มีอยู่
อวตาร SLIM รองรับตัวละครผู้เล่น R15 ที่มีร่างกาย หัวแบบไดนามิก, มาตรฐาน หรือ ขั้นสูง R15 rig และอุปกรณ์เสริมที่แข็งหรือชั้น อวตาร R6, NPCs และอวตารที่มีสัดส่วนที่กำหนดเองจะถูกยกเว้น สำหรับรายการเต็มของการกำหนดค่าของอวตารที่รองรับและยกเว้น ข้อมูลประสิทธิภาพ และเคล็ดลับการแก้ไขปัญหา ดูที่ SLIM avatars
รูปแบบสคริปต์
รูปแบบสคริปต์ต่อไปนี้เป็นรูปแบบที่ได้รับผลกระทบจากการสตรีมมากที่สุด กลยุทธ์ที่ถูกต้องขึ้นอยู่กับเจตนาของโค้ด ดังนั้นแต่ละรูปแบบจึงมีตัวเลือกหลายตัวเลือกเมื่อเหมาะสม
ดัชนีโดยตรงไปยังลูกหลาน
การดัชนีไปยังลูกหลานของ Workspace ด้วยตัวดำเนินการ . จะทำให้เกิดข้อผิดพลาดหากอินสแตนซ์ใด ๆ ในเส้นทางไม่ได้ถูกสตรีมเข้ามาในขณะนั้น สิ่งเดียวกันนี้ใช้กับ FindFirstChild(), FindFirstChildWhichIsA() และ FindFirstChildOfClass() ซึ่งจะคืนค่า nil หากลูกหลานยังไม่ได้ถูกสตรีมเข้ามา
local house1 = workspace:FindFirstChild("House1") -- nil หาก "House1" ยังไม่ได้ถูกสตรีมเข้ามา
local door = workspace.House1.Door -- ขัดข้องหาก "House1" หรือ "Door" ยังไม่ได้ถูกสตรีมเข้ามารูปแบบที่คล้ายกันคือการเข้าถึง Humanoid หรือลูกหลานตัวละครอื่น ๆ โดยตรงภายในการเชื่อมต่อ Player.CharacterAdded ภายใต้การสตรีม โมเดลตัวละครจะถูกจัดให้อยู่ใน Workspace ก่อนที่ลูกหลานทั้งหมดจะถูกทำซ้ำ ดังนั้นการดัชนีโดยตรงจึงล้มเหลว
local Players = game:GetService("Players")
local player = Players.LocalPlayer
player.CharacterAdded:Connect(function(character)
local humanoid = character.Humanoid
end)หากสคริปต์ไม่สามารถดำเนินการต่อได้โดยไม่มีอินสแตนซ์ ให้รอด้วย WaitForChild():
local house1 = workspace:WaitForChild("House1")
local door = house1:WaitForChild("Door")อินสแตนซ์ที่ส่งไปยังระยะไกล
สัญญาณ RemoteEvent/RemoteFunction และอินสแตนซ์ที่มันอ้างถึงเดินทางอย่างอิสระ ดังนั้นสัญญาณอาจมาถึงที่ไคลเอนต์ก่อนที่อินสแตนซ์จะมีอยู่ — หรืออินสแตนซ์อาจไม่มีอยู่เลย สาเหตุที่น่าจะเป็นไปได้สองประการ ได้แก่:
ภายใต้การสตรีม อาจมีความล่าช้าระหว่างเมื่อชิ้นส่วน/โมเดลถูกสร้างขึ้นบนเซิร์ฟเวอร์และเมื่อมันถูกทำซ้ำไปยังไคลเอนต์ โดยมีผลให้ชิ้นส่วนที่อ้างถึงโดย RemoteEvent/RemoteFunction อาจยังไม่มีอยู่เลย แม้ในพื้นที่ที่ถูกสตรีม
การส่งการอ้างอิงชิ้นส่วน/โมเดลจากเซิร์ฟเวอร์ไปยังไคลเอนต์ผ่าน RemoteEvent หรือ RemoteFunction ต้องการให้มีการทำซ้ำอินสแตนซ์ไปยังไคลเอนต์ที่รับ การส่งเส้นทางอินสแตนซ์เป็นสตริงมีปัญหาเดียวกัน เนื่องจากเส้นทางอาจชี้ไปยังตำแหน่งที่ไม่มีอยู่บนไคลเอนต์:
สคริปต์ไคลเอนต์local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")remoteEvent.OnClientEvent:Connect(function(data)local checkpoint = data.checkpoint -- ข้อผิดพลาดหาก "checkpoint" ยังไม่ได้ถูกสตรีมเข้ามาlocal level = workspace.Levels[data.levelPath] -- ข้อผิดพลาดหากเส้นทางยังไม่ได้ถูกสตรีมเข้ามาend)
หากสคริปต์ของไคลเอนต์ที่รับต้องการอินสแตนซ์เพื่อดำเนินการต่อ ให้รวม WaitForChild() ก่อนที่จะใช้มัน โปรดทราบว่าสิ่งนี้อาจทำให้เกิดการรออย่างไม่มีกำหนดหากอินสแตนซ์ไม่เคยถูกสตรีมเข้ามา ดังนั้นให้พิจารณาเพิ่มเวลาในการหมดอายุเป็นพารามิเตอร์ที่สองของ WaitForChild().
การไม่ซิงโครไนซ์ของไคลเอนต์
การไม่ซิงโครไนซ์ด้านไคลเอนต์ควรถือเป็นข้อยกเว้น ไม่ใช่รูปแบบการออกแบบมาตรฐาน การแนะนำสำเนาเฉพาะของไคลเอนต์หรือการเปลี่ยนพ่อแม่ของอินสแตนซ์ในท้องถิ่นอาจสร้างปัญหาร้ายแรง ตรวจสอบโค้ดของคุณสำหรับสถานที่ที่พึ่งพาการเปลี่ยนแปลงประเภทนี้ที่ยังคงอยู่ในไคลเอนต์
ตัวอย่างเช่น การเปลี่ยนพ่อแม่ของอินสแตนซ์ในท้องถิ่นจาก ReplicatedStorage ไปยัง Workspace อาจทำให้มีสิทธิ์ในการถูกสตรีมออก โมเดลที่ถูกโคลนในท้องถิ่น (Instance:Clone()) จาก ReplicatedStorage ไปยัง Workspace จะสร้างสำเนาเฉพาะของไคลเอนต์ที่ไม่เป็นส่วนหนึ่งของกระบวนการทำซ้ำของเซิร์ฟเวอร์และจะไม่ได้รับการอัปเดตคุณสมบัติจากอินสแตนซ์ที่เป็นเจ้าของเซิร์ฟเวอร์เดิม
แนวคิดเดียวกันนี้ใช้ได้เมื่อเรียก Instance:Destroy() บนวัตถุที่เป็นเจ้าของเซิร์ฟเวอร์ สิ่งนี้จะลบอินสแตนซ์ในท้องถิ่น แต่เซิร์ฟเวอร์ยังคงมีอยู่ ดังนั้นมันจะถูกสตรีมเข้ามาอีกครั้งด้วยสถานะเดิมเมื่อมีสิทธิ์
การสตรีมเชิงรุก
เมื่อจุดหมายถัดไปของผู้เล่นสามารถคาดการณ์ได้ ให้ทำการเรียกจากเซิร์ฟเวอร์ไปยัง Player:RequestStreamAroundAsync() เพื่อสตรีมพื้นที่ชั่วคราวสำหรับการโหลดชั่วคราว หรือใช้ Player:AddReplicationFocus() ในระดับ จำกัด สำหรับพื้นที่ที่ควรคงอยู่จนกว่าจะถูกปล่อยอย่างชัดเจน
ตัวอย่างเช่น เมื่อโมเดลตัวละครของผู้เล่นกำลังจะโทรไปยังบ้านของผู้เล่นคนอื่นในตำแหน่งที่ห่างไกลโดยการเปลี่ยน CFrame คุณสามารถดึงข้อมูลพื้นที่จุดหมายล่วงหน้าเพื่อลดการปรากฏตัวและให้การเปลี่ยนแปลงที่ราบรื่น สคริปต์ต่อไปนี้แสดงให้เห็นว่าเหตุการณ์ remote event จากไคลเอนต์ไปยังเซิร์ฟเวอร์สามารถถูกเรียกใช้เพื่อย้ายโมเดลตัวละครของผู้เล่นโดยใช้วิธีการดึงข้อมูลล่วงหน้า หากคำขอดึงข้อมูลล่วงหน้าประสบความสำเร็จเมื่อฟังก์ชันส่งคืน รัศมีขั้นต่ำรอบตำแหน่งเป้าหมายควรมีอยู่ในไคลเอนต์
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- ขอให้สตรีมรอบตำแหน่งเป้าหมาย
player:RequestStreamAroundAsync(teleportTarget)
-- โทรโมเดลตัวละคร
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- เรียกฟังก์ชันโทรเมื่อไคลเอนต์ส่งเหตุการณ์ระยะไกล
teleportEvent.OnServerEvent:Connect(teleportPlayer)การอ่านคุณสมบัติของอินสแตนซ์
เมื่ออินสแตนซ์ถูกสตรีมออก การอัปเดตคุณสมบัติของมันจะไม่ถูกทำซ้ำไปยังไคลเอนต์นั้นอีกต่อไป การอ่านคุณสมบัติเช่น BasePart.Position ยังคงสำเร็จ แต่จะคืนค่าค่าที่ถูกทำซ้ำล่าสุดซึ่งอาจล้าสมัยได้
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- ตำแหน่งอาจล้าสมัยหาก "target" ถูกสตรีมออก
local dist = (target.Position - player.Character.HumanoidRootPart.Position).Magnitudeย้ายตรรกะไปยังเซิร์ฟเวอร์ เนื่องจากสคริปต์ด้านเซิร์ฟเวอร์เห็นอินสแตนซ์ทั้งหมดตลอดเวลา นี่เป็นตัวเลือกที่เชื่อถือได้ที่สุดสำหรับการตรวจสอบระยะทางและตรรกะที่ไวต่อการตำแหน่งอื่น ๆ
รอในเส้นทางที่สำคัญ
เกมที่ไม่ใช่สตรีมบางเกมโหลดแผนที่โดยการโคลนจาก ReplicatedStorage ไปยัง Workspace จากนั้นรอให้มันอยู่ในไคลเอนต์ก่อนที่จะปิดหน้าจอโหลดและสัญญาณความพร้อมใช้งาน ภายใต้การสตรีมนี้จะทำให้เกิดการหยุดชะงักอย่างไม่มีกำหนด — ตัวละครของไคลเอนต์ยังไม่ได้เกิด ดังนั้นจึงไม่มี การมุ่งเน้นการทำซ้ำ และอินสแตนซ์แผนที่เชิงพื้นที่จะไม่ถูกสตรีมเข้ามา
ย้ายตรรกะหน้าจอโหลดเพื่อไม่ให้ขึ้นอยู่กับการมีอยู่ของอินสแตนซ์เชิงพื้นที่เฉพาะ เช่น โดยการสัญญาณความพร้อมใช้งานเมื่อเกิดตัวละครแล้วและพื้นที่โดยรอบที่ใกล้เคียงถูกสตรีมเข้ามา
การจัดการการเปลี่ยนสัญญาณ
สัญญาณเช่น Instance.ChildAdded/Instance.ChildRemoved และสัญญาณ CollectionService เช่น GetInstanceAddedSignal() หรือ GetInstanceRemovedSignal() จะถูกเรียกใช้เมื่อมีการสตรีมเข้า/ออก ซึ่งไม่สามารถแยกแยะได้จากการเกิด/การลบจริง สคริปต์ที่รับไม่สามารถบอกความแตกต่างจากสัญญาณเพียงอย่างเดียว ดังนั้นตรรกะที่สมมติว่าสัญญาณสอดคล้องกับเหตุการณ์ "จริง" ต้องได้รับการปรับปรุง
ตรวจสอบสคริปต์สำหรับผู้ฟังสัญญาณใด ๆ ที่อาจล้มเหลวหรือเปลี่ยนแปลงอย่างมีนัยสำคัญเมื่อถูกเรียกโดยการสตรีมเข้าและ/หรือสตรีมออก ตัวอย่างเช่น หากคุณเล่นเสียงหรือเอฟเฟกต์ภาพเมื่อ NPC ศัตรูเกิดขึ้นในโลก ให้กำหนดแต่ละศัตรูด้วย แอตทริบิวต์ เช่น Spawned ในการเกิดครั้งแรก และข้ามการเล่นเสียง/เอฟเฟกต์เดียวกันในอนาคตเมื่อมีการสตรีมเข้าของศัตรู
local CollectionService = game:GetService("CollectionService")
local TAG_NAME = "Enemy"
CollectionService:GetInstanceAddedSignal(TAG_NAME):Connect(function(enemy)
if not enemy:GetAttribute("Spawned") then
-- ตั้งค่าแอตทริบิวต์ "Spawned" บนศัตรูสำหรับการเกิดครั้งแรก
enemy:SetAttribute("Spawned", true)
-- เล่นเสียง/เอฟเฟกต์ภาพสำหรับการเกิดครั้งแรกนี้
playSpawnEffects(enemy)
end
end)การวนซ้ำในคอลเลกชัน
การวนซ้ำในคอลเลกชันด้านไคลเอนต์ เช่น Instance:GetChildren() และ Instance:GetDescendants() จะคืนค่าชุดลูกหลานที่ถูกสตรีมเข้ามาเท่านั้น สิ่งนี้ใช้ได้แม้ว่าแม่จะถูกทำซ้ำเสมอ เช่น Folder ที่อยู่โดยตรงใต้ Workspace ซึ่งลูกหลานเชิงพื้นที่จะถูกสตรีมเข้าและออก
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- โฟลเดอร์ "Homes" ถูกทำซ้ำเสมอ แต่ลูกหลานของมันจะถูกสตรีมเข้าและออก
-- ลูปนี้อาจพลาดบ้านที่ไม่ได้ถูกสตรีมเข้ามาในขณะนี้
for _, home in workspace.Homes:GetChildren() do
if home.Settings.Owner.Value == player.Name then
return home
end
endหากต้องการการระบุที่สมบูรณ์ ให้ทำการสแกนบนเซิร์ฟเวอร์และส่งผลลัพธ์ไปยังผู้เล่นผ่าน RemoteEvent หากจำเป็น
การค้นหาทางกายภาพ
การค้นหาทางกายภาพด้านไคลเอนต์ เช่น WorldRoot:Raycast(), WorldRoot:GetPartBoundsInBox(), และ Model:GetBoundingBox() จะสะท้อนเฉพาะเนื้อหาที่ถูกสตรีมเข้ามาเท่านั้น ว่าจะเป็นปัญหาหรือไม่นั้นขึ้นอยู่กับว่าสิ่งที่การค้นหานั้นใช้ทำอะไร
ใช้เซิร์ฟเวอร์สำหรับการค้นหาที่ผลลัพธ์ต้องสะท้อนโลกทั้งหมด เช่น การเรนเดอร์ที่ตรวจสอบว่าผู้เล่นมีสายตาไปยังเป้าหมายที่อยู่ห่างไกล
รูปแบบอื่น ๆ
รูปแบบต่อไปนี้อาจใช้ได้เช่นกันและควรพิจารณาอย่างรอบคอบ:
Sound หรือ AudioPlayer ที่เป็นพ่อแม่ของวัตถุ 3D จะหยุดเมื่อวัตถุที่เกี่ยวข้องถูกสตรีมออก สำหรับเสียงบรรยากาศที่ควรคงอยู่ไม่ว่าจะมีการสตรีมหรือไม่ ให้ทำให้ตัวสร้างเสียงเป็นส่วนหนึ่งของโมเดล คงอยู่ หรือคอนเทนเนอร์ที่ไม่ใช่สตรีม
วัตถุ UI ในเกม UI เช่น BillboardGui หรือ SurfaceGui รวมถึง เอฟเฟกต์ภาพ เช่น Beams หรือ Highlights ที่มีการติดตั้งหรือการยึดติดที่ถูกสตรีมออกจะหยุดการเรนเดอร์ สิ่งนี้อาจเป็นพฤติกรรมที่ตั้งใจไว้ แต่คุณควรตรวจสอบให้แน่ใจ
เหตุการณ์ BasePart.Touched, ProximityPrompts, DragDetectors, และ ClickDetectors จะไม่ทำงานสำหรับผู้เล่นที่ไคลเอนต์ของพวกเขาไม่มีส่วน/โมเดลที่เกี่ยวข้องถูกสตรีมเข้ามา หากการโต้ตอบต้องเป็นไปได้จากระยะใด ๆ โมเดลต้องเป็น คงอยู่ หรือการโต้ตอบต้องมีกลไกที่แตกต่างกัน
สำหรับ PathfindingService และการค้นหาทางด้านไคลเอนต์ ตัวค้นหาจะเห็นเฉพาะเรขาคณิตที่ถูกสตรีมเข้ามาในไคลเอนต์และอาจมีเส้นทางผ่านอุปสรรคที่มีอยู่บนเซิร์ฟเวอร์ สำหรับกลยุทธ์ ดูที่ Pathfinding - Strategies สำหรับกลยุทธ์
สภาพการทดสอบที่สมจริง
เมื่อ สคริปต์ได้รับการอัปเดต ให้ทดสอบเกมอย่างละเอียด ข้อบกพร่องในการสตรีมมักจะปรากฏที่ขอบของพื้นที่ที่ถูกสตรีมหรือระหว่างการเปลี่ยนแปลง ดังนั้นการทดสอบใกล้จุดเกิดหรือที่รัศมีเป้าหมายเพียงอย่างเดียวจึงไม่เพียงพอ
ทดสอบด้วย Workspace.StreamingTargetRadius ตั้งค่าเป็นค่าต่ำสุด (64). ข้อบกพร่องในการสตรีมบางอย่างจะปรากฏเฉพาะเมื่อพื้นที่ที่ถูกสตรีมมีขนาดเล็ก
เล่นผ่านรูปแบบการเดินทางทั้งหมดของเกม โทรไปยังพื้นที่ห่างไกล และกลับไปยังพื้นที่หลังจากออกจากไป นี่คือสถานการณ์ที่ใช้การสตรีมเข้าและออกมากที่สุด
ใช้ การทดสอบการดีบักการสตรีม เพื่อติดตามการตั้งค่าการสตรีมที่ใช้งานอยู่ พื้นที่ที่โหลดอยู่ในปัจจุบัน และสถานะการสตรีมในระหว่างการทำงาน
ตรวจสอบหน้าต่าง Output และ Developer Console สำหรับข้อผิดพลาด เนื่องจากรูปแบบ สคริปต์ หลายรูปแบบผลิตข้อผิดพลาดแทนที่จะเป็นพฤติกรรมที่เงียบสงบ ให้ความสนใจกับข้อผิดพลาดในรูปแบบ attempt to index nil with ... ซึ่งมักจะบ่งชี้ถึงการขาดการเรียก WaitForChild()
ติดตั้งและเปิดใช้งาน Tools, ยิงอาวุธ และกระตุ้นการโต้ตอบในเกมต่าง ๆ
ทักษะการแปลงสตรีม AI
เพื่อช่วยในการแปลงและเพิ่มประสิทธิภาพการสตรีม Roblox มี ทักษะการสตรีม AI ที่สามารถเข้าถึงได้จาก MCP server ใน Studio ทักษะนี้จะประเมินเกมของคุณโดยอัตโนมัติ ใช้การกำหนดค่าที่แนะนำ และทำความสะอาดปัญหาความเข้ากันได้ รวมถึง:
- กำหนดการตั้งค่าการสตรีมให้เป็น ค่าพื้นฐานที่แนะนำ.
- ตั้งค่า ระดับรายละเอียด สำหรับโมเดลเป็น SLIM เมื่อเหมาะสม
- ปรับโครงสร้าง โมเดล เพื่อให้ได้ขนาดและคุณภาพภาพที่เหมาะสมที่สุด
ในการใช้ทักษะ AI ในเกมของคุณ:
- สำคัญสำรองเกมของคุณ การแปลงอาจเป็นกระบวนการที่ซับซ้อน ดังนั้นคุณควร เสมอ บันทึกสำรอง (File ⟩ Publish to Roblox As) ก่อนที่จะเรียกใช้ทักษะ
คุณสามารถเรียกใช้ทักษะนี้โดยใช้ LLM ใด ๆ ที่คุณต้องการผ่าน Model Context Protocol (MCP) ใน Studio แนะนำให้ใช้โมเดล AI ระดับสูงที่มีหน้าต่างบริบทขนาดใหญ่ ใน Claude Opus การแปลงทั่วไปใช้เวลา 20-30 นาทีและใช้ประมาณ 200,000 โทเค็นของบริบท
- เปิดเกมของคุณใน Studio.
- ดาวน์โหลดทักษะ และในไคลเอนต์ AI ของคุณ ให้เปิดโฟลเดอร์ที่แตกไฟล์ (roblox-streaming-conversion) เป็นโครงการปัจจุบัน
- เรียกใช้ทักษะด้วย /rbx-convert-to-streaming.
- เช่นเดียวกับผลลัพธ์ AI ใด ๆ ให้ตรวจสอบผลลัพธ์และทดสอบเกมของคุณอย่างละเอียดภายใต้ สภาพการทดสอบที่สมจริง.

