rres 是一種簡單易用的資源打包檔案格式
rres
旨在將遊戲資產(圖像、字體、文字、音訊、模型...)打包成簡單的獨立綜合格式,易於讀寫,旨在以快速且有效率的方式載入資料。
rres
靈感來自以下文件格式:XNB(由 XNA/MonoGame 使用)、RIFF、PNG 和 ZIP。
rresFileHeader
rresResourceChunk
rresResourceChunkInfo
rresResourceChunkData
rresResourceDataType
rresCentralDir
簡單性: rres
結構簡單,一個檔案頭,多個資源依序排列。儘管如此,每個資源都有一個小的(32 位元組)資源資訊標頭,其中包含多個可用選項。
易於使用:用於讀取.rres
檔案的rres
庫很小,只有從其 id 讀取資源資料所需的最少功能。它僅使用標準 C 庫中的一小部分函數。提供帶有 GUI/CLI 的rrespacker
工具,可以輕鬆建立和檢視.rres
檔案。
靈活性: rres
格式支援任何類型的輸入文件,如果資料不屬於基本資料類型,則可以將其打包為原始文件資料。
可攜性: rres
檔案格式不依賴特定引擎,基礎庫僅讀取打包的資源數據,並且該數據可以映射到任何引擎結構。輔助函式庫rres-raylib.h
提供了一個使用範例,它將 rres 資料對應到 raylib 結構。
安全性:如果需要, rres
支援按資源壓縮和加密。儘管如此,儘管文件格式提供了支持,但用戶仍需要在rres
打包工具和引擎映射庫中實現它。 rres
不強制設計任何特定的壓縮/加密演算法
可擴充性: rres
檔案格式是可擴充的,如果需要,支援新資料類型、新功能和自訂資料。
免費開源: rres
是一個開放規範和免費開源程式庫。它可以與提供的工具( rrespacker
)一起使用,或者可以為任何引擎實作自訂打包器/載入器。對於任何願意創建自己的資料打包檔案格式的人來說,格式描述也可以用作學習材料。
將遊戲資產資料打包成像rres
這樣的格式有一些重要的原因,這裡有一些這樣做的充分理由。
組織:避免在最終遊戲建構中將數千個檔案分佈在數百個目錄中。所有遊戲檔案資料都可以組織在一個或幾個.rres
檔案中。它使遊戲目錄保持乾淨且結構良好。
效能:將關卡/地圖所需的所有檔案儲存到單一.rres
檔案中,減少了存取多個檔案時對檔案句柄的需求;文件句柄是作業系統資源,開啟檔案的成本並不是微不足道的,它可能會導致遊戲延遲。 .rres
檔案內的資料存取時間也很重要,根據檔案的組織方式,它還可以縮短載入時間。
安全性:避免將所有遊戲資產直接暴露給使用者以便於複製或修改。對於大多數用戶來說,打包到.rres
檔案中的資料將更難以提取和修改;保護您的遊戲版權資產。 rres
還支援按資源進行資料壓縮和加密,在需要時增加額外的安全等級。
下載時間:如果需要從伺服器存取並下載數據,則與單獨下載每個檔案相比,將資源打包到單一或幾個.rres
檔案中可以縮短下載時間。
rres
自 2014 年以來一直在開發中。我開始這個專案的目的是為 raylib 創建一個類似於 XNB 的打包檔案格式。在過去8 年中,該專案在文件格式學習過程中經歷了多次重新設計和改進。在那段時間,我實作了20 多種不同檔案格式的載入器/寫入器,並為多個 raylibtech 自訂工具建立了12 種自訂檔案格式。
rres
檔案格式至少經歷了4 次重大重新設計:
此格式的第一個設計僅限於打包一個又一個資源,每個資源都包含一個資源資訊標頭,後面跟著一組固定的四個可能參數和資源資料。沿著.rres
文件,產生了一個.h
頭文件映射,定義了帶有資源文件名的rresId
(通常是未處理資料的原始文件名)。該模型非常簡單直觀,但它有一些重要的缺點:它沒有考慮可能需要多個區塊的複雜資料片段,並且無法提取/檢索原始來源檔案(或類似的來源檔案)。
第二個設計要複雜得多,並試圖解決第一個設計的缺點。在第二種設計中,每個資源都可以包含樹結構中的多個資料塊。實際上,該設計類似於 RIFF 檔案格式:每個區塊都可以包含附加區塊,每個區塊都有其標頭和資料。還添加了一些額外的資源選項,但格式變得非常難以理解和管理。最後,測試實作被放棄,並研究了更簡單的替代方案。
第三種設計是對第一種設計的回歸:簡單但保留了個別資源的一些選項。使用資源資訊標頭中的一個簡單偏移欄位(在需要時指向下一個連結資源)解決了從單一輸入檔案產生多個資源的問題。資源作為資源塊數組載入。新增了可選的中央目錄資源區塊以保留輸入檔案的參考。格式很好,但仍然需要實現和進一步研究,它需要與引擎無關,並且仍然依賴 raylib 結構和功能。
在實施過程中已經完成了第四次設計,為了一致性和簡單性,幾乎所有的結構和欄位都經過了審查和重新命名。已建立一個單獨的函式庫( rres-raylib.h
)來將載入的資源資料對應到自訂函式庫/引擎資料類型,對 raylib 的任何依賴項已被刪除,使其成為完全與引擎無關的檔案格式。實作了幾個raylib的使用範例來說明rres
的函式庫引擎連接,並實作了多種類型的資源載入。 rrespacker
工具是從頭開始創建的,用於生成rres
文件,它支援具有拖放支援的漂亮 GUI 介面,而且還支援用於批次的強大命令列。壓縮和加密實現已移至用戶庫實現,以與打包工具保持一致,並保持rres
檔案格式更乾淨、更簡單。
這是一個為期8 年的項目,斷斷續續地進行,進行了多次重新設計和修改,但我個人對最終結果非常滿意。 rres
是一種資源打包檔案格式,處於任何專業引擎包格式的級別,但免費且開源,可供任何想要使用它、實現它或創建自訂版本的遊戲開發人員使用。
rres 檔案格式由檔案頭 ( rresFileHeader
) 和後面跟著的多個資源區塊 ( rresResourceChunk
) 組成。每個資源區塊都有一個資源資訊標頭 ( rresResourceChunkInfo
),其中包括FOURCC
資料類型代碼和資源資料資訊。資源資料 ( rresResourceChunkData
) 包含一小組用於標識資料的屬性,具體取決於類型,並且可能在末尾包含一些附加資料。
圖 01.rres v1.0 檔案結構。
注意:rresResourceChunk 是從輸入檔產生的。需要注意的是,資源無法 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
packer 工具在建立rres
檔案時根據輸入檔案產生的;根據檔案副檔名, rres
打包工具從檔案中提取所需的資料並產生一個或多個資源區塊。例如,對於映像文件,會產生RRES_DATA_IMAGE
type
的資源區塊,僅包含影像的像素資料以及從資源檔案讀回該資料所需的屬性。
需要注意的是,在建立rres
檔案時,一個輸入檔案可能會產生多個資源區塊。例如, .ttf
輸入檔可以產生RRES_DATA_IMAGE
資源塊和RRES_DATA_FONT_GLYPHS
資源塊;也可以將檔案打包為普通RRES_DATA_RAW
資源區塊類型,在這種情況下,輸入檔案不會被處理,只是打包為原始資料。
在建立rres
時, rres
packer 可以建立一個RRES_DATA_DIRECTORY
類型的附加資源區塊,其中包含有關已處理輸入檔案的資料。它在某些情況下可能很有用,例如將輸入檔案名稱直接與產生的資源 ID 相關聯,以及以與原始輸入類似的檔案結構提取資料。
每個資源區塊分為兩部分: 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 中包含的資源資料的類型。枚舉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 打包工具/rres 中間函式庫負責管理該資料額外的資料。建議僅將其附加到資源資料中並在packedSize 上考慮。 |
flags | 保留附加標誌,以防實現需要它們。 |
packedSize | 定義rresResourceChunkData 的打包大小(壓縮/加密 + 附加使用者資料)。打包數據可以在壓縮/加密數據之後在末尾包含附加的用戶數據,例如加密數據的隨機數/MAC,但它與實現相關,由rres 打包工具和用戶庫管理以將塊數據加載到其中目標發動機結構。 |
baseSize | 定義rresResourceChunkData 的基本大小(未壓縮/未加密)。 |
nextOffset | 定義下一個相關資源區塊的全域檔案位置位址,這對於產生多個資源(如字體或網格)的輸入檔很有用。 |
reserved | 如果需要,此欄位保留供將來新增。 |
crc32 | 在完整的rresResourceData 區塊 ( packedSize ) 上計算,旨在偵測資料損壞錯誤。 |
表 02. rresResourceChunkInfo
欄位描述和詳細信息
rresResourceChunkData
rresResourceChunkData
包含以下資料:
Property Count
:包含的屬性數量,取決於資源type
Properties[]
:資源資料所需屬性,取決於資源type
Data
:資源原始數據,取決於資源type
注意: rresResourceChunkData 可能包含其他使用者數據,在這種情況下,必須在packedSize
中考慮其他資料大小。
rresResourceDataType
rresResourceChunkInfo
中指定的資源type
定義了資源區塊中包含的資料類型和屬性數量。
這裡是目前定義的資料類型。請注意,某些輸入檔案可能會產生多種類型的多個資源區塊。如果需要,可以新增其他資源類型。
// 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
由以下屬性和資料組成:
資源類型 | 四CC | 道具數量 | 道具 | 數據 |
---|---|---|---|---|
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] :文化代碼 | 文字數據 |
RRES_DATA_IMAGE | IMGE | 4 | props[0] :寬度props[1] :高度props[2] : rresPixelFormat props[3] :mipmap | 像素資料 |
RRES_DATA_WAVE | WAVE | 4 | props[0] :幀數props[1] :取樣率props[2] :樣本大小props[3] :通道 | 音訊樣本數據 |
RRES_DATA_VERTEX | VRTX | 4 | props[0] :頂點計數props[1] : rresVertexAttribute props[2] :組件計數props[3] : rresVertexFormat | 頂點數據 |
RRES_DATA_FONT_GLYPHS | FNTG | 4 | props[0] :baseSizeprops[1] :字形計數props[2] :glyphPaddingprops[3] : rresFontStyle | rresFontGlyphInfo[0..glyphCount] |
RRES_DATA_LINK | LINK | 1 | props[0] :大小 | 文件路徑數據 |
RRES_DATA_DIRECTORY | CDIR | 1 | props[0] :條目計數 | rresDirEntry[0..entryCount] |
表 03. rresResourceDataType
定義的值和詳細信息
注意: RRES_DATA_RAW
包含打包檔案副檔名作為其屬性的一部分, char
副檔名轉換為 4 位元組unsigned int
大端值,以點開頭。即".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
打包是在現有專案上完成的,或者在專案開發結束時完成的,如果所有檔案載入都是直接使用檔案名稱完成的,這在實作方面非常有用,可以最大限度地減少所需的程式碼更改。
將一些資源提取到類似的輸入檔中。僅當輸入檔未被以破壞性方式處理時才有可能。例如,如果 .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 ;
注意:中央目錄檔案名稱條目與 4 位元組填充對齊,以縮短檔案存取時間。
rres.h
提供了一個從rres
檔案載入Central Directory
如果可用)的函數: rresLoadCentralDirectory()
以及一個從原始檔案名稱取得資源識別碼的函數: rresGetIdFromFileName()
。
如果產生的rres
檔案沒有Central Directory
,則應提供輔助頭檔 ( .h
),其中包含所有資源的 id 引用,以便在使用者程式碼中使用。
rres
被設計為與引擎無關的檔案格式,可以與任何遊戲引擎一起使用。採用rres
的開發人員可以實作自訂函式庫和自訂抽象,以將rres
通用資料對應到自己的引擎資料結構以及自訂rres
打包工具。
下圖顯示了raylib
函式庫的rres
實作範例。
圖 02.rres 範例實作:自訂引擎庫和工具。
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 ;
可以使用提供的函數rresLoadResourceChunk()
從.rres
檔案載入單一rresResourceChunk
,並使用rresUnloadResourceChunk()
卸載。
可以使用提供的函數rresLoadResourceMulti()
從.rres
檔案載入完整的rresResourceMulti
,並使用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)