ผู้จัดการทรัพยากร - พวกเขาดีไหม?


20

ผมเคยเห็นหลายครั้งในซอร์สโค้ดสิ่งเช่นนี้ [ดีนี้เป็นมากกว่าหลอก c ++ ความคิดของฉัน]

typedef shared_ptr<Resource> ResourcePtr;// for ease  
ResourcePtr sound1 = resourceManager.Get<SoundResource>("boom.ogg");  
sound1->Play();  
ResourcePtr sprite = resourceManager.Get<Image>("sprite.png");

ฉันแค่สงสัยว่าคลาสที่มีประโยชน์เช่นนี้เป็นอย่างไรบางสิ่งที่:

  • โหลดไฟล์สื่อแล้ว
  • เก็บไว้ในหน่วยความจำ
  • ทำสิ่งนี้ในตอนเริ่มต้นของหน้าจอการโหลดระดับ
  • ทำความสะอาด

แทนที่จะมีระบบ:

  • ทรัพยากรถูกครอบครองโดยนิติบุคคลเท่านั้นหรือปล่อยทิ้ง
  • รับผิดชอบภาระของตัวเองในหน่วยความจำ

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



1
ไม่แน่นอน ผมคิดว่านี่เป็นคำถามที่ถูกต้อง
ricket

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

ฉันไม่คิดว่าฉันขอในสิ่งเดียวกัน ดูเหมือนว่าจะถามว่าคุณควรมี shortener path file path หรือไม่ในขณะที่ฉันถามเกี่ยวกับประเภทของ loader / cache อย่างไรก็ตามฉันคิดว่ามันไม่ปรากฏในทะเลเพราะฉันใช้ทรัพยากรมากกว่าสินทรัพย์
คอมมิวนิสต์เป็ด

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

คำตอบ:


20

ผู้จัดการทรัพยากรที่ดีเป็นกุญแจสำคัญในวิธีการที่ดี - และวิธีการที่มีความยืดหยุ่น - เกมของคุณ 'เครื่องมือ' เป็นไปได้

ไม่เพียง แต่แก้ปัญหาจำนวนมากด้วยการจัดการทรัพยากรระดับต่ำ แต่ยังช่วยให้แน่ใจว่าทรัพยากรจะถูกโหลดเพียงครั้งเดียวแล้วนำกลับมาใช้ใหม่หากมีการโหลดแล้ว

หากระบบทรัพยากรใจลอยดีรายละเอียดพื้นฐานสามารถระวังระหว่างระบบไฟล์ physfs จัดเก็บข้อมูล SQL แม้ ...

คุณเพียงแค่ขอทรัพยากรและก็ให้กับคุณ

ไม่จำเป็นต้องกังวลเกี่ยวกับรหัสทรัพยากรและสิ่งที่ชอบ

การจัดการความขัดแย้งทรัพยากรซ้ำ ฯลฯ

ให้ผู้จัดการฝ่ายทรัพยากรการจัดเรียงที่ออก

ขึ้นอยู่กับว่าคุณออกแบบมันอย่างไรถ้าหาก C ++ ทำให้เป็นเพื่อนกับห้องเรียนจัดการสถานการณ์ของคุณเพื่อให้แน่ใจว่ามีการจัดการความเป็นเจ้าของอย่างเหมาะสม

กลุ่มทรัพยากร?

ไม่มีปัญหา.

ลืมที่จะปล่อยทรัพยากร?

ไม่มีปัญหา.

อินเทอร์เฟซเดียวกันกับทรัพยากรไม่ว่าจะอยู่ที่ใด: หน่วยความจำดิสก์หน่วยเก็บถาวรเครือข่าย

ไม่มีปัญหา.

คุณต้องการสตรีมมิ่งหรือไม่

Threading?

ปล่อยให้ฮับจัดการทรัพยากรของคุณดูแล

และคุณสามารถมั่นใจได้ว่าจะแจ้งให้คุณทราบเมื่อทรัพยากรพร้อมใช้งาน

Ogre 3D มีระบบการจัดการทรัพยากรที่ยืดหยุ่นมาก แต่ฉันแน่ใจว่ามีคนอื่น 'ออกไป'


1
ฉันต้องขอบคุณสำหรับคำตอบนี้ ฉันไม่มั่นใจในการใช้งานยูทิลิตี้ของตัวจัดการทรัพยากรโดยเฉพาะก่อนที่ฉันจะอ่านและตอนนี้ฉันจะทำการติดตั้งทันที
Jake McArthur

13

ฉันเพิ่งเขียนผู้จัดการทรัพยากรซึ่งทำงานได้ดีสำหรับกรณีของฉัน คุณสมบัติหลัก:

  • ทรัพยากรที่มีการร้องขอจาก ID ResourceManager::instance().getTexture("textures/player.png")สตริงตัวอย่างเช่น รหัสพื้นผิวถูกแมปโดยตรงกับไฟล์บนดิสก์ซึ่งสะดวกในระหว่างการพัฒนา แต่สิ่งนี้จะถูกแทนที่ในภายหลังโดยการค้นหาในการเก็บถาวรบางอย่าง

  • ผู้จัดการทรัพยากรเก็บแผนที่ของ ID ไปยังทรัพยากรดังนั้นมันจะไม่โหลดทรัพยากรที่ถูกโหลดไปแล้ว

  • การเรียกข้างต้นไม่ส่งคืนTextureวัตถุ แต่เป็นResource<Texture>วัตถุ คาดว่าผู้โทรจะเก็บResource<Texture>วัตถุไม่ใช่พื้นผิวจริง การResource<Texture>กระทำเช่นตัวชี้สมาร์ทไปที่Texture; มันoperator*()ส่งคืนTextureวัตถุเอง ข้อดีคือพื้นผิวจริงสามารถโหลดใหม่หรือยกเลิกการโหลดได้โดยไม่จำเป็นต้องอัพเดตไคลเอ็นต์ทั้งหมด

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

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

  • เมื่อไม่พบทรัพยากรหรือไม่สามารถโหลดทรัพยากรเริ่มต้นจะถูกแทนที่อย่างเงียบ ๆ สิ่งนี้ทำให้ฉันสามารถใช้ทรัพยากรที่ฉันยังไม่ได้สร้างโดยไม่ต้องหยุดเกม (คุณสมบัติตามแผน: ระบุทรัพยากร "สำคัญ" เช่น GPGPU shaders โดยที่เกมไม่สามารถทำงานได้อย่างถูกต้อง)

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

ฉันคิดว่ารายการคุณลักษณะนี้แสดงให้เห็นว่าใช่ผู้จัดการทรัพยากรสามารถทำได้ดี!


2

เหตุผลหนึ่งที่มีผู้จัดการทรัพยากรคือการแบ่งปันทรัพยากร ตัวอย่างเช่นเมื่อคุณเรียกใช้resourceManager.Get("sprite.png")ถ้า "sprite.png" ถูกโหลดไปแล้วตัวจัดการทรัพยากรสามารถกลับตัวชี้ไปยังทรัพยากร sprite ที่โหลดไปแล้วแทนที่จะสร้างภาพใหม่และโหลดใหม่จากดิสก์

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

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


1

ประโยชน์อีกอย่างคือนอกเหนือจากการแคชและการนับการอ้างอิงคือมันสามารถจัดการการพึ่งพา (แบบจำลองความต้องการพื้นผิว b ฉันจะได้รับมันสำหรับ ya!) และปัญหาการสั่งซื้อโหลด (แบบจำลองต้องรู้ว่า shader b ต้องการอะไร b ก่อนที่จะโหลดโมเดล!)

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