เหตุใดการจัดการหน่วยความจำแบบกำหนดเองจึงจำเป็นสำหรับสินทรัพย์


10

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

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


mallocนี้ไม่ได้บอกว่าทุกอย่างจะถูกจัดสรรอย่างไร้เดียงสาใช้สิ่งที่ต้องการ ทุกอย่างจะถูกเก็บไว้อย่างต่อเนื่องและแคชสอดคล้องกัน มันง่ายกว่าที่จะทำให้การเข้าถึงหน่วยความจำของคุณมีประสิทธิภาพถ้าคุณไม่ต้องกังวลกับการสลับหน้าเข้าและออกด้วยตนเอง ...


UPDATE:

หลังจากอ่านบิตลงในการถ่ายโอนบัฟเฟอร์แบบอะซิงโครนัสฉันได้รับแนวคิดว่าวิธีที่ไดรเวอร์กราฟิกสามารถเพจหน่วยความจำเข้าและออกโดยอัตโนมัตินั้นไม่ดี สิ่งนี้ถือเป็นจริงสำหรับทรัพยากรของ CPU หรือไม่; คือมันจะดีกว่าที่จะจัดการด้วยตนเองเสมอเมื่อทรัพยากรที่กำหนดจะถูกโหลดและยกเลิกการโหลดแม้ในที่ที่มีหน่วยความจำเสมือน?


1
คุณกำลังสมมติว่าเนื้อหาสินทรัพย์ถูกเก็บไว้ในหน่วยความจำระบบ ข้อมูลสินทรัพย์ส่วนใหญ่ของคุณจะถูกเก็บไว้ในหน่วยความจำ GPU ซึ่งมี จำกัด มากขึ้น
dadoo Games

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

คุณแน่ใจหรือไม่ว่าสิ่งนี้เกี่ยวข้องกับโครงการเกมของคุณ? ฉันไม่แน่ใจว่าฉันเห็นความท้าทายด้านเทคนิคเพียงวิธีแก้ปัญหา หากคุณไม่ได้เผชิญกับความท้าทายด้านเทคนิคมันเป็นเรื่องยากที่จะปรับแก้ปัญหาหรือเข้าใจปัญหา
AturSams

ฉันสงสัยว่าทำไมเอ็นจิ้นเกมถึงใช้ระบบแคชสินทรัพย์ที่ซับซ้อนเมื่อใช้ระบบ systmems / ไดร์เวอร์มีระบบหน่วยความจำเสมือนอยู่แล้ว มันเกี่ยวข้องกับฉันเพราะฉันกำลังเขียนเกมเปิดโลกที่ข้อมูลนี้มีความสำคัญมาก
jmegaffin

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

คำตอบ:


16

เกมเปิดโลกยุคใหม่ไม่เหมาะกับความทรงจำ โปรดทราบว่าเกมส่วนใหญ่ยังคงเป็น 32- บิตเนื่องจากจำนวนผู้เล่นเกมที่มีระบบปฏิบัติการ 32- บิตและกระบวนการ 32- บิตที่ดีที่สุดสามารถมีหน่วยความจำ 4GB จ่าหน้าได้ครั้งละเท่านั้น (ไม่ขึ้นกับหน่วยความจำเสมือน) จำกัด อยู่ที่ 2-3 GB การกระจายตัวและจำนวนของวัตถุที่ใช้งานได้จริงที่คุณสามารถมีได้ในแต่ละครั้งนั้นค่อนข้างเล็กกว่าข้อมูลทั้งหมดที่คุณต้องการสำหรับสภาพแวดล้อมขนาดใหญ่ แม้แต่ในระบบปฏิบัติการ 64 บิตคุณยังต้องกำหนดเป้าหมายเครื่องที่มีสเปคต่ำด้วยหน่วยความจำเพียง 4GB เพื่อให้แน่ใจว่าสามารถใช้งานร่วมกับผู้ใช้ปลายทางได้สูงสุด อย่าลืมอุปกรณ์พกพาฮาร์ดแวร์ "ที่ใช้พลังงานต่ำ" อย่าง WiiU และอื่น ๆ นักพัฒนาจะต้องตั้งเป้าหมายมากกว่าแท่นขุดเจาะเกมพีซีขนาดใหญ่

หน่วยความจำเสมือนไม่ใช่วิธีแก้ปัญหาประการแรกเพราะมันไม่ได้ลบล้างข้อ จำกัด ของพื้นที่ที่อยู่และเพราะมันไม่เหมาะสม ระบบปฏิบัติการสามารถออกหน้าสิ่งต่าง ๆ ในเวลาที่ไม่เหมาะสมหรือในรูปแบบที่ไม่เหมาะสม นี่เป็นปัญหาที่เกิดขึ้นกับ OS เมื่อระบบไฮเบอร์เนตเข้ามาครั้งแรก paging out ไปยังดิสก์แล้วเพจจิ้งกลับช้าลงอย่างมากในบางกรณีกว่าที่มีแอพพลิเคชั่นสตรีมทรัพยากรกลับมาอย่างชัดเจนคุณยังสามารถเห็นปัญหาในวันนี้เมื่อระบบหน่วยความจำหมดหน้าจะถูกเพจ ดิสก์และระบบไม่ตอบสนองกลายเป็นสิ่งสำคัญที่จำเป็นต่อการรัน WM / explorer.exe ของคุณ หน่วยความจำเสมือนเป็นวิธีแก้ปัญหาที่เกิดขึ้นเมื่อหลายสิบปีก่อนที่ระบบมี RAM น้อยมากและช่องว่างระหว่างหน่วยความจำและความเร็วดิสก์นั้นเล็กกว่ามาก แม้กระทั่งทุกวันนี้ SSD ที่เร็วที่สุดนั้นเป็นเพียงเศษเสี้ยวเล็ก ๆ ของความเร็วของ RAM ราคาถูก / ช้าและพยายามที่จะแกล้งทำเป็นว่าคุณสามารถใช้ดิสก์เป็น RAM เสมือนจริงไม่ใช่ความคิดที่ดีที่สุดอีกต่อไป นี่คืออายุที่บางคนทำตรงข้ามและโหลดระบบไฟล์ลงในดิสก์ RAM; ข้อ จำกัด ที่นำไปสู่การสร้างหน่วยความจำเสมือนไม่ถือเป็นจริงอีกต่อไป

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


ขอบคุณสำหรับคำตอบโดยละเอียด แม้ว่าฉันจะยังคงมองหาข้อมูลบางอย่างเกี่ยวกับวิธีที่ไดรเวอร์ GPU จัดการกับหน่วยความจำเสมือน (ระหว่าง VRAM และ RAM ระบบ)
jmegaffin

@ เหนือ: ปัญหาเดียวกัน เพียงแทนที่ "RAM" ด้วย "VRAM" และ "disk" ด้วย "หน่วยความจำ CPU
Sean Middleditch

@SeanMiddleditch +1 คำตอบที่ดี "นี่เป็นยุคที่บางคนทำสิ่งที่ตรงกันข้ามและโหลดระบบไฟล์ลงในดิสก์ RAM" คุณหมายถึงไฟล์หน่วยความจำที่แมปหรือไม่ สิ่งที่ฉันเข้าใจจากคำตอบของคุณก็คือตัวจัดสรรหน่วยความจำที่กำหนดเองป้องกันระบบปฏิบัติการไม่ให้เพจจิ้งหน่วยความจำไม่ใช่กรณีนี้เนื่องจากหน่วยความจำจะได้รับการจัดหน้าเท่าที่คุณถามหน่วยความจำจากเคอร์เนลโดยใช้ brk () การเพจบนพีซีมีการป้องกันอย่างแน่นอนโดยใช้ตัวจัดสรรหน่วยความจำที่กำหนดเองหรือไม่
concept3d

1
@ concept3d: ไม่ใช่การแมปหน่วยความจำ แต่เป็นดิสก์ RAM ตัวอักษร คุณสามารถสร้างไดรฟ์ที่สำรองข้อมูลโดยหน่วยความจำไม่ใช่ดิสก์ ตัวจัดการหน่วยความจำที่กำหนดเองไม่ได้ป้องกันการเพจ (แอพอื่นอาจใช้หน่วยความจำหมด) การจัดการทรัพยากรอย่างชาญฉลาด (ที่ชั้นการจัดการวัตถุ / ทรัพยากร) ก็หมายความว่าคุณเพิ่มหน่วยความจำสำหรับวัตถุที่คุณไม่ต้องการอีกต่อไป นึกถึงดิสก์ของระบบปฏิบัติการที่แคชเก็บไว้ในหน่วยความจำ
Sean Middleditch

6

สำหรับเกมแบบ 32 บิตเนื่องจากเกมส่วนใหญ่นั้นมีเหตุผลหลายประการแม้แต่เกมที่มาพร้อมกับ DVD ด้านเดียว (4.3GB) ก็มีเนื้อหามากมายที่สามารถติดตั้งลงในพื้นที่ที่อยู่แบบ 32 บิตได้ และนั่นคือการสมมติว่าเนื้อหานั้นไม่ได้รับการบีบอัดบนดิสก์และเป็นวิธีที่ดีที่สุดในการโหลดทุกอย่างในครั้งเดียวให้เป็นพื้นที่ที่อยู่ติดกัน ตอนนี้มีหลายเกมที่เล่นบน DVD หลายแผ่นซึ่งมีเนื้อหาเกินกว่า 10GB ได้อย่างง่ายดาย จากประสบการณ์ของฉันบนพีซีเมื่อพื้นที่ที่อยู่ของคุณใกล้ถึงการจัดสรร 2GB จะเริ่มล้มเหลวและนั่นกลายเป็นขีด จำกัด ที่ยากไม่ว่าผู้ใช้จะมีหน่วยความจำกายภาพเท่าใดก็ตาม

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

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

ดังนั้นไม่ว่าหน่วยความจำจะ จำกัด หรือเบาหน่วยความจำก็ยัง จำกัด แต่แม้ว่าคุณจะสามารถโหลดทุกอย่างได้พร้อมกันโดยไม่กระทบขีด จำกัด ประสิทธิภาพ แต่ก็มีเหตุผลที่คุณไม่ต้องการ:

  1. เกมของคุณใช้เวลาในการโหลดนานขึ้นและเข้าสู่สถานะอินเทอร์แอกทีฟมากกว่าที่มันต้องการเพราะมันจะโหลดทุกอย่างเมื่อเริ่มต้นและทำให้มันอยู่ในนั้น คุณสามารถโหลดประมาณ 150MB / วินาทีจากฮาร์ดดิสก์และแม้แต่ไดรฟ์ DVD ที่เร็วที่สุด (24x) โหลดที่ 33MB / วินาที นั่นหมายความว่าตัวอย่างเนื้อหา DVD ขนาด 4.3GB จะใช้เวลาอย่างน้อย 30 วินาทีในการโหลดจาก HDD และมากกว่า 133 วินาทีในการโหลดจาก DVD สิ่งเหล่านี้มีเวลาโหลดนานเกินกว่าจะยอมรับได้

  2. เกมของคุณใช้หน่วยความจำมากกว่าที่เป็นธรรม หากมองเห็นเนื้อหาเพียง 10% ในแต่ละครั้งการพักอาศัยในที่พักพิงจะสิ้นเปลืองและป้องกันไม่ให้ผู้ใช้ใช้หน่วยความจำนั้นเพื่อสิ่งอื่น โดยทั่วไปแล้วผู้ใช้มักจะไม่จำเกมที่ต้องใช้หน่วยความจำจำนวนมากในการทำงานอย่างถูกต้อง

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


1

เพียงแค่พูดอย่างทั่วไปและเรียบง่ายและโดยไม่พิจารณารายละเอียดของการใช้งานหน่วยความจำเสมือนนักพัฒนามักจะมีความรู้ในการมองการณ์ไกลว่าการใช้ VM ขาด

นักพัฒนาสามารถพูดได้เสมอว่า"ฉันไม่จำเป็นต้องโหลดไฟล์เสียงนี้ในตอนนี้เพลงภายในใช้สำหรับเกมผ่านหน้าจอเท่านั้น" และหลังจากเกมผ่านหน้าจอผู้พัฒนาสามารถพูดว่า"ฉันไม่ต้องการคลิปเสียงนี้อีกต่อไปในหน่วยความจำกายภาพมันใช้สำหรับเกมนี้ผ่านหน้าจอเท่านั้น"

ระบบปฏิบัติการไม่มีการมองการณ์ไกล อาจเป็นไปได้ที่จะเข้าใจว่ามีข้อผิดพลาดหลาย ๆ หน้าในภายหลังว่าคลิปเสียงบางส่วนไม่จำเป็นต้องใช้ในหน่วยความจำกายภาพอีกต่อไปเพราะยังไม่ได้รับการเข้าถึงในระยะเวลาหนึ่ง แต่การเปลี่ยนการมองการณ์ไกลเป็นการเข้าใจถึงปัญหาย้อนหลังนั้นแปลเป็นความผิดพลาดของหน้าจำนวนมากและความผิดพลาดหน้าจำนวนมากแปลเป็น hiccups ในอัตราเฟรมในซอฟต์แวร์เป็นเวลาที่สำคัญเป็นเกมวิดีโอ การคาดการณ์ล่วงหน้าของนักพัฒนาช่วยได้จริง ๆ ถ้าคุณต้องการหลีกเลี่ยงอาการสะอึก

และนั่นนำไปใช้ในเชิงแนวคิดโดยไม่คำนึงถึงฮาร์ดแวร์และซอฟต์แวร์ สมมติว่าเพจในหน่วยความจำมีราคาแพงจากนั้นการมองการณ์ไกลของนักพัฒนาจะช่วยในการลดค่าใช้จ่าย

การพูดที่กว้างขึ้นมีวงจรที่ไม่มีที่สิ้นสุดระหว่างนักออกแบบฮาร์ดแวร์นักออกแบบคอมไพเลอร์นักออกแบบระบบปฏิบัติการ / ไดรเวอร์และนักพัฒนาแอปพลิเคชัน นักพัฒนาฮาร์ดแวร์ / คอมไพเลอร์ / OS / ไดรเวอร์มักจะพยายามใช้การปรับให้เหมาะสมเพื่อเร่งความเร็วแอปพลิเคชันเฉลี่ยของคุณตามรูปแบบการเข้าถึงหน่วยความจำตามปกติและบางครั้งด้วยความหวังเช่น"คนควรจะสามารถเขียนรหัสได้ น่าจะเร็ว "แต่ถ้าหากมีความคิดใด ๆ เกิดขึ้นประเภทนี้มักจะล้มเหลวในด้านประสิทธิภาพที่สำคัญเพราะผู้พัฒนาที่สำคัญด้านประสิทธิภาพจะเริ่มเรียนรู้รายละเอียดที่ซับซ้อนของคอมไพเลอร์ฮาร์ดแวร์ระบบปฏิบัติการไดรเวอร์ ฯลฯ และเริ่มเขียนโค้ดเฉพาะ ออกแบบมาเพื่อใช้ประโยชน์จากสิ่งที่มากที่สุดเท่าที่เป็นไปได้ในการเขียนโค้ดที่เร็วที่สุดเท่าที่จะเป็นไปได้ (เช่น prefetches, การแยกฟิลด์ร้อน / เย็น, SoAs, ฯลฯ สำหรับโค้ดที่เป็นมิตรกับแคช) และนั่นก็เหมือนกับเกมที่ไม่มีวันสิ้นสุด สิ่งเหล่านี้ไม่เคยถูกมองว่าเป็นกล่องดำในฟิลด์ที่สำคัญต่อประสิทธิภาพเนื่องจากนักพัฒนากำลังแข่งขันกันเรื่องประสิทธิภาพ

ส่วนตัวผมครับหวังว่าหน่วยความจำเสมือนไม่ได้อยู่เพราะมันเพิ่มเพิ่มเติมชั้นของการคาดการณ์ผลการดำเนินงานในรูปแบบที่มีแนวโน้มที่จะรุนแรงเกินไปและวิธีที่เกิดขึ้น, วิธีที่มากเกินไปของการลงโทษประสิทธิภาพการทำงานเมื่อสิ่งที่ไปจริงๆทิศใต้ไปยังจุดของความไม่สามารถใช้ได้. บางครั้งฉันพบปัญหาในกรณีที่ฉันใช้แอปพลิเคชันบางตัวที่ฉันพิมพ์ตัวเลขพิเศษหรือสองครั้งโดยบังเอิญเมื่อเมาในช่องป้อนข้อมูลบางอย่างซึ่งทำให้มันหมดความทรงจำทางกายภาพอย่างรวดเร็วในวิธีที่ทำให้ระบบปฏิบัติการคลาน t แม้แต่คลิกที่ปุ่มยกเลิกบนแถบความคืบหน้าอีกต่อไปและต้องรอ 10 นาทีในขณะที่ติดขัด Ctrl + Alt + Del เพื่อฆ่ากระบวนการและสาปแช่งตัวเองในขณะที่ดื่มเครื่องดื่มของฉันเพื่อกลับไปยังจุดที่สิ่งต่าง ๆ ใช้งานได้อีกครั้ง อยู่ทั้งๆที่ไฟล์หน้าถูกจัดเก็บไว้ใน SSD ในกรณีเหล่านั้นฉันอยากได้ข้อผิดพลาด "หน่วยความจำไม่พอ" ซึ่งเป็นจุดที่ฉันอาจปิดแท็บโป๊ของฉัน 17 แท็บ (ไม่เป็นไรฉันบุ๊คมาร์ครายการโปรดของฉันอยู่ดี) เพื่อเพิ่มหน่วยความจำทันที เริ่มธุรกิจของฉันต่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.