ปรับปรุงประสิทธิภาพ

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

หน้านี้อธิบายปัญหาประสิทธิภาพทั่วไปและการดำเนินการที่ดีที่สุดสำหรับการรับมือกับพวกเขา

การคำนวณสคริปต์

การดำเนินการที่แพงในโค้ด 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.CanCollideBasePart.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 ใช้วิ

ปัญหาทั่วไปอื่น ๆ

  • ความหนาแน่นวัตถุเกินขีดจำกัดของวัตถุ - หากมีจำนวนมากของวัตถุอยู่ในความหนาแน่นสูง การเรนเดอร์พื้นที่นี้ของฉากต้องใช้ความเรียกแก้ไขมากขึ้น หากคุณกำลังพบว่า

    วัตถุเช่นเม็ดลงสี ข้อความ และอนุภาคไม่แสดงผลเหมาะสมและนำเสนอการเรียกเรียกวาดเพิ่มเติม ให้ความสนใจเป็นพิเศษกับประเภทวัตถุเหล่านี้ในฉาก การดำเนินการ

  • พลาดโอกาสในการติดตั้งโอกาส - โอกาสของเซนส์มักจะรวมถึงเมชเดียที่เหมือนกันซ้ำหลายครั้ง แต่แต่ละคันของเมชมีรหัสเมชหรือเนื้อผ้าที่แตกต่างกัน

    สาเหตุที่พบบ่อยที่สุดสำหรับปัญหานี้คือเมื่อฉากทั้งหมดนำเข้าในครั้งเดียว โดยไม่ใช่แต่ละสินทรัพย์ที่นำเข้าไปยัง Roblox แล้วจากนั้นดัดผสานโพสต์อิมพอร์ตเพื่อสร้างฉาก

  • ความซับซ้อนของวัตถุเกินไป - แม้ว่าจะไม่สำคัญเท่ากับจำนวนการเรียกวาด จำนวนเหลี่ยมในฉากก็ส่งผลต่อระยะเวลาในการเรนเดอร

  • การแสดงเงาเกินขีด - การจัดการเงาเป็นกระบวนการที่แพงและต้องใช้เวลานาน และแผนที่ที่มีจำนวนและความหนาแน่นของวัตถุเงาที่แสดงเงา (หรือแผนที่ที่มีจำนวนและความหนาแน่นของวัตถุเง

  • ความโปร่งใสสูงเมื่อถอนสิ่งของออกจากกัน - วางวัตถุที่มีความโปร่งใสบางส่วนใกล้กันบังคับให้เครื่องประมวลผลตรวจสอบและแก้ไขพิกเซลที่ซ้อนกันหลายครั้งซึ่งอาจทำให้ประสิ

มิติเดชัน

  • การติดตั้งเมชที่เหมือนกันและลดจำนวนเมชที่เหมือนกัน - หากคุณให้แน่ใจว่าเมชทั้งหมดเหมือนกันเพื่อให้ได้รับร

  • การเรียงลำดับ - การเรียงลำดับอธิบายวิธีการกำจัดโทรเรียมสำหรับวัตถุที่ไม่เป็นตัวแทนในเฟรมเรนเดอร์สุดท้าย โ

    • ซ่อน MeshPart และ BasePart ที่อยู่ไกลออกไปจากกล้องหรือการตั้งค่า
    • สำหรับสภาพแวดล้อมภายใน ให้ใช้ระบบห้องหรือพอร์ทัลที่ซ่อนวัตถุที่ไม่ได้ถูกใช้งานโดยผู้ใด
  • ลดความนิ่งในการเรนเดอร์ - ตั้งค่าความนิ่งในการเรนเดอร์เป็น อัตโนมัติ หรือ ประสิทธิภาพ ตัวนี้สามารถให้เน็ตว์กลับสู่ตัวเลือกที่ซับซ้อนน้อยลงซึ่งสามา

  • ปิดการใช้งานเงาสะท้อนแสงในส่วนที่เหมาะสมและวัตถุอาณาเขตการแสดงผลแสงอาจลดความซับซ้อนของเงาในฉากได้โดยการปิดการใช้งานเงาสะท้อนแสงในวัตถุและส่วนอื่น ๆ โดยเลือกให้ปิดการ

  • ใช้สมบัติสมุด 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