เหตุใดฉันจึงควรพิจารณาสร้างและใช้กลุ่มออบเจ็กต์แทนการสร้างวัตถุใหม่ในทันที


25

ฉันได้อ่านเกี่ยวกับรูปแบบนี้หลายครั้ง (จากมุมมองแนวปฏิบัติที่ดีที่สุด):

การจัดสรรหน่วยความจำ : แทนที่จะสร้างวัตถุใหม่ในทันทีให้พิจารณาสร้างและใช้กลุ่มวัตถุเสมอ มันจะช่วยให้การกระจายตัวของหน่วยความจำน้อยลงและทำให้ตัวเก็บขยะทำงานน้อยลง

อย่างไรก็ตามฉันไม่รู้ว่าที่จริงแล้วมันหมายถึงอะไร ฉันจะใช้มันได้อย่างไร

ตัวอย่างเช่นฉันสามารถสร้างอินสแตนซ์ของการGameObjectใช้InstantiateUnity ได้หรือไม่

Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity);

การใช้งานนี้หมดกำลังใจหรือไม่? มันหมายความว่าอะไร?



ขอบคุณ Hellium ฉันไม่ได้ดูวิดีโอที่ให้มา (ใหญ่เกินไป) แต่ข้อความช่วยให้ฉันเข้าใจจริง ๆ "การกระทำของการทำลายและการทำลายล้างนั้นไม่มีประสิทธิภาพและทำให้โครงการของคุณช้าลง"
Muhammad Faizan Khan

1
โปรดทราบว่าในขณะที่คำแนะนำนี้เป็นเรื่องปกติมันไม่ได้เป็นข้อกำหนดที่แน่นอนสำหรับทุกเกม โดยเฉพาะอย่างยิ่งถ้าคุณกำลังสร้างเกมเดสก์ท็อปขนาดเล็ก / สั้นการส่งติดขัดหรือต้นแบบคุณไม่จำเป็นต้องออกไปใช้วิธีการรวมกำไรกัน ในการทดสอบแบบแช่ตัวของฉัน Unity ถือได้ว่ามีการวางไข่และทำลายล้างสูงกว่าที่เราให้เครดิต ;) แต่ให้พิจารณารวมกันหากคุณสร้างเกมยาว ๆ ที่คุณไม่ต้องการให้ขยะกองพะเนินและก่อให้เกิดการพูดติดอ่างเมื่อมันถูกรวบรวมในภายหลังหรือถ้าคุณกำหนดเป้าหมายแพลตฟอร์มมือถือที่มีผลกระทบต่อประสิทธิภาพมากขึ้น
DMGregory

ขอบคุณ @DMGregory คุณพูดถูก การป้อนข้อมูลของคุณมีค่าอยู่เสมอเราไม่ควรกังวลเกี่ยวกับการรวมวัตถุในเกมเล็ก ๆ เพราะจะต้องมีการทำงานพิเศษในการเข้ารหัส
มูฮัมหมัด Faizan Khan

1
นี่เป็นรูปแบบที่พบบ่อยมาก แต่ให้แน่ใจว่าได้ทำให้มันเป็นไปตามกฎ: "โปรไฟล์ก่อน มันง่ายที่จะปรับสิ่งที่ไม่สำคัญ
Cort Ammon - Reinstate Monica

คำตอบ:


41

หากคุณวางแผนที่จะสร้างอินสแตนซ์ของ prefab ที่เหมือนกันหลายอินสแตนซ์คุณควรคิดถึงการใช้การรวมวัตถุ ฟังก์ชัน Instantiate ของการโทรเป็นหนึ่งในวิธีการเรียกเก็บภาษีที่ดีที่สุดที่คุณสามารถทำได้

การรวมวัตถุคือเมื่อคุณสร้างอินสแตนซ์ prefab ก่อนที่จะใช้ พวกเขาจะปิดการใช้งานทันทีที่ instantiation และเปิดใช้งานเฉพาะเมื่อมีความจำเป็น ในขณะนี้จะเพิ่มการใช้หน่วยความจำมันหลีกเลี่ยงค่าใช้จ่าย CPU ของ instantiating ระหว่างการเล่นเกม

ตัวอย่างเช่นขณะนี้ฉันกำลังทำงานกับเกมนรกกระสุนที่ต้องใช้กระสุนจำนวนหลายร้อยตัวเพื่อวางไข่ในขณะทำงาน ตอนแรกฉันพยายามทำเกมโดยไม่รวมวัตถุ แต่มันกลายเป็นหายนะ (น้อยกว่า 2 เฟรมต่อวินาที) ตอนนี้ฉันรวมกระสุน 500 นัดก่อนเริ่มเกมและเกมวิ่งเร็วอย่างน่าอัศจรรย์ (200 fps)

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

บทช่วยสอน YouTube ของ Sebastian Lague เป็นแหล่งข้อมูลที่ดีสำหรับการเรียนรู้เกี่ยวกับการรวมวัตถุ: https://youtu.be/LhqP3EghQ-Q


"การกระทำของการสร้างอินสแตนซ์และการทำลายนั้นไม่มีประสิทธิภาพและทำให้โครงการของคุณช้าลง" นี่คือเหตุผล? ดังนั้นมันจึงหมายความว่าเราต้องเขียนโค้ดอีกเล็กน้อย (เช่นเปิดใช้งาน deactive หรือกำหนดตำแหน่งของกระสุนอีกครั้งเพื่อให้เราสามารถยิงได้อีกครั้ง)
Muhammad Faizan Khan

12
มันอาจจะคุ้มค่าที่จะกล่าวถึงการจัดสรรและการเก็บขยะในฐานะผู้บริจาครายใหญ่ให้กับค่าใช้จ่ายในการเริ่มต้นและทำลาย สร้างขยะมากพอและท้ายที่สุดเกมทั้งหมดต้องรอให้ผู้รวบรวมขยะกวาดมันทั้งหมด ;)
DMGregory

3
@corsiKa ที่จะเพิ่มประสิทธิภาพยุค 80 ความสามัคคีสามารถปิดการใช้งาน prefab ที่เป็นปัญหาทำให้ระบบไม่สนใจ
congusbongus

2
"ตัวอย่างเช่นหากคุณมีเกมที่ผู้เล่นป้อนข้อมูลจะสั่งการวางไข่แบบ prefab คุณอาจไม่มีทางเลือกอื่นนอกจากใช้การโทรหาอินสแตนซ์ทั่วไป" - ไม่จริง คุณสามารถมีหลาย ๆ ออบเจ็กต์ได้อย่างง่ายดายสำหรับการแบ่งส่วนรูปแบบที่แตกต่างกันตามขนาดที่ต้องการเมื่อเริ่มต้น (หรือโหลดฉาก) หรือถ้ามีใครต้องการสร้างมันก็มี object pool ที่เก็บประเภท prefab หลายประเภทด้วยเช่นกัน
Ethan Bierlein

1
@DMGregory ในสภาพแวดล้อม GC ทั่วไปการจัดสรรปันส่วนเป็นค่าใช้จ่ายส่วนใหญ่ ในสภาพแวดล้อมที่ไม่ใช่ GC ทั่วไปการจัดสรรเป็นค่าใช้จ่ายส่วนใหญ่ การรวมวัตถุนั้นใช้งานได้ดีสำหรับทั้งคู่พวกเขาเป็นเพียงเหรียญสองด้านจริงๆส่วนใหญ่ ในกรณีที่รุนแรงเกมเก่าที่เคยถูกเขียนด้วยวัตถุทั้งหมด "จัดสรร" จาก get-go - การจัดสรรหน่วยความจำน้อยมากหรือไม่มีเลยในขณะที่เกมกำลังทำงาน คุณไม่ได้ใช้อะไรที่ไม่ได้ "รวม" ในบางวิธี เนื่องจาก Unity ใช้ "เมทาดาทา" แบบเรียลไทม์จำนวนมากการรวมกำไรจึงช่วยได้ค่อนข้างน้อย
Luaan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.