rres เป็นรูปแบบไฟล์ที่เรียบง่ายและใช้งานง่ายสำหรับจัดแพ็คเกจทรัพยากร
rres
ได้รับการออกแบบมาเพื่อรวมเนื้อหาของเกม (รูปภาพ แบบอักษร ข้อความ เสียง โมเดล...) ให้อยู่ในรูปแบบที่เรียบง่ายและครบถ้วนในตัวเอง อ่านและเขียนได้ง่าย ได้รับการออกแบบมาเพื่อโหลดข้อมูลด้วยวิธีที่รวดเร็วและมีประสิทธิภาพ
rres
ได้รับแรงบันดาลใจจากรูปแบบไฟล์ต่อไปนี้: XNB (ใช้โดย XNA/MonoGame), RIFF, PNG และ ZIP
rresFileHeader
rresResourceChunk
rresResourceChunkInfo
rresResourceChunkData
rresResourceDataType
rresCentralDir
ความเรียบง่าย : โครงสร้าง 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 ) //
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 ) //
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 ; //
} 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 ; //
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] : extension01 props[2] : extension02 props[3] : สงวนไว้ | ไบต์ของไฟล์ดิบ |
RRES_DATA_TEXT | TEXT | 4 | props[0] :ขนาดprops[1] : rresTextEncoding props[2] : rresCodeLang props[3] :cultureCode | ข้อมูลข้อความ |
RRES_DATA_IMAGE | IMGE | 4 | props[0] :ความกว้างprops[1] :ความสูงprops[2] : rresPixelFormat props[3] :mipmaps | ข้อมูลพิกเซล |
RRES_DATA_WAVE | WAVE | 4 | props[0] :frameCountprops[1] :sampleRateprops[2] :sampleSizeprops[3] : ช่อง | ข้อมูลตัวอย่างเสียง |
RRES_DATA_VERTEX | VRTX | 4 | props[0] :vertexCountprops[1] : rresVertexAttribute props[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.h
rres-raylib.h
rrespacker
rres.h
ไลบรารี Base rres
มีหน้าที่ในการอ่านส่วนทรัพยากรของไฟล์ rres
ในโครงสร้างทรัพยากรทั่วไปและส่งคืนให้กับผู้ใช้ โครงสร้างทรัพยากรที่ผู้ใช้เปิดเผย rresResourceChunk
เป็นไปตามโครงสร้างข้อมูลจำเพาะ rres
( rresResourceChunkInfo
+ rresResourceChunkData
) มีโครงสร้างดังต่อไปนี้:
rresResourceChunk
มีชิ้นเดียวที่มีข้อมูลและข้อมูลที่ผู้ใช้ต้องการ: rresResourceChunkInfo
+ rresResourceChunkData
rresresourceChunkInfo
มีข้อมูลเกี่ยวกับก้อนทรัพยากรที่โหลด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 ; //
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)