หน้านี้อธิบายปัญหาประสิทธิภาพทั่วไปและการดำเนินการที่ดีที่สุดสำหรับการรับมือกับพวกเขา
การคำนวณสคริปต์
การดำเนินการที่แพงในโค้ด Lua ใช้เวลานานขึ้นเพื่อประมวลผลและจึงสามารถส่งผลต่ออัตราเฟรมได้ ยกเว้นว่ามันจะไม่ได้ดำเนินการในพาร์เลล์หลักจนกว่าจะพบฟังก์ชันที่สร้างเส้นกระบวนการ
ปัญหาทั่วไป
การดำเนินการที่หนักในโครงสร้างตาราง - การดำเนินการซับซ้อนเช่นการเรียกซ้ำ, การเรียกซ้ำ,และการเลียนแบบในค่าประสิทธิภาพสูงเช่นเมื่อเป็นการเรียกซ้ำหรือมีการเรียกแทรกก
อีเวนต์ความถี่สูง - การผูกการดำเนินการที่แพงแพงให้เป็นเหตุการณ์เฟรมเบ็ดของ RunService โดยไม่จำกัดความถี่ที่การดำเนินการเหล่านี้ทำซ้ำในแต่ละเฟรมซึ่งมักจะทำให้เกิดค
มิติเดชัน
- เรียกโค้ดใน RunService อีเวนต์โดยอนุรักษ์, จำกัดการใช้งานไว้ในกรณีที่จำเป็นต้องใช้การเรียกความถี่สูง (เช่น, การปรับปรุงกล้อง) คุณสามารถเรียกโค้ดส่วนใหญ่ในอีเวนต์อื่นหรือน้อ
- แบ่งงานใหญ่หรือแพงใช้ task.wait() เพื่อแผ่การทำงานไปยังหลายโครงการ
- ระบุและปรับปรุงการดำเนินการที่แพงเกินไปโดยไม่จำเป็นและใช้ multithreading สำหรับการคำนวณที่แพงเกินไปที่ไม่จำเป็นต้องเข้าถึงรุปแบบข้อมูล
- สคริปต์บางอย่างในด้านเซิร์ฟเวอร์สามารถใช้ประโยชน์จาก การเก็บรวบรวมคอ้ดเริ่มต้น ซึ่งเป็นธงง่ายที่จะคอมไพล์สคริปเป็นโค้ดเครื่องจักรแทนที่จะเป็นโค้ดบายตัว
สเกลไมโครโปรไฟล์
สเก็ต | คํานวณที่เกี่ยวข้อง |
RunService.PreRender | การเรียกใช้โค้ดในเหตุการณ์ PreRender |
RunService.PreSimulation | การประมวลผลรหัสสำหรับอีเวนต์ขั้นตอน |
วิดีโอการทดสอบ | การประมวลผลรหัสในอีเวนต์ Heartbeat |
RunService.หัวใจเต้น | การประมวลผลรหัสในอีเวนต์ Heartbeat |
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการดีบั๊กสคริปต์โดย MicroProfiler โปรดดูไฟล์สมุดหนังสือ debug ซึ่งรวมถึงระเบียบาลให้เฉพาะเกี่ยวกับการต
การใช้หน่วยความจำสคริปต์
หน่วยความจำรั่วสามารถเกิดขึ้นเมื่อคุณเขียนสคริปที่ใช้หน่วยความจำที่รังสีขยะไม่สามารถปล่อยได้อย่างถูกต้องเมื่อมันไม่ได้ใช้งานอีกต่อไป หน่วยความจำรั่วสามารถเป็นได้อย่างรวดเร็ว
ค่าหน่วยความจำต่อไปนี้ใน คอนโซลผู้พัฒนา สามารถแสดงถึงปัญหาที่ต้องการการสอบสวนเพิ่มเติม:
- LuaHeap - การใช้งานที่สูงขึ้นหรือเพิ่มขึ้นแสดงถึงการรั่วไหลของหน่วยความจำ
- จํานวนตัวอินสแตนซ์ - เลขจํานวนตัวอินสแตนซ์ที่เพิ่มขึ้นอย่างมีเหตุผลสามารถชี้ไปที่บางอินสแตนซ์ในโค้ดของคุณไม่ได้เก็บขยะ
- PlaceScriptMemory - ให้สคริปต์โดยการแยกโครงสร้างของหน่วยความจำ
ปัญหาทั่วไป
การออกการเชื่อมต่อที่เชื่อมต่อได้ - เครื่องยนต์จะไม่เก็บขยะเหตุการณ์ที่เชื่อมต่อกับตัวแทนและค่าที่อ้างอิงภายในเชื่อมต่อคือ ดังนั้นการเชื่อมต่อเหตุการณ์แล
แม้ว่าเหตุการณ์จะถูกตัดการเชื่อมต่อเมื่อเครื่องมือที่พวกเขาเป็นเจ้าของถูกทำลาย
ตาราง - การใส่วัตถุในตาราง แต่ไม่ได้ลบออกเมื่อพวกเขาไม่ได้ต้องการอีกต่อไปทำให้เกิดการใช้พลังหน่วยความจำที่ไม่จำเป็นโดยเฉพาะอย่างยิ่งสำหรับตารางที่ติดตามข้อมูลผู้ใช้
ตัวอย่างlocal playerInfo = {}Players.PlayerAdded:Connect(function(player)playerInfo[player] = {} -- ข้อมูลบางอย่างend)หากคุณไม่ลบรายการเหล่านี้ออกจากเมื่อพวกเขาไม่มีความจำเป็นอีกต่อไปแล้วตารางจะเติบโตใหญ่ขึ้นและการใช้งานมากขึ้นเมื่อผู้ใช้เข้าร่วมเซสชัน รหัสใด ๆ ที่ทำซ้ำในตารางนี้ยังจะแพงขึ้
มิติเดชัน
เพื่อทำความสะอาดค่าทั้งหมดที่ใช้สำหรับการป้องกันการรั่วของหน่วยความจำ:
เชื่อมตัดการเชื่อมต่อทั้งหมด - ไปผ่านฐานรหัสของคุณแน่ใจว่าแต่ละการเชื่อมต่อได้รับการทำความสะอาดโดยหนึ่งในเส้นทางต่อไปต่อไป:
- การเชื่อมตัดด้วยมือโดยใช้ฟังก์ชัน Disconnect()
- การทำลายตัวอย่างที่เหตุการณ์เป็นเจ้าของด้วยคุณสมบัติ Destroy()
- การทำลายตัวสคริปที่เชื่อมต่อกลับ
ลบวัตถุและตัวละครของผู้เล่นหลังจากออก - ใส่โค้ดเพื่อให้แน่ใจว่าการเชื่อมต่อไม่มีอยู่ต่อหลังจากที่ผู้ใช้ออกไป, เช่นในตัวอย่างต่อไปนี้:
ตัวอย่างPlayers.PlayerAdded:Connect(function(player)player.CharacterRemoving:Connect(function(character)task.defer(character.Destroy, character)end)end)Players.PlayerRemoving:Connect(function(player)task.defer(player.Destroy, player)end)
การคํานวณฟิสิกส์
การจำลองฟิสิกส์เกินไปสามารถเป็นสาเหตุหลักที่ทำให้เวลาการประมวลผลเพิ่มขึ้นในแต่ละเฟรมทั้งในเซิร์ฟเวอร์และในลูกคลัง
ปัญหาทั่วไป
- ความถี่การเพิ่มขึ้นของเวลาฟิสิกส์เกินขีดจำกัดของการเพิ่มขึ้นของฟิสิกส์นั้นขึ้นอยู่กับความซับซ้อนของฟิสิกส์เมคันิสม์ โดยปกติ, การเพิ่มขึ้นของฟิสิกส์จะเป็นเวล
โหมดคงที่ที่มีความแม่นยำของฟิสิกส์ที่ปรับปรุงแล้วนั้นยังมีอยู่เช่นกันซึ่งบังคับให้พลังงานทั้งหมดของฟิสิกส์ทั้งหมดเริ่มต้นที่ 240 Hz (สี่ครั้งต่อเฟรม) นี่จะนำไปสู่การคำนวณมากขึ้นอย่างมากในแต่
จำนวนความซับซ้อนของวัตถุที่มากเกินไป - จำนวน 3D ที่ซิมูลเลตจะให้มากขึ้น ยิ่งมีจำนวนโครงสร้างที่ซิมูลเลตมากเท่าไหร่ การคำนวณฟิสิกส์ของแต่ละเฟรมก็จะยิ่งยาวนาน
การตรวจจับความสามารถในการชนกันอันเกินกว่าเทียบกันได้ - ชิ้นส่วน Mesh มีค่าสมบัติ CollisionFidelity เพื่อตรวจจับความสามารถในการชนกันซึ่งนำเ
มิติเดชัน
ติดตั้งชิ้นส่วนที่ไม่ต้องการการจำลอง - ติดตั้งชิ้นส่วนทั้งหมดที่ไม่ต้องการขับโดยฟิสิกส์เช่นสำหรับ NPC คงที่
ใช้การเร่งฟิสิกส์แบบปรับแต่ง - การเร่งฟิสิกส์จะปรับอัตราการคำนวณฟิสิกส์สำหรับฟิสิกส์เครื่องกลให้เป็นไปตามความถี่ที่ต่ำกว่าในบางกรณีเพื่อให้สามารถทำการอัปเดตการคำนวณฟิสิกส์ได้น้อยลงในบ
ลดความซับซ้อนของเครื่องกล * โดยเท่าที่เป็นไปได้ ลดจำนวนข้อจํากัดหรือข้อต่อของฟิสิกส์ในการประกอบ
- ลดจำนวนการชนเข็มขัดของตัวเองในเครื่องจักร เช่น โดยการใช้ข้อจํากัดหรือข้อจํากัดการชนเข็มของ ragdoll เพื่อป้องกันให้พวกเขาไม่สามารถชนเข็มขัดกันได้
ลดการใช้ความแม่นยำของความเข้ากันที่แน่นอนสำหรับเมช * สำหรับวัตถุขนาดเล็กหรือไม่สามารถใช้งานได้ที่ผู้ใช้จะสังเกตเห็นความแตกต่างได้น้อย ใช้ความนิ่งของกล่อง
สำหรับวัตถุขนาดเล็กถึงปานกลางให้ใช้ความสมจริงของกล่องหรือฮัลล์ ขึ้นอยู่กับรูปร่าง
สำหรับวัตถุขนาดใหญ่และขอบคุณสำหรับวัตถุที่ซับซ้อนมาก สร้างความสัมพันธ์การชนกันที่กำหนดเองโดยใช้ส่วนที่มองไม่เห็นเมื่อเป็นไปได้
สำหรับวัตถุที่ไม่ต้องการความสามัคคี ปิดการโต้ตีและใช้ความสามัคคีของกล่องหรือฮัลล์ เนื่องจากความสามัคคีของวัตถุยังคงถูกเก็บไว้ในหน่วยความจำ
คุณสามารถเรนเดอร์ความสามารถในการชนกันสำหรับการดีบั๊กใน Studio โดยเปิด ความสามารถในการชนกันของ Collision Fidelity จาก widget ตัวเลือกการดู ในมุมมองด้านบนขวา
นอกจากนี้คุณยังสามารถใช้ตัวกรอง CollisionFidelity = Precise สำหรับ Explorer ซึ่งแสดงจำนวนผิวโดยสมบูรณ์และสามารถเลือกได้อย่างง่ายดาย
สำหรับการเดินทางที่ละเอียดอ่อนเกี่ยวกับวิธีการเลือกตัวเลือกความสมจริงของการชนที่สมดุลความต้องการในการปรับแต่งความแม่นยำและประสิทธิภาพของคุณดูที่ กำหนดค่าปรับแต่งฟิสิกส์และการเรนเดอร์
สเกลไมโครโปรไฟล์
สเก็ต | คํานวณที่เกี่ยวข้อง |
ฟิสิกส์ | การคำนวณฟิสิกส์ทั้งหมด |
ขั้นตอนโลก | ขั้นตอนฟิสิกส์ที่แตกต่างกันที่เรียกใช้ในแต่ละเฟรม |
การใช้หน่วยความจำทางฟิสิกส์
การเคลื่อนไหวและการชนกันของฟิสิกส์ใช้หน่วยความจำ ตัวอ้างอิง Mesh มีค่า CollisionFidelity ที่กำหนดวิธีการเข้าถึงของการประเมินขอบเขตการชนของ Mesh
ปัญหาทั่วไป
โหมดตรวจจับความสามัคคีที่ปกติและแม่นยำใช้พื้นที่หน่วยความจำมากขึ้นกว่าสองโหมดอื่น ๆ ที่มีรูปแบบความสามัคคีที่แม่นยำต่ำ
หากคุณเห็นระดับการใช้งานหน่วยความจำสูงเกินไปภายใต้ PhysicsParts คุณอาจต้องสำรวจการลดความนิ่งของการชนของวัตถุในประสบการณ์ของคุณ
วิธีการลดความเสี่ยง
เพื่อลดความจำที่ใช้สำหรับความนิ่งในการชน:
- สำหรับชิ้นส่วนที่ไม่ต้องการความสามัคคี ปิดการโดนแทรกของชิ้นส่วนโดยการตั้ง BasePart.CanCollide 、 BasePart.CanTouch และ BasePart.CanQuery ให้เป็น 2> false2>
- ลดความนิ่งของการชนโดยใช้การตั้งค่า CollisionFidelity ต่ำสุด Box มีความนิ่งต่ำสุด และ Enum
- โดยทั่วไปแล้วปลอดภัยที่จะตั้งค่าความน่าเชื่อถือในการชนของชิ้นส่วนที่แนบเนียนเล็ก ๆ น้อย ๆ ไว้ที่ Box
- สำหรับเมชชี่ขนาดใหญ่ที่ซับซ้อนมาก คุณอาจต้องการสร้างเมชชี่ขนาดเล็กจากวัตถุที่มีความสามารถในการชนกันกับการเคลื่อนไหวแบบกล่อง
มนุษย์
Humanoid เป็นคลาสที่ให้บริการความสามารถที่หลากหลายให้กับผู้เล่นและตัวละครของผู้เล่น (NPC) อย่างไรก็ตาม Humanoid มาพร้อมกับค่าใช้จ่ายในการคำนวณที่มาก
ปัญหาทั่วไป
- การปลดปล่อยทั้งหมดของ HumanoidStateTypes เปิดใช้งานบน NPCs - มีค่าใช้จ่ายในการปลดปล่อยบาง HumanoidStateTypes ที่ไม่จำเป็นสำหรับ NPC ของคุณ สำหรับตัวอ
- กําลังเริ่มต้น แก้ไข และเริ่มต้นใหม่โมเดลด้วยมนุษย์โอไฮโอได้บ่อยนี้ * นี่อาจจะเป็นเรื่องยุ่งยากสำหรับเครื่องประมวลผลที่จะประมวลผล, โดยเฉพาะอย่างยิ่งหากเหล่านี้โมเดลใช้ เสื้อผ้าหลายชั้น . นี่ยังสามารถเป็นปัญหาได้อย่างมากในการประสบการณ์ที่มีอวาตาร์เกิดขึ
- ใน MicroProfiler ยาว updateInvalidatedFastClusters แท็ก (มากกว่า 4 มิลลิวินาที) มักจะเป็นสัญญาณว่าการติดตั้ง/การปรับแต่ง avatar กำลังเรียกใช้การปฏิเสธที่ผิดปกติเกินไป
- ใช้ Humanoids ในกรณีที่พวกเขาไม่จำเป็น - NPC สถิติที่ไม่เคลื่อนที่ไม่มีความจำเป็นสำหรับคลาส Humanoid
- เล่นอนิเมชันบนจำนวนมากของ NPC จากเซิร์ฟเวอร์ - อนิเมชัน NPC ที่ทำงานบนเซิร์ฟเวอร์จำเป็นต้องจำลองในเซิร์ฟเวอร์และเคลื่อนย้ายไปยังลูกค้า นี่อาจเป็นความเสียประสิทธิภาพที่ไม่จำเป็น
มิติเดชัน
- เล่นอนิเมชัน NPC บนเครื่องคอมพิวเตอร์ - ในประสบการณ์ที่มี NPC จำนวนมาก ลองสร้าง Class.Animator บนเครื่องคอมพิวเตอร์และดำเนินการอนิเมชันโดยตรง
- ใช้ตัวเลือกที่เหมาะสมกับมนุษย์เพื่อความเป็นมนุษย์ผสมผสาน - โมเดล NPC ไม่จำเป็นต้องมีวัตถุมนุษย์
- สำหรับ NPC คงที่ใช้ AnimationController เพราะพวกเขาไม่จำเป็นต้องเคลื่อนที่ แต่เพียงต้องเล่นอนิเมชั่น
- สำหรับการเคลื่อนย้าย NPC โปรดพิจารณาการใช้คอนโทรลเลอร์การเคลื่อนไหวของคุณเองและการใช้ AnimationController สำหรับอนิเมชันตามความซับซ้อนของ NPC ของคุณ
- ปิดการใช้งานของสถานะมนุษย์ที่ไม่ได้ใช้งาน - ใช้ Humanoid:SetStateEnabled() เพื่อเปิดใช้งานสถานะที่จำเป็นสำหรับแต่ละมนุษย์เท่านั้น
- รุ่น NPC สระน้ําพร้อมการเกิดใหม่บ่อยครั้ง - แทนที่จะทําลาย NPC ทั้งหมด ส่ง NPC ไปยังสระน้ําของ NPC ที่ไม่ได้ใช้งาน NPC สระน้ําเป็นวิธีการ
- เฉพาะตอนที่ผู้ใช้อยู่ใกล้เคียงเท่านั้นที่จะเรียก NPC - อย่าเรียก NPC เมื่อผู้ใช้ไม่อยู่ในระยะ, และกำจัดพวกเขาเมื่อผู้ใช้ออกจากระยะ
- หลีกเลี่ยงการเปลี่ยนแปลงระดับหัวข้อของอวาตาร์หลังจากที่มันถูกเรียกใช้ - การเปลี่ยนแปลงบางอย่างในระดับหัวข้อของอวาตาร์มีผลกระทบต่อประสิทธิภาพอย่างมาก บางการปรับแต่งสามารถใช้ได้:
- สำหรับอนิเมชั่นขั้นตอนที่กําหนดเอง, อย่าปรับปรุง JointInstance.C0 และ JointInstance.C1 โปรพี่ตัว แทน, ปรับปรุง Motor6D.Transform โปรพี่ตัว
- หากคุณต้องการแนบวัตถุ BasePart ใด ๆ ไปยังอวาตาร์ให้ทำเช่นนี้นอกระดับของอวาตาร์ Model
สเกลไมโครโปรไฟล์
สเก็ต | คํานวณที่เกี่ยวข้อง |
ขั้นตอนHumanoid | การควบคุมและฟิสิกส์ของมนุษย์ |
อนิเมชั่นขั้นตอน | แอนิเมชัน |
อัปเดตรวมกลุ่มที่ไม่ถูกต้อง | เกี่ยวข้องกับการเริ่มต้นหรือแก้ไขอวาตาร์ |
การเรนเดอร์
ส่วนที่สำคัญของเวลาที่ลูกค้าใช้ในแต่ละเฟรมคือการเรนเดอร์ฉากในเฟรมปัจจุบัน ซึ่งเซิร์ฟเวอร์ไม่ทำการเรนเดอร์ใด ๆ ดังนั้นส่วนนี้จึงเป็นของลูกค้าเท่านั้น
วาดเรียก
คำเรียกวาดเป็นชุดคำสั่งจากเครื่องสู่GPUเพื่อเรนเดอร์บางสิ่ง คำเรียกวาดมีความซับซ้อนอย่างมาก โดยทั่วไป, จำนวนคำเรียกวาดต่อแถ่นจะน้อยลง เวลาในการเรนเดอร์ของแถ่นน้อยลง
คุณสามารถดูจำนวนการเรียกดูได้หลายรายการด้วย ระบบสถิติการเรียกดู > เวลา รายการใน Studio คุณสามารถดู ระบบสถิติการเรียกดู ในคลังข้อมูลโดยกด 1> Sh
ยิ่งมีวัตถุมากขึ้นที่ต้องวาดในฉากของคุณในระดับหนึ่งในระดับหนึ่ง, จะทำให้เรียกดูคำเรียกดูเพิ่มเติมไปยังGPU อย่างไรก็ตาม, เครื่องมือ Roblox ใช้วิ
- วัสดุเหมือนกันเมื่อทั้ง SurfaceAppearance และ MeshPart.TextureID ไม่มีอยู่จริง
ปัญหาทั่วไปอื่น ๆ
ความหนาแน่นวัตถุเกินขีดจำกัดของวัตถุ - หากมีจำนวนมากของวัตถุอยู่ในความหนาแน่นสูง การเรนเดอร์พื้นที่นี้ของฉากต้องใช้ความเรียกแก้ไขมากขึ้น หากคุณกำลังพบว่า
วัตถุเช่นเม็ดลงสี ข้อความ และอนุภาคไม่แสดงผลเหมาะสมและนำเสนอการเรียกเรียกวาดเพิ่มเติม ให้ความสนใจเป็นพิเศษกับประเภทวัตถุเหล่านี้ในฉาก การดำเนินการ
พลาดโอกาสในการติดตั้งโอกาส - โอกาสของเซนส์มักจะรวมถึงเมชเดียที่เหมือนกันซ้ำหลายครั้ง แต่แต่ละคันของเมชมีรหัสเมชหรือเนื้อผ้าที่แตกต่างกัน
สาเหตุที่พบบ่อยที่สุดสำหรับปัญหานี้คือเมื่อฉากทั้งหมดนำเข้าในครั้งเดียว โดยไม่ใช่แต่ละสินทรัพย์ที่นำเข้าไปยัง Roblox แล้วจากนั้นดัดผสานโพสต์อิมพอร์ตเพื่อสร้างฉาก
ความซับซ้อนของวัตถุเกินไป - แม้ว่าจะไม่สำคัญเท่ากับจำนวนการเรียกวาด จำนวนเหลี่ยมในฉากก็ส่งผลต่อระยะเวลาในการเรนเดอร
การแสดงเงาเกินขีด - การจัดการเงาเป็นกระบวนการที่แพงและต้องใช้เวลานาน และแผนที่ที่มีจำนวนและความหนาแน่นของวัตถุเงาที่แสดงเงา (หรือแผนที่ที่มีจำนวนและความหนาแน่นของวัตถุเง
ความโปร่งใสสูงเมื่อถอนสิ่งของออกจากกัน - วางวัตถุที่มีความโปร่งใสบางส่วนใกล้กันบังคับให้เครื่องประมวลผลตรวจสอบและแก้ไขพิกเซลที่ซ้อนกันหลายครั้งซึ่งอาจทำให้ประสิ
มิติเดชัน
การติดตั้งเมชที่เหมือนกันและลดจำนวนเมชที่เหมือนกัน - หากคุณให้แน่ใจว่าเมชทั้งหมดเหมือนกันเพื่อให้ได้รับร
ลดความนิ่งในการเรนเดอร์ - ตั้งค่าความนิ่งในการเรนเดอร์เป็น อัตโนมัติ หรือ ประสิทธิภาพ ตัวนี้สามารถให้เน็ตว์กลับสู่ตัวเลือกที่ซับซ้อนน้อยลงซึ่งสามา
ปิดการใช้งานเงาสะท้อนแสงในส่วนที่เหมาะสมและวัตถุอาณาเขตการแสดงผลแสงอาจลดความซับซ้อนของเงาในฉากได้โดยการปิดการใช้งานเงาสะท้อนแสงในวัตถุและส่วนอื่น ๆ โดยเลือกให้ปิดการ
ใช้สมบัติสมุด BasePart.CastShadow เพื่อปิดการใช้งานการโคลนเงาบนพื้นผิวเล็กๆ ที่เงาไม่มองเห็นได้ สิ่งนี้สามารถมีประสิทธิภาพได้อย่างมากเมื่อใช้กับเฉพาะส่วนที่อยู่ไกลออกไปจากกล้องของ
ปิดเงาบนวัตถุที่เคลื่อนไหวได้เมื่อเป็นไปได้
ปิด Light.Shadows ในตัวอย่างแสงที่ไม่จำเป็นต้องสร้างเงา
จํากัดระยะและมุมของตัวอินสตานซ์แสง
ใช้ตัวอินสแตนซ์แสงน้อยลง
สเกลไมโครโปรไฟล์
สเก็ต | คํานวณที่เกี่ยวข้อง |
เตรียมและประกอบ | การเรนเดอร์ทั้งหมด |
ประมวลผล / ฉาย / คํานวณแสง | การอัปเดตเครือข่ายแสงและเงา |
แสงGridCPU | การปรับปรุงเครือข่ายแสง Voxel |
ระบบ ShadowMap | การแปลงเงา |
ทำ/ฉาก/UpdateView | การเตรียมการเรนเดอร์และการปรับปรุงอนุภาค |
ทำงาน/ฉาก/RenderView | การเรนเดอร์และโพสต์ประมวลผล |
เครือข่ายและ Replication
เครือข่ายและการเลียนแบบอธิบายวิธีการที่ข้อมูลจะถูกส่งระหว่างเซิร์ฟเวอร์และลูกค้าที่เชื่อมต่อ ข้อมูลจะถูกส่งระหว่างลูกค้าและเซิร์ฟเวอร์ทุกเฟรม แต่จำนวนข้อมูลที่ใหญ่ขึ้นต้องใช้เวลาในการประมวลผ
ปัญหาทั่วไป
การส่งมากเกินไปของการจราจรระยะไกล - การส่งข้อมูลจำนวนมากผ่าน RemoteEvent หรือ RemoteFunction ตัวหรือการเรียกใช้พวกเขาอย่างต่อเนื่องสามารถทำให้เกิดเวลาก
- การเรียกข้อมูลทุกช่วงที่ไม่จำเป็นต้องเรียกข้อมูล
- การเรียกข้อมูลจากผู้ใช้โดยไม่มีเครื่องมือใด ๆ เพื่อป้องกันมัน
- การส่งมอบข้อมูลมากเกินไปที่ต้องการ เช่น การส่งมอบรายการเต็มของผู้เล่นเมื่อพวกเขาซื้อไอเท็มแทนที่จะเป็นรายละเอียดของไอเท็มที่ซื้อ
การสร้างหรือการลบต้นไม้รุ่นผังที่ซับซ้อนของคอมพิวเตอร์ - เมื่อมีการเปลี่ยนแปลงในข้อมูลบนเซิร์ฟเวอร์จะถูกเลียนแบบไปยังลูกค้าที่เชื่อมต่อ ซึ่งหมายความว่าการสร้างและการทำ
ข้อมูลจุดมุ่งหมายที่ซับซ้อนที่นี่คือข้อมูลอนิเมชันที่บันทึกโดย Animation Editor ปลั๊กอินในริกของเกม หากไม่ได้ลบออกก่อนที่จะเผยแพร่เกมและเผยแพร่รุปแบบอนิเมชันอย่างต่อเนื่องจะมีการเผยแพร่ข้อมูลท
ทวีนเซอร์-ไซด์ TweenService - หาก TweenService ใช้เพื่อทวีนเซิร์ฟเวอร์ด้านหน้า ทรี่ทวีนจะถูกเรียกใหม่ทุกๆ เฟรม ไม่เพียง แต่จะทำให้ทวีนเป็นไปตามลั
มิติเดชัน
คุณสามารถใช้กลยุทธ์ต่อไปนี้เพื่อลดการเลียนแบบที่ไม่จำเป็น:
- หลีกเลี่ยงการส่งข้อมูลขนาดใหญ่ผ่านกิจกรรมระยะไกล แทนที่ด้วยการส่งข้อมูลที่จำเป็นเท่านั้นในความถี่ที่ต่ำ โดยเฉพาะอย่างยิ่งสำหรับสถานะของตัวละคร เช่น เมื่อมันเปลี่ยนแทนทุกเฟรม
- ทำให้ต้นไม้รายละเอียดขนาดใหญ่เหล่านี้เป็นเหมือนแผนที่และโหลดพวกเขาในชิ้นส่วนเพื่อจัดการงานเลียนแบบเหล่านี้ในหลายเฟรม * ล้างข้อมูลอนิเมชันของอนิเมชันเมทริคให้เป็นปกติหลังจากนำเข้า * จํากัดการเลียนแบบอินส턴ส์ที่ไม่จําเป็นในกรณีที่เซิร์ฟเวอร์ไม่จําเป็นต้องมีความรู้ในการสร้างอินสโตนซึ่งรวมถึง:
- เอฟเฟกต์ทางสายตาเช่นระเบิดหรือการโจมตีเวทย์มนตร์ เซิร์ฟเวอร์ต้องการรู้ตำแหน่งเท่านั้นเพื่อกำหนดผลลัพธ์ ในขณะที่ลูกค้าสามารถสร้างเอฟเฟกต์ทางสายตาได้โดยตรง
- รุ่นแสดงผลของไอเท็มในบุคคลที่หนึ่ง
- Tween วัตถุบนเครื่องคอมพิวเตอร์แทนที่จะเป็นเซิร์ฟเวอร์
สเกลไมโครโปรไฟล์
สเก็ต | คํานวณที่เกี่ยวข้อง |
แพ็คเก็ต | การประมวลผลสำหรับการเคลื่อนไหวของเครือข่ายเข้ามา เช่นเชิญเหตุการณ์และการเปลี่ยนแปลงสถานะ |
กำหนดความสามารถในการส่งสัญญาณและประมูล | กิจกรรมที่เกิดขึ้นในเซิร์ฟเวอร์ที่เกี่ยวข้อง |
การใช้หน่วยความจำ
กลไกผลกระทบสูงสุดที่มีให้สำหรับผู้สร้างเพื่อปรับปรุงการใช้หน่วยความจำของลูกค้าคือการเปิดใช้งาน การสตรีมมิงอินสแตนซ์
การสตรีมมิงเครื่องสำอาง
การจัดการตัวอย่างที่เลือกจะโหลดชิ้นส่วนของข้อมูลที่ไม่จำเป็นออกจากรุ่นข้อมูลที่ต้องการ ซึ่งสามารถนำไปสู่เวลาการโหลดที่ลดลงอย่างมากและเพิ่มความสามารถในการป้องกันความล้มเหลวของลูกค้าเมื่อมันม
หากคุณพบปัญหาหน่วยความจำและมีการสตรีมเครื่องมือในสถานะปิดอยู่ โปรดพิจารณาการปรับปรุงประสบการณ์ของคุณเพื่อสนับสนุนมัน โดยเฉพาะอย่างยิ่งหากโลก 3D ของคุณใหญ่
หากการสตรีมเครื่องสำอางถูกเปิดใช้งานแล้วคุณสามารถเพิ่มความรุนแรงของมันได้ เช่น โปรดพิจารณา:
- การลดการใช้งาน StreamingIntegrity ที่คงที่
- ลด รัศมีการสตรีมมิง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการสตรีมและประโยชน์ของพวกเขาให้ดูที่ คุณสมบัติการสตรีม .
ปัญหาทั่วไปอื่น ๆ
- การเลียนแบบสินทรัพย์ - ความผิดพลาดที่พบบ่อยคือการอัปโหลดสินทรัพย์เดียวกันหลายครั้งทำให้เกิด ID สินทรัพย์ที่แตกต่างกัน นี่อาจทำให้เนื้อหาเดียวกันถูกโหลดเข้าสู่หน่วยความจำหลายครั้ง
- ความเสียหายของความเสียหายของสินทรัพย์มากเกินไป - แม้ว่าสินทรัพย์จะไม่เหมือนกัน แต่ก็มีกรณีที่โอกาสในการใช้ใหม่สินทรัพย์เดียวกันและประหยัดหน่วยความจำไม่พบ
- ไฟล์เสียง - ไฟล์เสียงสามารถเป็นผู้บริจาคที่น่าประหลาดใจสำหรับการใช้หน่วยความจำ โดยเฉพาะอย่างยิ่งหากคุณโหลดพวกเขาทั้งหมดในเครื่องเป็นเวลานานกว่าการโหลดส่วนที่คุณต้องก
- เนื้อหาที่มีความละเอียดสูง - การใช้หน่วยความจำกราฟิกสำหรับเนื้อหาเป็นไปไม่เกี่ยวข้องกับขนาดของเนื้อหาในดิสก์ แต่เป็นจำนวนของพิกเซลในเนื้อหา
- ตัวอย่างเช่น ขนาด 1024x1024 พิกเซลใช้พื้นที่หน่วยประมวลผลของกราฟิก 4 เท่าของขนาด 512x512
- รูปภาพที่อัปโหลดไปยัง Roblox ถูกเข้ารหัสเป็นรูปแบบติดตัวต้องแน่นอน ดังนั้นจึงไม่มีประโยชน์ในการอัปโหลดรูปภาพในรูปแบบสี โดย
- คุณสามารถระบุการใช้หน่วยความจำกราฟิกสำหรับข้อความนี้ด้วยการขยายหมวดหมู่ กราฟิกส์ ใน คอนโซลผู้พัฒนา
มิติเดชัน
- อัปโหลดสินทรัพย์เฉพาะครั้งเท่านั้น - รียูเอสไอดีสินทรัพย์เดียวกันทั่วองค์ประกอบและให้แน่ใจว่าสินทรัพย์เดียวกัน เช่น เมช และรูปภาพ ไม่ได้อัปโหลดไปยังหลายครั้ง
- ค้นหาและแก้ไขสินทรัพย์ที่ซ้ำกัน - ค้นหาชิ้นส่วนและเนื้อผ้าที่เหมือนกันที่อัปโหลดหลายครั้งด้วยรหัสที่แตกต่างกัน
- แม้ว่าจะไม่มี API ที่จะตรวจจับความคล้ายกันของสินทรัพย์โดยอัตโนมัติ คุณสามารถรวบรวมทุกรหัสสินทรัพย์ในสถานที่ของคุณ (เช่นเดียวกับการดาวน์โหลดสินทรัพย์ทั้งหมดและเปรียบเทียบพวกเขาโดยใช้เครื่องมื
- สำหรับชิ้นส่วนเมช กลยุทธ์ที่ดีที่สุดคือการใช้รหัสเมชที่ไม่ซ้ำกันและจัดระเบียบาลอย่างมีนัยในขนาดเพื่อระบุคู่ที่ซ้ำกันโดยมนุษย์
- แทนที่จะใช้ข้อความแยกเป็นสีต่างๆ โปรดอัปโหลดข้อความเดียวและใช้คุณสมบัติ SurfaceAppearance.Color เพื่อใช้สีต่างๆ ในการประยุกต์
- นำสินทรัพย์มาในแผนที่แยกกับแผนที่ทั้งหมดในแผนที่เป็นครั้งเดียวได้เท่านั้น - แทนที่จะนำแผนทั้งหมดมาในครั
- จํากัดพิกเซลของรูปภาพไม่เกินขนาดที่จําเป็น น้อยกว่าจํานวนเงินที่จําเป็น ยกเว้นรูปภาพที่กําลังปกครองพื้นที่ทางกายภาพมากเกินไปในหน้าจอ โดยปกติรูปภา
- ใช้แผ่นตัดฉีกขยะ เพื่อให้แน่ใจว่ามีการใช้เทคโนโลยีการแชร์ข้อมูลเสียให้มากที่สุดในแผนที่ 3D สำหรับขั้นตอนและตัวอย่างเกี่ยวกับวิธีการสร้างแผ่นตัดฉีกขยะให้ดูที่ สร้างแผ่นตัดฉ
เวลาโหลด
หลายประสบการณ์ใช้หน้าจอการโหลดแบบกําหนดเองและใช้วิธีการ ContentProvider:PreloadAsync() เพื่อร้องขอสินทรัพย์ให้ดาวน์โหลดในพื้นหลังด้วยรูปภาพการเสียงและเมช
ข้อดีของวิธีนี้คือคุณสามารถรับประกันได้ว่าส่วนสำคัญของประสบการณ์ของคุณจะโหลดเสร็จสมบูรณ์โดยไม่มีป๊อปอัน อย่างไรก็ตามข้อผิดพลาดที่พบบ่อยคือการใช้วิธีนี้เกินไปเพื่อการเตรียมพร้อมสำหรับเ
ตัวอย่างของการฝึกซ้อมที่ไม่ดีคือการโหลด ทั้งหมดWorkspace ในขณะที่นี่อาจป้องกันการป๊อปอัปของเท็กสต์ แต่มันเพิ่มเวลาการโหลดอย่างมาก
แทนที่นี้ใช้ ContentProvider:PreloadAsync() ในสถานการณ์ที่จำเป็นเท่านั้นซึ่งรวมถึง:
- รูปในหน้าจอการโหลด
- รูปภาพที่สำคัญในเมนูประสบการณ์ของคุณ เช่น พื้นหลังปุ่มและไอคอน
- สินทรัพย์สำคัญในพื้นที่เริ่มต้นหรือจุดเกิด
หากคุณต้องโหลดจํานวนมากของสินทรัพย์เราขอแนะนําให้คุณให้ปุ่ม Skip Loading