
rres เป็นรูปแบบไฟล์ที่เรียบง่ายและใช้งานง่ายสำหรับจัดแพ็คเกจทรัพยากร
rres ได้รับการออกแบบมาเพื่อรวมเนื้อหาของเกม (รูปภาพ แบบอักษร ข้อความ เสียง โมเดล...) ให้อยู่ในรูปแบบที่เรียบง่ายและครบถ้วนในตัวเอง อ่านและเขียนได้ง่าย ได้รับการออกแบบมาเพื่อโหลดข้อมูลด้วยวิธีที่รวดเร็วและมีประสิทธิภาพ
rres ได้รับแรงบันดาลใจจากรูปแบบไฟล์ต่อไปนี้: XNB (ใช้โดย XNA/MonoGame), RIFF, PNG และ ZIP
rresFileHeaderrresResourceChunkrresResourceChunkInforresResourceChunkDatarresResourceDataTyperresCentralDir ความเรียบง่าย : โครงสร้าง rres นั้นเรียบง่าย โดยมีส่วนหัวของไฟล์เดียวและมีทรัพยากรหลายรายการต่อกัน อย่างไรก็ตาม ทรัพยากรทั้งหมดจะมีส่วนหัวข้อมูลทรัพยากรขนาดเล็ก (32 ไบต์) พร้อมตัวเลือกมากมาย
ใช้งานง่าย : ไลบรารี rres สำหรับอ่านไฟล์ .rres rres มีขนาดเล็กโดยมีเพียงฟังก์ชันขั้นต่ำที่จำเป็นในการอ่านข้อมูลทรัพยากรจากรหัสเท่านั้น มันใช้ฟังก์ชันชุดเล็กๆ จากไลบรารี C มาตรฐานเท่านั้น เครื่องมือ rrespacker พร้อม GUI/CLI มีไว้เพื่อสร้างและดูไฟล์ .rres ได้อย่างง่ายดาย
ความยืดหยุ่น : รูปแบบ rres รองรับไฟล์อินพุตทุกประเภท หากข้อมูลไม่ได้ถูกจัดประเภทเป็นประเภทข้อมูลพื้นฐาน ก็สามารถบรรจุเป็นข้อมูลไฟล์ดิบได้
ความสามารถในการพกพา : รูปแบบไฟล์ rres ไม่ได้เชื่อมโยงกับกลไกเฉพาะ ไลบรารีฐานเพียงอ่านข้อมูลทรัพยากรตามที่แพ็กไว้ และข้อมูลนั้นสามารถแมปกับโครงสร้างกลไกใดก็ได้ ตัวอย่างการใช้งานมีให้กับไลบรารีเสริม rres-raylib.h ที่แมปข้อมูล rres กับโครงสร้าง raylib
ความปลอดภัย : rres รองรับการบีบอัดและการเข้ารหัสต่อทรัพยากร หากจำเป็น ถึงกระนั้น แม้ว่าจะได้รับการสนับสนุนโดยรูปแบบไฟล์ แต่ก็ขึ้นอยู่กับผู้ใช้ที่จะนำไปใช้ในเครื่องมือ rres packer และไลบรารีการแมปกลไก rres ไม่ได้บังคับใช้อัลกอริธึมการบีบอัด/การเข้ารหัสเฉพาะใดๆ ตามการออกแบบ
ความสามารถในการขยาย : รูปแบบไฟล์ rres สามารถขยายได้ โดยรองรับประเภทข้อมูลใหม่ คุณสมบัติใหม่ และข้อมูลที่กำหนดเอง หากจำเป็น
ฟรีและโอเพ่นซอร์ส : rres เป็นข้อกำหนดแบบเปิดและไลบรารีโอเพ่นซอร์สฟรี สามารถใช้กับเครื่องมือที่ให้มา ( rrespacker ) หรือสามารถใช้ตัวบรรจุ/ตัวโหลดแบบกำหนดเองกับ เอ็นจิ้นใดก็ได้ คำอธิบายรูปแบบยังสามารถใช้เป็นสื่อการเรียนรู้สำหรับทุกคนที่ต้องการสร้างรูปแบบไฟล์บรรจุภัณฑ์ข้อมูลของตนเอง
มีเหตุผลสำคัญบางประการในการจัดแพ็กเกจข้อมูลเนื้อหาของเกมให้อยู่ในรูปแบบ เช่น rres ต่อไปนี้คือเหตุผลดีๆ บางประการที่ควรทำ
องค์กร : หลีกเลี่ยงไฟล์หลายพันไฟล์ที่กระจายไปยังไดเร็กทอรีหลายร้อยไดเร็กทอรีในบิลด์เกมสุดท้าย ข้อมูลไฟล์เกมทั้งหมดสามารถจัดระเบียบเป็นไฟล์ .rres ไฟล์เดียวหรือหลายไฟล์ได้ มันทำให้ไดเร็กทอรีเกมสะอาดและมีโครงสร้างที่ดี
ประสิทธิภาพ : การเก็บไฟล์ที่จำเป็นทั้งหมดสำหรับระดับ/แผนที่ไว้ในไฟล์ .rres ไฟล์เดียวจะช่วยลดความจำเป็นในการจัดการไฟล์ในการเข้าถึงไฟล์หลายไฟล์ การจัดการไฟล์เป็นทรัพยากรระบบปฏิบัติการและค่าใช้จ่ายในการเปิดไฟล์ไม่มีนัยสำคัญ อาจทำให้เกิดความล่าช้าในเกมได้ เวลาในการเข้าถึงข้อมูลภายในไฟล์ .rres ก็มีความสำคัญเช่นกัน และยังสามารถปรับปรุงเวลาในการโหลดได้อีกด้วย ทั้งนี้ขึ้นอยู่กับวิธีการจัดระเบียบไฟล์
การรักษาความปลอดภัย : หลีกเลี่ยงการเปิดเผยเนื้อหาเกมทั้งหมดแก่ผู้ใช้โดยตรงเพื่อการคัดลอกหรือแก้ไขที่ง่ายดาย ข้อมูลที่บรรจุลงในไฟล์ .rres จะยากต่อการแตกและแก้ไขสำหรับผู้ใช้ส่วนใหญ่ ปกป้องทรัพย์สินที่มีลิขสิทธิ์ของเกมของคุณ rres ยังรองรับการบีบอัดและการเข้ารหัสข้อมูลต่อทรัพยากร ซึ่งเพิ่มระดับความปลอดภัยเพิ่มเติมเมื่อจำเป็น
เวลาในการดาวน์โหลด : หากจำเป็นต้องเข้าถึงข้อมูลจากเซิร์ฟเวอร์และดาวน์โหลด เนื้อหาที่รวมอยู่ใน .rres เพียงไฟล์เดียวหรือสองสามไฟล์จะปรับปรุงเวลาในการดาวน์โหลด เมื่อเปรียบเทียบกับการดาวน์โหลดไฟล์แต่ละไฟล์แยกกัน
rres ได้รับการพัฒนา มาตั้งแต่ปี 2014 ฉันเริ่มโปรเจ็กต์นี้โดยมีเป้าหมายเพื่อสร้างรูปแบบไฟล์บรรจุภัณฑ์ที่คล้ายกับ XNB สำหรับ raylib ในช่วง 8 ปี ที่ผ่านมา โครงการได้รับการออกแบบใหม่และปรับปรุงหลายครั้งตามกระบวนการเรียนรู้รูปแบบไฟล์ ในเวลานั้น ฉันใช้งานตัวโหลด/ตัวเขียนสำหรับ รูปแบบไฟล์ที่แตกต่างกัน +20 รูปแบบ และยังสร้าง รูปแบบไฟล์แบบกำหนดเอง +12 สำหรับเครื่องมือแบบกำหนดเองของ raylibtech หลายตัว
รูปแบบไฟล์ rres ได้ผ่านการออกแบบใหม่ครั้งใหญ่ อย่างน้อย 4 ครั้ง :
การออกแบบรูปแบบครั้งแรก ถูกจำกัดให้บรรจุทรัพยากรทีละรายการ ทรัพยากรทั้งหมดประกอบด้วย ส่วนหัวข้อมูลทรัพยากร หนึ่งรายการ ตามด้วยชุดพารามิเตอร์ที่เป็นไปได้สี่ชุดคงที่และข้อมูลทรัพยากร ตามไฟล์ .rres ไฟล์ส่วนหัว .h ถูกสร้างขึ้นโดยการแมปด้วยกำหนด rresId ด้วยชื่อไฟล์ทรัพยากร (โดยปกติจะเป็นชื่อไฟล์ดั้งเดิมของข้อมูลที่ยังไม่ได้ประมวลผล) โมเดลนี้ค่อนข้างเรียบง่ายและใช้งานง่าย แต่มีข้อเสียที่สำคัญบางประการ: ไม่ได้คำนึงถึงข้อมูลที่ซับซ้อนที่อาจต้องใช้หลายชิ้น และไม่มีวิธีแยก/ดึงไฟล์ต้นฉบับดั้งเดิม (หรือไฟล์ที่คล้ายกัน)
การออกแบบที่สอง นั้นซับซ้อนกว่ามาก และพยายามแก้ไขข้อบกพร่องของการออกแบบครั้งแรก ในการออกแบบที่สอง ทรัพยากรทั้งหมดสามารถรวมข้อมูลหลายชิ้นไว้ในโครงสร้างแบบต้นไม้ได้ จริงๆ แล้ว การออกแบบนั้นคล้ายคลึงกับรูปแบบไฟล์ RIFF: แต่ละชิ้นสามารถมีชิ้นเพิ่มเติมได้ โดยแต่ละชิ้นมีส่วนหัวและข้อมูล มีการเพิ่มตัวเลือกทรัพยากรเพิ่มเติมบางอย่างด้วย แต่รูปแบบค่อนข้างซับซ้อนในการทำความเข้าใจและจัดการ ในที่สุด การดำเนินการทดสอบก็ถูกละทิ้งไปและมีการตรวจสอบทางเลือกที่ง่ายกว่า
การออกแบบที่สาม คือการกลับไปสู่การออกแบบครั้งแรก: ความเรียบง่ายแต่ยังคงรักษาตัวเลือกบางอย่างไว้สำหรับทรัพยากรแต่ละรายการ ปัญหาของทรัพยากรหลายรายการที่สร้างจากไฟล์อินพุตเดียวได้รับการแก้ไขโดยใช้ฟิลด์ออฟเซ็ตแบบง่ายใน ส่วนหัวข้อมูลทรัพยากร ที่ชี้ไปยังทรัพยากรที่เชื่อมโยงถัดไปเมื่อจำเป็น ทรัพยากรถูกโหลดเป็นอาร์เรย์ของทรัพยากรชิ้น มีการเพิ่มกลุ่มทรัพยากร Central Directory ที่เป็นตัวเลือกเพื่อเก็บการอ้างอิงสำหรับไฟล์อินพุต รูปแบบเป็นสิ่งที่ดี แต่ยังต้องมีการใช้งานและการตรวจสอบเพิ่มเติม โดยจำเป็นต้องไม่เชื่อเรื่องกลไกและยังคงขึ้นอยู่กับโครงสร้างและฟังก์ชันการทำงานของ raylib
การออกแบบที่สี่ ได้ดำเนินการไปพร้อมๆ กับการนำไปใช้ โครงสร้างและสาขาเกือบทั้งหมดได้รับการตรวจสอบและเปลี่ยนชื่อเพื่อความสม่ำเสมอและความเรียบง่าย มีการสร้างไลบรารีแยกต่างหาก ( rres-raylib.h ) เพื่อแมปข้อมูลทรัพยากรที่โหลดลงในประเภทข้อมูลไลบรารี/เอ็นจิ้นที่กำหนดเอง การพึ่งพาใด ๆ กับ raylib ได้ถูกลบออก ทำให้เป็นรูปแบบไฟล์ที่ไม่เชื่อเรื่องกลไกโดยสมบูรณ์ มีการนำตัวอย่างการใช้งานหลายตัวอย่างสำหรับ raylib มาใช้เพื่อแสดงการเชื่อมต่อของไลบรารี-เอ็นจิ้นของ rres และมีการใช้การโหลดทรัพยากรหลายประเภท เครื่องมือ rrespacker ได้รับการสร้างขึ้นตั้งแต่เริ่มต้นเพื่อสร้างไฟล์ rres โดยรองรับอินเทอร์เฟซ GUI ที่ดีพร้อมการรองรับการลากและวาง แต่ยังรวมถึงบรรทัดคำสั่งที่ทรงพลังสำหรับการประมวลผลแบบแบตช์ การใช้งานการบีบอัดและการเข้ารหัสถูกย้ายไปยังการใช้งานไลบรารีผู้ใช้เพื่อให้สอดคล้องกับเครื่องมือการทำแพ็คเกจ และรักษารูปแบบไฟล์ rres ให้สะอาดและเรียบง่ายยิ่งขึ้น
มันเป็น โปรเจ็กต์ที่ใช้เวลา 8 ปี โดยทำงานทั้งแบบเปิดและปิด โดยมีการออกแบบและแก้ไขมากมาย แต่โดยส่วนตัวแล้วฉันมีความสุขมากกับผลลัพธ์สุดท้าย rres เป็นรูปแบบไฟล์บรรจุภัณฑ์ทรัพยากรในระดับของรูปแบบแพ็คเกจเอ็นจิ้นมืออาชีพ แต่ฟรีและเป็นโอเพ่นซอร์ส พร้อม ใช้งานสำหรับนักพัฒนาเกมที่ต้องการใช้ นำไปใช้ หรือสร้างเวอร์ชันที่กำหนดเอง
รูปแบบไฟล์ rres ประกอบด้วยส่วนหัวของไฟล์ ( rresFileHeader ) ตามด้วยกลุ่มทรัพยากรจำนวนหนึ่ง ( rresResourceChunk ) ทรัพยากรทุกชิ้นมีส่วนหัวข้อมูลทรัพยากร ( rresResourceChunkInfo ) ที่มีรหัสประเภทข้อมูล FOURCC และข้อมูลข้อมูลทรัพยากร ข้อมูลทรัพยากร ( rresResourceChunkData ) มีชุดคุณสมบัติขนาดเล็กเพื่อระบุข้อมูล ขึ้นอยู่กับประเภทและอาจมีข้อมูลเพิ่มเติมบางส่วนในตอนท้าย
รูปที่ 01. โครงสร้างไฟล์ rres v1.0
หมายเหตุ: rresResourceChunk(s) ถูกสร้างขึ้นจากไฟล์อินพุต สิ่งสำคัญคือต้องทราบว่าทรัพยากรไม่สามารถแมปกับไฟล์ 1:1 ได้ ไฟล์อินพุตหนึ่งไฟล์สามารถสร้างทรัพยากรได้หลายชิ้น ตัวอย่างเช่น ไฟล์อินพุต .ttf สามารถสร้างกลุ่มทรัพยากรรูปภาพ (ประเภท RRES_DATA_IMAGE ) บวกกับกลุ่มทรัพยากรข้อมูลสัญลักษณ์ตัวอักษร (ประเภท RRES_DATA_FONT_GLYPHS )
rresFileHeader ( 16 bytes )
Signature Id ( 4 bytes ) // File signature id: 'rres'
Version ( 2 bytes ) // Format version
Resource Count ( 2 bytes ) // Number of resource chunks contained
CD Offset ( 4 bytes ) // Central Directory offset (if available)
Reserved ( 4 bytes ) // <reserved>
rresResourceChunk []
{
rresResourceChunkInfo ( 32 bytes )
Type ( 4 bytes ) // Resource type (FourCC)
Id ( 4 bytes ) // Resource identifier (CRC32 filename hash or custom)
Compressor ( 1 byte ) // Data compression algorithm
Cipher ( 1 byte ) // Data encryption algorithm
Flags ( 2 bytes ) // Data flags (if required)
Packed data Size ( 4 bytes ) // Packed data size (compressed/encrypted + custom data appended)
Base data Size ( 4 bytes ) // Base data size (uncompressed/unencrypted)
Next Offset ( 4 bytes ) // Next resource chunk offset (if required)
Reserved ( 4 bytes ) // <reserved>
CRC32 ( 4 bytes ) // Resource Chunk Data CRC32
rresResourceChunkData ( n bytes ) // Packed data
Property Count ( 4 bytes ) // Number of properties contained
Properties [] ( 4 * i bytes ) // Resource data required properties, depend on Type
Data ( m bytes ) // Resource data
}rresFileHeader โครงสร้าง C ต่อไปนี้กำหนด rresFileHeader :
// rres file header (16 bytes)
typedef struct rresFileHeader {
unsigned char id [ 4 ]; // File identifier: rres
unsigned short version ; // File version: 100 for version 1.0
unsigned short chunkCount ; // Number of resource chunks in the file (MAX: 65535)
unsigned int cdOffset ; // Central Directory offset in file (0 if not available)
unsigned int reserved ; // <reserved>
} rresFileHeader ;| สนาม | คำอธิบาย |
|---|---|
id | ตัวระบุลายเซ็นไฟล์ ต้องเป็นอักขระสี่ตัว: r , r , e , s |
version | กำหนดเวอร์ชันและการโค่นล้มของรูปแบบ |
chunkCount | จำนวนชิ้นทรัพยากรที่มีอยู่ในไฟล์ โปรดทราบว่าอาจมีจำนวนมากกว่าจำนวนไฟล์อินพุตที่ประมวลผล |
cdOffset | Central Directory ออฟเซ็ตสัมบูรณ์ภายในไฟล์ โปรดทราบว่า CDIR เป็นเพียงกลุ่มทรัพยากรประเภทอื่น Central Directory สามารถปรากฏในไฟล์ได้หรือไม่ ขอแนะนำให้วางเป็นส่วนสุดท้ายในไฟล์หากมีการใช้แพ็ก rres แบบกำหนดเอง ตรวจสอบส่วน rresCentralDir เพื่อดูรายละเอียดเพิ่มเติม |
reserved | ฟิลด์นี้สงวนไว้สำหรับการเพิ่มในอนาคตหากจำเป็น |
ตารางที่ 01. คำอธิบายฟิลด์ rresFileHeader และรายละเอียด
ข้อควรพิจารณา:
rres ถูกจำกัดด้วยการออกแบบให้มี ชิ้นทรัพยากรได้สูงสุด 65535 ชิ้น ในกรณีที่จำเป็นต้องบรรจุทรัพยากรมากขึ้น แนะนำให้สร้างไฟล์ rres หลายไฟล์rres ใช้การชดเชย 32 บิตเพื่อจัดการกับกลุ่มทรัพยากรที่แตกต่างกัน ดังนั้น จึง ไม่สามารถจัดการข้อมูลได้มากกว่า ~4GB โปรดรักษาไฟล์ rres ให้มีขนาดเล็กกว่า 4GB ในกรณีที่ต้องการพื้นที่เพิ่มเติมเพื่อจัดทำแพ็กเกจทรัพยากร ให้สร้างไฟล์ rres หลายไฟล์ rresResourceChunk ไฟล์ rres มีทรัพยากรจำนวนหนึ่ง ทรัพยากรแต่ละชิ้นแสดงถึงชุดข้อมูลที่มีอยู่ในตัวเอง ชิ้นทรัพยากรถูกสร้างขึ้นจากไฟล์อินพุตในการสร้างไฟล์ rres โดยเครื่องมือ rres packer เครื่องมือ rres packer จะแยกข้อมูลที่ต้องการออกจากไฟล์ และสร้างชิ้นทรัพยากรตั้งแต่หนึ่งชิ้นขึ้นไป ขึ้นอยู่กับนามสกุลไฟล์ ตัวอย่างเช่น สำหรับไฟล์รูปภาพ กลุ่มทรัพยากร type RRES_DATA_IMAGE จะถูกสร้างขึ้นโดยมีเพียงข้อมูลพิกเซลของรูปภาพและคุณสมบัติที่จำเป็นในการอ่านข้อมูลนั้นกลับจากไฟล์ทรัพยากร
สิ่งสำคัญคือต้องทราบว่าไฟล์อินพุตหนึ่งไฟล์สามารถสร้างทรัพยากรได้หลายชิ้นเมื่อสร้างไฟล์ rres ตัวอย่างเช่น ไฟล์อินพุต .ttf สามารถสร้างก้อนทรัพยากร RRES_DATA_IMAGE บวกกับก้อนทรัพยากร RRES_DATA_FONT_GLYPHS เป็นไปได้ที่จะแพ็กไฟล์เป็นประเภทก้อนทรัพยากร RRES_DATA_RAW ธรรมดา ในกรณีนี้ไฟล์อินพุตจะไม่ได้รับการประมวลผล เพียงแพ็กเป็นข้อมูลดิบ
ในการสร้าง rres rres packer สามารถสร้างก้อนทรัพยากรเพิ่มเติมประเภท RRES_DATA_DIRECTORY ที่มีข้อมูลเกี่ยวกับไฟล์อินพุตที่ประมวลผล อาจมีประโยชน์ในบางกรณี เช่น การเชื่อมโยงชื่อไฟล์อินพุตเข้ากับรหัสทรัพยากรที่สร้างขึ้นโดยตรง และยังแยกข้อมูลในโครงสร้างไฟล์ที่คล้ายกันกับอินพุตดั้งเดิมได้อีกด้วย
แต่ละส่วนของทรัพยากรจะถูกแบ่งออกเป็นสองส่วน: rresResourceChunkInfo + rresResourceData
rresResourceChunkInfo โครงสร้าง C ต่อไปนี้กำหนด rresResourceChunkInfo :
// rres resource chunk info header (32 bytes)
typedef struct rresResourceChunkInfo {
unsigned char type [ 4 ]; // Resource chunk type (FourCC)
unsigned int id ; // Resource chunk identifier (generated from filename CRC32 hash)
unsigned char compType ; // Data compression algorithm
unsigned char cipherType ; // Data encription algorithm
unsigned short flags ; // Data flags (if required)
unsigned int packedSize ; // Data chunk size (compressed/encrypted + custom data appended)
unsigned int baseSize ; // Data base size (uncompressed/unencrypted)
unsigned int nextOffset ; // Next resource chunk global offset (if resource has multiple chunks)
unsigned int reserved ; // <reserved>
unsigned int crc32 ; // Data chunk CRC32 (propCount + props[] + data)
} rresResourceChunkInfo ;| สนาม | คำอธิบาย |
|---|---|
type | รหัส FourCC และระบุประเภทของข้อมูลทรัพยากรที่มีอยู่ใน rresResourceChunkData Enum rresResourceDataType กำหนดประเภทข้อมูลหลายประเภท สามารถเพิ่มชนิดข้อมูลใหม่ได้หากจำเป็น |
id | ตัวระบุทรัพยากรส่วนกลาง ซึ่งสร้างขึ้นจากชื่อไฟล์อินพุตโดยใช้แฮช CRC32 และไม่ได้มีลักษณะเฉพาะ ไฟล์อินพุตหนึ่งไฟล์สามารถสร้างชิ้นส่วนทรัพยากรได้หลายชิ้น ชิ้นส่วนที่สร้างขึ้นทั้งหมดใช้ตัวระบุเดียวกัน และจะถูกโหลดเข้าด้วยกันเมื่อมีการโหลดทรัพยากร ตัวอย่างเช่น อินพุต .ttf สามารถสร้างแหล่งข้อมูลสองชิ้น ( RRES_DATA_IMAGE + RRES_DATA_FONT_GLYPHS ) โดยมีตัวระบุเดียวกันซึ่งจะถูกโหลดพร้อมกันเมื่อมีการร้องขอตัวระบุ ขึ้นอยู่กับผู้ใช้ที่จะตัดสินใจว่าจะทำอย่างไรกับข้อมูลที่โหลด |
compType | กำหนดอัลกอริทึมการบีบอัดที่ใช้สำหรับข้อมูลก้อนทรัพยากร การบีบอัดขึ้นอยู่กับไลบรารีกลางระหว่าง rres และเอ็นจิ้น rres.h เพียงกำหนดค่าอัลกอริธึมที่มีประโยชน์เพื่อใช้ในกรณีของการบีบอัด ควรใช้การบีบอัดก่อนการเข้ารหัสเสมอ และจะบีบอัด rresResourceData แบบเต็ม ( Property Count + Properties[] + Data ) หากไม่มีการใช้การเข้ารหัสข้อมูล packedSize จะกำหนดขนาดของข้อมูลที่บีบอัด |
cipherType | กำหนดอัลกอริทึมการเข้ารหัสที่ใช้สำหรับข้อมูลก้อนทรัพยากร เช่นเดียวกับการบีบอัด การเข้ารหัสจะขึ้นอยู่กับไลบรารีกลางระหว่าง rres และเอ็นจิ้น rres.h เพียงกำหนดค่าอัลกอริทึมที่มีประโยชน์เพื่อใช้ในกรณีที่นำการเข้ารหัสไปใช้ ควรใช้การเข้ารหัสหลังการบีบอัด ขึ้นอยู่กับอัลกอริธึมการเข้ารหัสและโหมดการเข้ารหัส อาจต้องใช้ข้อมูลพิเศษบางส่วนแนบกับข้อมูลทรัพยากร (เช่น การเข้ารหัส MAC) ซึ่งขึ้นอยู่กับการใช้งานและเครื่องมือ rres packer / ไลบรารีกลาง rres สำหรับเอ็นจิ้นมีหน้าที่รับผิดชอบในการจัดการสิ่งนั้น ข้อมูลเพิ่มเติม ขอแนะนำให้ผนวกเข้ากับข้อมูลทรัพยากรและพิจารณาใน packedSize |
flags | สงวนไว้สำหรับแฟล็กเพิ่มเติม ในกรณีที่จำเป็นในการดำเนินการ |
packedSize | กำหนดขนาดที่แพ็ก (บีบอัด/เข้ารหัส + ข้อมูลผู้ใช้เพิ่มเติม) ของ rresResourceChunkData ข้อมูลแพ็กเกจอาจมีข้อมูลผู้ใช้ต่อท้ายหลังจากข้อมูลที่บีบอัด/เข้ารหัส เช่น nonce/MAC สำหรับข้อมูลที่เข้ารหัส แต่ขึ้นอยู่กับการใช้งาน ซึ่งจัดการโดยเครื่องมือ rres packer และไลบรารีผู้ใช้เพื่อโหลดข้อมูลชิ้นลงใน โครงสร้างเครื่องยนต์เป้าหมาย |
baseSize | กำหนดขนาดฐาน (ไม่บีบอัด/ไม่เข้ารหัส) ของ rresResourceChunkData |
nextOffset | กำหนดที่อยู่ตำแหน่งไฟล์ส่วนกลางสำหรับกลุ่มทรัพยากร ที่เกี่ยวข้อง ถัดไป ซึ่งมีประโยชน์สำหรับไฟล์อินพุตที่สร้างทรัพยากรหลายรายการ เช่น แบบอักษรหรือตาข่าย |
reserved | ฟิลด์นี้สงวนไว้สำหรับการเพิ่มในอนาคตหากจำเป็น |
crc32 | คำนวณจากกลุ่ม rresResourceData ทั้งหมด ( packedSize ) และมีจุดประสงค์เพื่อตรวจจับข้อผิดพลาดความเสียหายของข้อมูล |
ตารางที่ 02. คำอธิบายฟิลด์ rresResourceChunkInfo และรายละเอียด
rresResourceChunkData rresResourceChunkData มีข้อมูลต่อไปนี้:
Property Count : จำนวนคุณสมบัติที่มีอยู่ ขึ้นอยู่กับ type ทรัพยากรProperties[] : คุณสมบัติที่ต้องการข้อมูลทรัพยากร ขึ้นอยู่กับ type ทรัพยากรData : ข้อมูลดิบของทรัพยากร ขึ้นอยู่กับ type ทรัพยากร หมายเหตุ: rresResourceChunkData อาจมีข้อมูลผู้ใช้เพิ่มเติม ในกรณีเหล่านั้น จะต้องพิจารณาขนาดข้อมูลเพิ่มเติมใน packedSize
rresResourceDataType type ทรัพยากรที่ระบุใน rresResourceChunkInfo จะกำหนดประเภทของข้อมูลและจำนวนคุณสมบัติที่มีอยู่ในกลุ่มทรัพยากร
นี่คือประเภทข้อมูลที่กำหนดไว้ในปัจจุบัน โปรดทราบว่าไฟล์อินพุตบางไฟล์สามารถสร้างทรัพยากรหลายชิ้นได้หลายประเภท สามารถเพิ่มประเภททรัพยากรเพิ่มเติมได้หากจำเป็น
// rres resource chunk data type
// NOTE 1: Data type determines the properties and the data included in every chunk
// NOTE 2: This enum defines the basic resource data types, some input files could generate multiple resource chunks
typedef enum rresResourceDataType {
RRES_DATA_NULL = 0 , // FourCC: NULL - Reserved for empty chunks, no props/data
RRES_DATA_RAW = 1 , // FourCC: RAWD - Raw file data, input file is not processed, just packed as is
RRES_DATA_TEXT = 2 , // FourCC: TEXT - Text file data, byte data extracted from text file
RRES_DATA_IMAGE = 3 , // FourCC: IMGE - Image file data, pixel data extracted from image file
RRES_DATA_WAVE = 4 , // FourCC: WAVE - Audio file data, samples data extracted from audio file
RRES_DATA_VERTEX = 5 , // FourCC: VRTX - Vertex file data, extracted from a mesh file
RRES_DATA_FONT_GLYPHS = 6 , // FourCC: FNTG - Font glyphs info, generated from an input font file
RRES_DATA_LINK = 99 , // FourCC: LINK - External linked file, filepath as provided on file input
RRES_DATA_DIRECTORY = 100 , // FourCC: CDIR - Central directory for input files relation to resource chunks
// TODO: Add additional data types if required
} rresResourceDataType ; types ข้อมูลที่กำหนดไว้ในปัจจุบันประกอบด้วยคุณสมบัติและข้อมูลต่อไปนี้:
| ประเภททรัพยากร | โฟร์ซีซี | อุปกรณ์ประกอบฉากนับ | อุปกรณ์ประกอบฉาก | ข้อมูล |
|---|---|---|---|---|
RRES_DATA_NULL | NULL | 0 | - | - |
RRES_DATA_RAW | RAWD | 4 | props[0] :ขนาดprops[1] : extension01props[2] : extension02props[3] : สงวนไว้ | ไบต์ของไฟล์ดิบ |
RRES_DATA_TEXT | TEXT | 4 | props[0] :ขนาดprops[1] : rresTextEncodingprops[2] : rresCodeLangprops[3] :cultureCode | ข้อมูลข้อความ |
RRES_DATA_IMAGE | IMGE | 4 | props[0] :ความกว้างprops[1] :ความสูงprops[2] : rresPixelFormatprops[3] :mipmaps | ข้อมูลพิกเซล |
RRES_DATA_WAVE | WAVE | 4 | props[0] :frameCountprops[1] :sampleRateprops[2] :sampleSizeprops[3] : ช่อง | ข้อมูลตัวอย่างเสียง |
RRES_DATA_VERTEX | VRTX | 4 | props[0] :vertexCountprops[1] : rresVertexAttributeprops[2] :componentCountprops[3] : rresVertexFormat | ข้อมูลจุดยอด |
RRES_DATA_FONT_GLYPHS | FNTG | 4 | props[0] :baseSizeprops[1] :glyphCountprops[2] :glyphPaddingprops[3] : rresFontStyle | rresFontGlyphInfo[0..glyphCount] |
RRES_DATA_LINK | LINK | 1 | props[0] :ขนาด | ข้อมูลพาธของไฟล์ |
RRES_DATA_DIRECTORY | CDIR | 1 | props[0] :entryCount | rresDirEntry[0..entryCount] |
ตารางที่ 03. rresResourceDataType กำหนดค่าและรายละเอียด
หมายเหตุ: RRES_DATA_RAW มีนามสกุลไฟล์แพ็กเกจเป็นส่วนหนึ่งของคุณสมบัติ ส่วนขยาย char จะถูกแปลงเป็นค่า unsigned int ขนาด 4 ไบต์ โดยเริ่มจากจุด เช่น ".png" => 0x2e706e67 ในกรณีที่ส่วนขยายไม่เกี่ยวข้อง การใช้งานผู้ใช้สามารถตัดสินใจตั้งค่าคุณสมบัติเหล่านั้นเป็น 0
rres.h กำหนด enums ต่อไปนี้เพื่อความสะดวกในการกำหนดคุณสมบัติบางส่วน:
rresTextEncoding : กำหนดการเข้ารหัสข้อความที่เป็นไปได้หลายรายการ ค่าเริ่มต้นคือ 0 (UTF-8)rresCodeLang : กำหนดภาษาการเขียนโปรแกรมหลายภาษา ซึ่งมีประโยชน์ในกรณีที่ฝังไฟล์โค้ดหรือสคริปต์rresPixelFormat : กำหนดค่ารูปแบบพิกเซลหลายค่าสำหรับข้อมูลพิกเซลของภาพrresVertexAttribute : กำหนดประเภทแอตทริบิวต์จุดยอดหลายประเภทเพื่อความสะดวกrresVertexFormat : กำหนดรูปแบบข้อมูลหลายรูปแบบสำหรับข้อมูลจุดยอดrresFontStyle : กำหนดรูปแบบแบบอักษรหลายแบบ (ปกติ, ตัวหนา, ตัวเอียง...) ค่าเริ่มต้นคือ 0 ( RRES_FONT_STYLE_DEFAULT )rresCentralDir กลุ่มทรัพยากร Central Directory คือกลุ่มพิเศษที่ อาจมีหรือไม่อยู่ ในไฟล์ rres โดยจะจัดเก็บข้อมูลเกี่ยวกับไฟล์อินพุตที่ประมวลผลเพื่อสร้างกลุ่มทรัพยากรหลายรายการ และอาจมีประโยชน์ในการ:
อ้างอิงทรัพยากรตามชื่อไฟล์ต้นฉบับ สิ่งนี้มีประโยชน์มากในแง่ของการใช้งานเพื่อลดการเปลี่ยนแปลงโค้ดที่จำเป็นหากทำแพ็คเกจ rres ในโปรเจ็กต์ที่มีอยู่หรือเมื่อสิ้นสุดการพัฒนาโปรเจ็กต์ หากการโหลดไฟล์ทั้งหมดเสร็จสิ้นโดยใช้ชื่อไฟล์โดยตรง
แยกทรัพยากรบางส่วนออกเป็นไฟล์อินพุตที่คล้ายกัน จะเป็นไปได้ก็ต่อเมื่อไฟล์อินพุตไม่ได้รับการประมวลผลในลักษณะทำลายล้าง ตัวอย่างเช่น หากไฟล์ a.ttf ได้รับการประมวลผลเพื่อสร้างข้อมูลข้อมูลแผนที่ภาพสัญลักษณ์ + สัญลักษณ์ คุณจะไม่สามารถเรียกไฟล์ .ttf ต้นฉบับกลับมาได้
rres จัดเตรียมโครงสร้างที่เป็นประโยชน์เพื่อจัดการกับข้อมูลก้อนทรัพยากร Central Directory :
// rres central directory entry
typedef struct rresDirEntry {
unsigned int id ; // Resource id
unsigned int offset ; // Resource global offset in file
unsigned int reserved ; // reserved
unsigned int fileNameSize ; // Resource fileName size (NULL terminator and 4-byte alignment padding considered)
char fileName [ RRES_MAX_CDIR_FILENAME_LENGTH ]; // Resource original fileName (NULL terminated and padded to 4-byte alignment)
} rresDirEntry ;
// rres central directory
// NOTE: This data represents the rresResourceChunkData
typedef struct rresCentralDir {
unsigned int count ; // Central directory entries count
rresDirEntry * entries ; // Central directory entries
} rresCentralDir ;หมายเหตุ: รายการชื่อไฟล์ Central Directory จะถูกจัดแนวให้มีขนาด 4 ไบต์เพื่อปรับปรุงเวลาในการเข้าถึงไฟล์
rres.h จัดเตรียมฟังก์ชันในการโหลด Central Directory จากไฟล์ rres เมื่อพร้อมใช้งาน: rresLoadCentralDirectory() และยังมีฟังก์ชันเพื่อรับตัวระบุทรัพยากรจากชื่อไฟล์ดั้งเดิม: rresGetIdFromFileName()
ในกรณีที่ไฟล์ rres ถูกสร้างขึ้นโดยไม่มี Central Directory ควรจัดเตรียมไฟล์ส่วนหัวรอง ( .h ) พร้อมด้วยการอ้างอิง id สำหรับรีซอร์สทั้งหมด เพื่อใช้ในโค้ดผู้ใช้
rres ได้รับการออกแบบให้เป็น รูปแบบไฟล์ที่ไม่เชื่อเรื่องเอ็นจิ้น ที่สามารถใช้กับเอ็นจิ้นเกมใดก็ได้ นักพัฒนาที่ใช้ rres สามารถใช้ไลบรารีที่กำหนดเองและนามธรรมที่กำหนดเองเพื่อ แมปข้อมูลทั่วไป rres กับโครงสร้างข้อมูลเอ็นจิ้นของตนเอง รวมถึง เครื่องมือบรรจุภัณฑ์ rres แบบกำหนดเอง
แผนภาพต่อไปนี้แสดงตัวอย่างการใช้งาน rres สำหรับไลบรารี raylib
รูปที่ 02. การใช้งานตัวอย่าง rres: libs ของโปรแกรมและเครื่องมือแบบกำหนดเอง
การใช้งาน rres ประกอบด้วยหลายส่วน:
rres.hrres-raylib.hrrespackerrres.h ไลบรารี Base rres มีหน้าที่ในการอ่านส่วนทรัพยากรของไฟล์ rres ในโครงสร้างทรัพยากรทั่วไปและส่งคืนให้กับผู้ใช้ โครงสร้างทรัพยากรที่ผู้ใช้เปิดเผย rresResourceChunk เป็นไปตามโครงสร้างข้อมูลจำเพาะ rres ( rresResourceChunkInfo + rresResourceChunkData ) มีโครงสร้างดังต่อไปนี้:
rresResourceChunk มีชิ้นเดียวที่มีข้อมูลและข้อมูลที่ผู้ใช้ต้องการ: rresResourceChunkInfo + rresResourceChunkDatarresresourceChunkInfo มีข้อมูลเกี่ยวกับก้อนทรัพยากรที่โหลดrresResourceChunkData มีข้อมูลจริงสำหรับทรัพยากร: คุณสมบัติที่จำเป็นและข้อมูลดิบ สิ่งสำคัญที่ควรทราบคือในกรณีที่ข้อมูลถูกบีบอัด/เข้ารหัส ขึ้นอยู่กับไลบรารีผู้ใช้ ( rres-raylib.h ) ที่จะประมวลผลข้อมูลนั้น ในกรณีเหล่านั้น chunk.data.raw มีข้อมูลที่บีบอัด/เข้ารหัสและ chunk.data.propCount = 0 และ chunk.data.props = NULL ; ขึ้นอยู่กับไลบรารีผู้ใช้ที่จะเติมคุณสมบัติหลังจากการคลายการบีบอัด/ถอดรหัสrresResourceMulti มีหลาย rresResourceChunks สำหรับไฟล์อินพุตที่ประมวลผล // rres resource chunk
typedef struct rresResourceChunk {
rresResourceChunkInfo info ; // Resource chunk info
rresResourceChunkData data ; // Resource chunk packed data, contains propCount, props[] and raw data
} rresResourceChunk ;
// rres resource chunk info header (32 bytes)
typedef struct rresResourceChunkInfo {
unsigned char type [ 4 ]; // Resource chunk type (FourCC)
unsigned int id ; // Resource chunk identifier (generated from filename CRC32 hash)
unsigned char compType ; // Data compression algorithm
unsigned char cipherType ; // Data encription algorithm
unsigned short flags ; // Data flags (if required)
unsigned int packedSize ; // Data chunk size (compressed/encrypted + custom data appended)
unsigned int baseSize ; // Data base size (uncompressed/unencrypted)
unsigned int nextOffset ; // Next resource chunk global offset (if resource has multiple chunks)
unsigned int reserved ; // <reserved>
unsigned int crc32 ; // Data chunk CRC32 (propCount + props[] + data)
} rresResourceChunkInfo ;
// rres resource chunk data
typedef struct rresResourceChunkData {
unsigned int propCount ; // Resource chunk properties count
unsigned int * props ; // Resource chunk properties
void * raw ; // Resource chunk raw data
} rresResourceChunkData ;
// rres resource multi
// NOTE: It supports multiple resource chunks
typedef struct rresResourceMulti {
unsigned int count ; // Resource chunks count
rresResourceChunk * chunks ; // Resource chunks
} rresResourceMulti ; rresResourceChunk เดียวสามารถโหลดได้จากไฟล์ .rres ด้วยฟังก์ชันที่ให้มา: rresLoadResourceChunk() และยกเลิกการโหลดด้วย rresUnloadResourceChunk()
rresResourceMulti แบบเต็มสามารถโหลดได้จากไฟล์ .rres พร้อมด้วยฟังก์ชันที่ให้มา: rresLoadResourceMulti() และยกเลิกการโหลดด้วย rresUnloadResourceMulti()
rres-raylib.h ไลบรารีการแมปประกอบด้วย rres.h และมีฟังก์ชันในการแมปข้อมูลก้อนทรัพยากรที่โหลดจากไฟล์ rres ลงในโครงสร้าง raylib API ที่ให้มานั้นเรียบง่ายและใช้งานง่าย ตามแบบแผน raylib :
RLAPI void * LoadDataFromResource ( rresResourceChunk chunk , int * size ); // Load raw data from rres resource chunk
RLAPI char * LoadTextFromResource ( rresResourceChunk chunk ); // Load text data from rres resource chunk
RLAPI Image LoadImageFromResource ( rresResourceChunk chunk ); // Load Image data from rres resource chunk
RLAPI Wave LoadWaveFromResource ( rresResourceChunk chunk ); // Load Wave data from rres resource chunk
RLAPI Font LoadFontFromResource ( rresResourceMulti multi ); // Load Font data from rres resource multiple chunks
RLAPI Mesh LoadMeshFromResource ( rresResourceMulti multi ); // Load Mesh data from rres resource multiple chunks
RLAPI int UnpackResourceChunk ( rresResourceChunk * chunk ); // Unpack resource chunk data (decompres/decrypt data)
RLAPI void SetBaseDirectory ( const char * baseDir ); // Set base directory for externally linked data โปรดทราบว่ามีการใช้การบีบอัด/ถอดรหัสข้อมูลในไลบรารีแบบกำหนดเองนี้ โดยมี UnpackResourceChunk() จัดเตรียมไว้ให้สำหรับผู้ใช้ rresResourceChunk มีค่าตัวระบุคอมเพรสเซอร์/รหัสเพื่อความสะดวก การสนับสนุนคอมเพรสเซอร์และไซเฟอร์ขึ้นอยู่กับการใช้งานของผู้ใช้ และต้องสอดคล้องกับเครื่องมือบรรจุภัณฑ์ ( rrespacker )
รูปแบบไฟล์ rres ไม่เชื่อเรื่องกลไกจัดการ ไลบรารีและเครื่องมือสามารถสร้างขึ้นสำหรับกลไก/เฟรมเวิร์กใดๆ ในภาษาการเขียนโปรแกรมใดก็ได้
rrespacker rrespacker เป็นเครื่องมือแพ็ก rres ที่รับผิดชอบในการประมวลผลไฟล์อินพุตทั้งหมดและสร้างไฟล์ rres ตามข้อกำหนด ในกรณีที่อัลกอริธึมการบีบอัด/การเข้ารหัสบางตัวได้รับการสนับสนุน เครื่องมือนี้จะต้องถูกนำมาใช้ และไลบรารีการแมปควรรองรับอัลกอริธึมเดียวกัน ในกรณีของเรา rres-raylib.h
รูปที่ 03 เครื่องมือ rrespacker อินเทอร์เฟซ GUI นอกจากนี้ยังรองรับ CLI สำหรับการประมวลผลแบบแบตช์
rrespacker สามารถใช้ออนไลน์ (หรือดาวน์โหลด) จาก itch.io
ข้อมูลจำเพาะรูปแบบไฟล์ rres ไลบรารี rres.h และไลบรารี rres-raylib.h ได้รับอนุญาตภายใต้ใบอนุญาต MIT ตรวจสอบใบอนุญาตสำหรับรายละเอียดเพิ่มเติม
ลิขสิทธิ์ (c) 2014-2024 รามอน ซานตามาเรีย (@raysan5)