คำถามติดแท็ก resource-management

4
เกม C ++ จัดการกับการจัดสรรหน่วยความจำล้มเหลวได้อย่างไร
ฉันตระหนักถึงหลายเกมที่เขียนด้วย C ++ แต่ไม่ได้ใช้ข้อยกเว้น เนื่องจากการจัดการกับความล้มเหลวในการจัดสรรหน่วยความจำใน C ++ นั้นโดยทั่วไปถูกสร้างขึ้นโดยมีstd::bad_allocข้อยกเว้นเกมเหล่านี้จะจัดการกับความล้มเหลวได้อย่างไร? พวกเขาเพียงแค่ผิดพลาดหรือมีวิธีการจัดการและกู้คืนจากข้อผิดพลาดออกจำ?

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

2
หากคลาส“ ResourceManager” ถือว่าไม่ดีตัวเลือกอื่นคืออะไร
ฉันได้ยินความคิดเห็นที่ขัดแย้งเช่น: "คลาส Dedicated Manager แทบไม่เคยเป็นเครื่องมือทางวิศวกรรมที่เหมาะสม" "คลาส Dedicated Manager เป็นวิธีที่ดีที่สุดในการอยู่รอดโครงการขนาดใหญ่ที่มีทรัพยากรนับพัน" ลองคลาส ResourceManager คลาสสิกที่มีฟังก์ชั่นต่อไปนี้: โหลดเนื้อหา (พื้นผิว, เสียง, โมเดล 3 มิติ ฯลฯ ) ตรวจสอบให้แน่ใจว่ามีการโหลดเนื้อหาเพียงครั้งเดียวโดยเก็บแคชไว้ การอ้างอิงนับสินทรัพย์เพื่อพิจารณาว่าสามารถยกเลิกการจัดสรรได้หรือไม่ ซ่อนที่สินทรัพย์จริงมาจาก (เช่นอาจเป็นหนึ่งไฟล์ต่อสินทรัพย์หรือสินทรัพย์ทั้งหมดในไฟล์แพ็คเกจหนึ่งหรือสินทรัพย์สามารถโหลดผ่านเครือข่ายได้) สามารถโหลดเนื้อหาโดยไม่ต้องเริ่มโปรแกรมใหม่ซึ่งมีประโยชน์อย่างยิ่งสำหรับศิลปินที่ทำงานในเกม Let 's ยังใช้อาร์กิวเมนต์ "singletons ที่ไม่ดี" ออกจากตารางโดยแกล้งทำเป็นวัตถุ ResourceManager เหล่านี้จะไม่ singletons และแทนจะถูกส่งผ่านไปรอบ ๆ ผ่านฉีดพึ่งพา จากนั้นมีอาร์กิวเมนต์ "ใช้เป็นโรงงาน" หรือ "เรียกว่าเป็นโรงงาน" ปัญหาของฉันเกี่ยวกับเรื่องนี้คือใช่มันเป็นโรงงาน แต่ก็เป็นแคชและตัวโหลดซ้ำ (เนื่องจากไม่มีคำที่ดีกว่า) การเรียกมันว่าโรงงานไม่ได้อธิบายอย่างถูกต้องและถ้าฉันทำให้มันเป็นโรงงานที่เหมาะสมแล้วการแคชและการโหลดใหม่จะถูกนำไปใช้ที่ไหน ฉันยอมรับว่าคลาส "ผู้จัดการ" มักเป็นอาการของสถาปัตยกรรมที่ไม่ดี แต่ในกรณีนี้จะปรับโครงสร้างและยังคงใช้งานได้ทั้งหมดหรือไม่ นี่เป็นสถานการณ์ที่ระดับ …

1
การออกแบบเครื่องมือเกม - Ubershader - การออกแบบการจัดการ Shader [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ฉันต้องการใช้ระบบ Ubershader ที่ยืดหยุ่นด้วยการแรเงาที่เลื่อนออกไป ความคิดปัจจุบันของฉันคือการสร้างความแตกต่างจากโมดูลซึ่งจัดการกับคุณสมบัติบางอย่างเช่น FlatTexture, BumpTexture, Displacement Mapping เป็นต้นนอกจากนี้ยังมีโมดูลขนาดเล็กที่ถอดรหัสสีทำการแมปโทนและอื่น ๆ ซึ่งมีข้อดีที่ฉันสามารถ แทนที่โมดูลบางประเภทหาก GPU ไม่รองรับดังนั้นฉันสามารถปรับให้เข้ากับความสามารถของ GPU ในปัจจุบัน ฉันไม่แน่ใจว่าการออกแบบนี้ดีหรือไม่ ฉันกลัวว่าฉันจะเลือกได้ไม่ดีตอนนี้และจ่ายเงินในภายหลัง คำถามของฉันคือฉันจะหาแหล่งข้อมูลตัวอย่างบทความเกี่ยวกับวิธีการนำระบบการจัดการ shader ไปใช้ได้อย่างมีประสิทธิภาพได้อย่างไร ไม่มีใครรู้ว่าเอ็นจิ้นเกมใหญ่ทำเช่นนี้ได้อย่างไร

1
การออกแบบคลาส ResourceManager
ฉันตัดสินใจว่าฉันต้องการเขียนคลาส ResourceManager / ResourceCache สำหรับเอนจิ้นเกมอดิเรกของฉัน แต่ฉันมีปัญหาในการออกแบบรูปแบบแคช แนวคิดก็คือ ResourceManager มีเป้าหมายนุ่มนวลสำหรับหน่วยความจำทั้งหมดที่ใช้โดยทรัพยากรทั้งหมดของเกมรวมกัน คลาสอื่น ๆ จะสร้างออบเจ็กต์ทรัพยากรซึ่งจะอยู่ในสถานะไม่โหลดและส่งไปยัง ResourceManager จากนั้น ResourceManager จะตัดสินใจเมื่อใดที่จะโหลด / ยกเลิกการโหลดทรัพยากรที่กำหนดโดยคำนึงถึงขีด จำกัด ซอฟต์ เมื่อต้องการทรัพยากรโดยชั้นเรียนอื่นคำขอจะถูกส่งไปยัง ResourceManager สำหรับมัน (โดยใช้ id ของสตริงหรือตัวระบุที่ไม่ซ้ำกัน) หากโหลดทรัพยากรแล้วการอ้างอิงแบบอ่านอย่างเดียวไปยังทรัพยากรจะถูกส่งผ่านไปยังฟังก์ชั่นการโทร หากไม่ได้โหลดทรัพยากรผู้จัดการจะทำเครื่องหมายวัตถุที่จะโหลดในโอกาสถัดไป (โดยปกติจะอยู่ที่ส่วนท้ายของการวาดเฟรม) โปรดทราบว่าแม้ว่าระบบของฉันจะทำการนับการอ้างอิงบางอย่างจะนับเฉพาะเมื่อมีการอ่านทรัพยากร (ดังนั้นจำนวนการอ้างอิงอาจเป็น 0 แต่เอนทิตีอาจยังคงติดตาม uid อยู่) นอกจากนี้ยังเป็นไปได้ที่จะทำเครื่องหมายทรัพยากรเพื่อการโหลดที่ดีก่อนการใช้งานครั้งแรก นี่เป็นภาพร่างของชั้นเรียนที่ฉันใช้อยู่: typedef unsigned int ResourceId; // Resource is an abstract data type. class Resource …

2
ฉันจะจัดการกับทรัพยากรที่ขาดหายไปได้อย่างไร
เกมของคุณคาดว่าจะโหลดเนื้อหาบางอย่าง แต่ไม่พบ สถานการณ์ควรจัดการอย่างไร? ตัวอย่างเช่น: Texture* grassTexture = LoadTexture("Grass.png"); // returns NULL; texture not found Mesh* car = LoadMesh("Car.obj"); // returns NULL; 3D mesh not found อาจถูกลบโดยผู้ใช้โดยไม่ได้ตั้งใจเสียหายหรือสะกดผิดในระหว่างการพัฒนา คำตอบที่เป็นไปได้: ยืนยัน (นึกคิดเฉพาะในระหว่างการพัฒนา) ออกจากเกมอย่างสง่างาม โยนข้อยกเว้นและพยายามจัดการ วิธีไหนดีที่สุด

3
เหตุใดการจัดการหน่วยความจำแบบกำหนดเองจึงจำเป็นสำหรับสินทรัพย์
ทรัพยากรที่เกี่ยวข้องกับการเขียนโปรแกรมเกมโดยเฉพาะอย่างยิ่งเกม 3D โลกเปิดพูดคุยเกี่ยวกับวิธีที่คุณต้องขนถ่ายและโหลดสินทรัพย์ไปยังและจากดิสก์หน่วยความจำระบบและหน่วยความจำวิดีโออย่างต่อเนื่อง ฉันสามารถเข้าใจสิ่งนี้ได้บนคอนโซลเนื่องจากพวกเขามีโครงร่างการจัดการหน่วยความจำที่ง่ายมากที่ไม่สามารถจัดการกับการล้นที่อาจเกิดขึ้นได้ อย่างไรก็ตามบนพีซีสถานการณ์แตกต่างกันมาก มีหน่วยความจำเสมือนที่จัดทำโดยระบบปฏิบัติการสำหรับหน่วยความจำระบบและไดรเวอร์กราฟิกจัดการการสลับไปมาจาก CPU ไปยัง GPU เหตุใดจึงไม่เพียงพอที่จะโหลดทุกอย่างพร้อมกันและต้องจัดการกับการดึงข้อมูลล่วงหน้าและอาจทำให้แน่ใจว่าไม่มีการปิดกั้นในขณะที่มีการสลับสินทรัพย์ที่ต้องการ mallocนี้ไม่ได้บอกว่าทุกอย่างจะถูกจัดสรรอย่างไร้เดียงสาใช้สิ่งที่ต้องการ ทุกอย่างจะถูกเก็บไว้อย่างต่อเนื่องและแคชสอดคล้องกัน มันง่ายกว่าที่จะทำให้การเข้าถึงหน่วยความจำของคุณมีประสิทธิภาพถ้าคุณไม่ต้องกังวลกับการสลับหน้าเข้าและออกด้วยตนเอง ... UPDATE: หลังจากอ่านบิตลงในการถ่ายโอนบัฟเฟอร์แบบอะซิงโครนัสฉันได้รับแนวคิดว่าวิธีที่ไดรเวอร์กราฟิกสามารถเพจหน่วยความจำเข้าและออกโดยอัตโนมัตินั้นไม่ดี สิ่งนี้ถือเป็นจริงสำหรับทรัพยากรของ CPU หรือไม่; คือมันจะดีกว่าที่จะจัดการด้วยตนเองเสมอเมื่อทรัพยากรที่กำหนดจะถูกโหลดและยกเลิกการโหลดแม้ในที่ที่มีหน่วยความจำเสมือน?

5
วิธีสร้าง GameObject ใหม่โดยไม่เพิ่มเข้าไปในที่เกิดเหตุ?
ฉันกำลังสร้างสิ่งที่เป็นพื้นฐานของระบบ prefab ของฉันเอง วัตถุของเกมถูกกำหนดโดยไฟล์ข้อมูลที่มนุษย์สามารถอ่านได้ ฉันต้องการสร้าง GameObject ที่ว่างเปล่าโหลดด้วยส่วนประกอบที่กำหนดในไฟล์ข้อมูลและเตรียมให้พร้อมและรอการInstantiate()โทร อย่างไรก็ตามเมื่อใดก็ตามที่ฉันใช้GameObject go = new GameObject()วัตถุเกมใหม่จะถูกเพิ่มเข้าไปในที่เกิดเหตุ การใช้ Unity ที่สร้างในรูปแบบสำเร็จรูปฉันสามารถโหลดรูปแบบสำเร็จรูปเป็น GameObject และมันไม่ได้เพิ่มเข้าไปในฉาก (ดูตัวอย่างด้านล่าง) เหตุผลที่อยู่เบื้องหลังนี้คือฉันต้องการมีหนึ่งรายการที่มี GameObjects บางรายการสร้างขึ้นโดยการโหลด Unity prefab และอื่น ๆ ที่สร้างขึ้นโดยระบบ prefab ที่กำหนดเองของฉัน สิ่งนี้ต้องเกิดขึ้นในเวลาทำงานและไม่สามารถมีส่วนร่วมกับ Unity Editor (เนื่องจากผู้ใช้ปลายทางจะสามารถกำหนดไฟล์ข้อมูลของตัวเองได้) ฉันจะสร้าง GameObject ใหม่โดยไม่มีความเป็นเอกภาพในการสร้างอินสแตนซ์ให้ฉันอัตโนมัติได้อย่างไร ตัวอย่างเช่นฉันสามารถโทรออกเช่นนี้ Resources.LoadAll("PrefabsDirectory", typeof(GameObject)) และฉันจะได้รับรายชื่อ GameObjects ซึ่งจะไม่มีการเพิ่มเข้าไปในที่เกิดเหตุเมื่อมีการโทรออก โดยพื้นฐานแล้วฉันกำลังสร้างLoadAllวิธีการสำหรับ prefab ของตัวเองและในทำนองเดียวกันฉันไม่ต้องการยกตัวอย่าง GameObjects เมื่อมีการโทร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.