ฉันได้ทำการวิจัยการสร้างวิธีการจัดสรรของตัวเอง (ซึ่งจะสนับสนุนสิ่งต่าง ๆ เช่นพูลหน่วยความจำและการทำโปรไฟล์) อย่างไรก็ตามเมื่อฉันทำการวิจัยต่อไปฉันได้มองหาวิธีการนี้ในการพัฒนาเกม
ฉันสามารถใช้เทคนิคการจัดสรรหน่วยความจำแบบใดและทำไมจึงเป็นเทคนิคที่ดี
ฉันได้ทำการวิจัยการสร้างวิธีการจัดสรรของตัวเอง (ซึ่งจะสนับสนุนสิ่งต่าง ๆ เช่นพูลหน่วยความจำและการทำโปรไฟล์) อย่างไรก็ตามเมื่อฉันทำการวิจัยต่อไปฉันได้มองหาวิธีการนี้ในการพัฒนาเกม
ฉันสามารถใช้เทคนิคการจัดสรรหน่วยความจำแบบใดและทำไมจึงเป็นเทคนิคที่ดี
คำตอบ:
Game Engine Architectureมีข้อมูลบางอย่างเกี่ยวกับหัวข้อนี้ พื้นฐานคือคุณต้องทำการวิเคราะห์เพื่อทำความเข้าใจความต้องการหน่วยความจำของคุณต่อระดับ / เฟรม / ฯลฯ เป็นเหมือน แต่มีรูปแบบบางอย่างที่ผู้เขียนกล่าวถึงเมื่อเห็นหลายครั้ง:
สิ่งที่ใหญ่ที่สุดที่ผู้เขียนกล่าวถึงการระวังคือการกระจายตัวของหน่วยความจำ นี่เป็นปัญหาน้อยถ้าคุณพัฒนาเช่นพีซีที่คุณมีหน่วยความจำสำรองเพจจิ้งที่คุณสามารถนับ แต่ในบริบทหน่วยความจำคงที่เช่นคอนโซลมีความเสี่ยงของการเป็น "หน่วยความจำไม่เพียงพอ" เมื่อพยายามจัดสรรสำหรับวัตถุขนาดใหญ่เนื่องจากหน่วยความจำของคุณมีการแยกส่วนในลักษณะที่มีเพียงบล็อกต่อเนื่องขนาดเล็กเท่านั้นที่มีอยู่ ด้วยเหตุนี้เขาแนะนำให้ตัวจัดสรรสแต็กตามด้านบนมีวิธีการจัดเรียงข้อมูลเนื้อหาเป็นระยะ
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรหัสจริงที่เกี่ยวข้องในเรื่องนี้ฉันขอแนะนำบทความของ Christian Gyrling ว่า "เรามีความจำไม่พอหรือยัง" ซึ่งครอบคลุมเทคนิคสำหรับตัวจัดสรรที่กำหนดเองส่วนใหญ่มาจากมุมมองของการวิเคราะห์รูปแบบการใช้หน่วยความจำ แต่ก็ยังสามารถนำไปใช้กับการคิดค้นโซลูชันที่กำหนดเองสำหรับการจัดการหน่วยความจำ
จากสิ่งที่ฉันได้เห็น (แต่ไม่ได้ทำ) แต่ละเกมมีแนวโน้มที่จะสืบทอดกลไกการจัดสรรจากเฟรมเวิร์กจากเอ็นจิ้นเกมจากเวอร์ชันก่อนหน้า (2010 -> 2011) หรือได้รับชุดใหม่ที่เขียนขึ้นมาโดยเฉพาะ โครงสร้าง (ทั้งเมื่อโครงสร้างข้อมูลสามารถนำมาใช้ใหม่และขนาดคงที่หรือหลายประเภทและขนาดตัวแปร)
นอกจากนี้เรามีผู้จัดสรรที่แตกต่างกันสำหรับไฟล์เสียง / ส่วนประกอบกว่าระดับและวัตถุเกมอื่น ๆ ในโครงการเดียวกัน ในตัวจัดสรรโครงการอื่น ๆ นั้นสืบทอดมาจากไลบรารีภายนอกสำหรับส่วนประกอบที่จัดการโดย lib นั้นเท่านั้น
การเพิ่มประสิทธิภาพนั้นขึ้นอยู่กับความต้องการของคุณ แต่โดยปกติแล้วการจัดสรรจะทำก่อนเข้าสู่ฉากเกมแล้วจึงนำหน่วยความจำกลับมาใช้ใหม่ เกมบางเกมสามารถหลบไปได้โดยไม่มีผู้จัดสรรที่กำหนดเอง แต่สำหรับเกมแอคชั่นที่มีการจัดสรรงบประมาณหน่วยประมวลผลหน่วยความจำและข้อมูลคุณไม่สามารถเสียเวลาในการประมวลผลในการจัดสรรจำนวนมากคุณไม่สามารถเสียหน่วยความจำต่อการแยกส่วนและปัญหาอื่น ๆ
ตัวอย่างที่เกี่ยวข้องกับคุณควรเริ่มต้นด้วยการดูที่ตัวเกมOGRE 3Dมันมีตัวเลือกไม่กี่ตัวในการกำหนดค่าตัวจัดสรรหน่วยความจำ
ข้อผิดพลาดที่เกิดขึ้นบ่อยครั้งก็คือการเขียนตัวจัดสรรของคุณเองเพื่อให้คุณสามารถควบคุมจำนวนหน่วยความจำที่ถูกใช้งานมากขึ้นในแต่ละระบบและมองเห็นสิ่งที่เกิดขึ้นได้มากขึ้น วิธีที่ดีกว่ามากในการบรรลุเป้าหมายนี้คือการใช้ตัวสร้างหน่วยความจำ มีตัวกรองหน่วยความจำมากมายอยู่ที่นั่นMemProของฉันเป็นตัวอย่างหนึ่ง นี่เป็นวิธีที่ไม่รุกรานโดยสิ้นเชิงในการติดตามการใช้งานหน่วยความจำทั้งหมดและคุณสามารถแบ่งมันออกเป็นระบบย่อยโดยอัตโนมัติโดยใช้ตัวกรอง callstack wildcard เป็นการดีที่สุดที่จะให้การจัดสรรหน่วยความจำและการติดตามหน่วยความจำแยกจากกันโดยสิ้นเชิงมีข้อกำหนดที่แตกต่างกันโดยสิ้นเชิง
การแบ่งหน่วยความจำของคุณตามอำเภอใจออกเป็นกลุ่มมักจะเป็นอันตรายได้เนื่องจากแต่ละพูลจะมีค่าใช้จ่าย คุณสามารถใช้หน่วยความจำมากกว่าที่คุณต้องการโดยไม่ต้องรู้ตัว เพื่อลดการสูญเสียมันจะดีกว่าเสมอที่จะรวมทุกอย่างเข้าด้วยกันความหย่อนจะถูกแบ่งปันโดยทั้งระบบ
เหตุผลเดียวสำหรับการใช้ตัวจัดสรรที่กำหนดเองคือประสิทธิภาพของ CPU (ส่วนใหญ่สำหรับการเชื่อมโยงกันแคช) และเพื่อ จำกัด การกระจายตัว ตัวอย่างที่สมบูรณ์แบบของสิ่งนี้คือระบบอนุภาค คุณต้องการอนุภาคทั้งหมดที่ต่อเนื่องกันในหน่วยความจำและคุณไม่ต้องการพริกไทยหน่วยความจำหลักที่มีการจัดสรรระยะสั้นจำนวนมาก อีกตัวอย่างที่ดีสำหรับการแบ่งพาร์ติชันเป็นภาษาสคริปต์
หากคุณต้องการตัวอย่างของการแทนที่ malloc วัตถุประสงค์ทั่วไปคุณสามารถดูตัวจัดสรรVMemของฉัน มันถูกใช้ในเกม AAA จำนวนมาก มีเทคนิคที่ จำกัด การกระจายตัวของข้อมูลและเก็บ footprint หน่วยความจำต่ำสิ่งที่สำคัญสำหรับเกมคอนโซล นอกจากนี้ยังเป็นไปอย่างรวดเร็วมากภายใต้การแข่งขันของเธรดที่สูง เว็บไซต์ของฉันมีเอกสารมากมายเกี่ยวกับเทคนิคเหล่านี้