ฉันจะรู้ได้อย่างไรว่าหน่วยความจำไม่ได้จัดการอย่างถูกต้อง?


12

ดูเหมือนว่ารอยเท้าหน่วยความจำของเกมของฉัน (2D) จะเพิ่มขึ้นทุกครั้งที่ฉันโหลดพื้นผิวเช่นเมื่อฉันเริ่มเกมจะใช้ RAM ส่วนตัว 30 MB หลังจากข้ามไฟล์พื้นหลัง ~ 367mb ดังนั้นใน RAM ในบางจุดมันเพิ่มขึ้นเป็น RAM ส่วนตัว 54 mb

สิ่งเดียวกันเกิดขึ้นหลังจากไปในระยะทางเดียวกัน แต่กลับไปมาระหว่างจุดสองจุดซ้ำ ๆ กัน

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

ฉันจะรู้ได้อย่างไรว่าฉันควรจะกังวลเกี่ยวกับเรื่องนี้หรือถ้ามันเป็นเพียงการเล่นโวหารของหน่วยความจำหน้า OS?


1
คุณพิจารณาการใช้ RAM ของแอปพลิเคชันของคุณอย่างไร คุณใช้ profiler (อันไหน) หรือคุณแค่เชื่อใจตัวจัดการงานของระบบปฏิบัติการของคุณ (อันไหน)?
ฟิลิปป์

1
ตัวจัดการงานบน kUbuntu, profiler ใน debugger ของฉันบอกฉันว่ามันกำลังรอข้อมูลอยู่และไม่แสดงอะไรเลย
Patrick Jeeves

1
โดยวิธีการ: เมื่อคุณตรวจสอบปริมาณการใช้หน่วยความจำบน Linux อย่าลืมดูเฉพาะหน่วยความจำที่ใช้โดยกระบวนการเกม มีอยู่ครั้งหนึ่งที่ฉันทำงานกับเกมที่มีหลายแพลตฟอร์มเราสงสัยว่าทำไม Windows รุ่นนี้กิน ram มากกว่า Linux มากจนเราสังเกตเห็นว่าเวอร์ชั่น Linux API กราฟิกของเราจัดสรรหน่วยความจำสำหรับพื้นผิวทั้งหมดในกระบวนการ X11
ฟิลิปป์

2
คุณไม่ควรคาดหวังว่า glDeleteTextures จะเพิ่มหน่วยความจำจริง: gamedev.stackexchange.com/questions/136883/…
Maximus Minimus

คำตอบ:


21

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

ไลบรารีการจัดสรรในพื้นที่ผู้ใช้ยังคงรักษาจำนวนหนึ่งสำหรับการนำกลับมาใช้ใหม่เพื่อหลีกเลี่ยงความต้องการซ้ำ ๆ และการปล่อยหน่วยความจำจาก / ไปยัง OS ซึ่งช้ามาก

เช่นคุณจัดสรรพื้นผิวไดรเวอร์ OpenGL ขอสงวนโต๊ะของพื้นผิว 32 ช่องคุณยังคงจัดสรรพื้นผิวจากนั้นคนขับจำเป็นต้องจัดสรรตารางที่มีขนาดใหญ่กว่า 1024 ช่องพื้นผิวในขณะนี้ตารางใหม่นี้ใช้พื้นที่ใน RAM ขนาดใหญ่ ฟรีพื้นผิวทั้งหมดไดรเวอร์ไม่ลดขนาดหรือจัดสรรตารางใหม่ตามความคาดหวังว่าเกม / แอปพลิเคชันของคุณจะต้องใช้พื้นผิวจำนวนมากในภายหลังเพื่อให้ RAM ขนาดใหญ่ไม่สามารถปล่อยกลับสู่ระบบปฏิบัติการ

นี่เป็นเรื่องปกติและสมบูรณ์แบบ แอพของคุณจะใช้ RAM ที่ไม่ได้ใช้อีกครั้ง


1
เป็นที่น่าสังเกตว่าหากการใช้งานยังคงเพิ่มขึ้นในระหว่างการเล่น แต่เครื่องตรวจจับการรั่วไหลยังไม่พบสิ่งใดคุณอาจกำลังทุกข์ทรมานจากการกระจายตัวของหน่วยความจำมากเกินไป แนวทางในการแก้ปัญหาดังกล่าวที่อธิบายไว้ที่stackoverflow.com/questions/150753/…ก็จะเป็นประโยชน์สำหรับการพัฒนาเกม
จูลส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.