rres는 리소스를 패키징하는 간단하고 사용하기 쉬운 파일 형식입니다.
rres
는 게임 자산(이미지, 글꼴, 텍스트, 오디오, 모델...)을 간단하고 독립적인 포괄적인 형식으로 패키징하고 읽고 쓰기 쉽고 빠르고 효율적인 방식으로 데이터를 로드하도록 설계되었습니다.
rres
XNB(XNA/MonoGame에서 사용), RIFF, PNG 및 ZIP 파일 형식에서 영감을 받았습니다.
rresFileHeader
rresResourceChunk
rresResourceChunkInfo
rresResourceChunkData
rresResourceDataType
rresCentralDir
단순성 : rres
구조는 간단합니다. 하나의 파일 헤더와 여러 리소스가 차례로 사용됩니다. 그러나 모든 리소스에는 여러 옵션을 사용할 수 있는 작은(32바이트) 리소스 정보 헤더가 있습니다.
사용 편의성 : .rres
파일을 읽는 rres
라이브러리는 ID에서 리소스 데이터를 읽는 데 필요한 최소한의 기능만으로 작습니다. 표준 C 라이브러리의 작은 함수 세트만 사용합니다. .rres
파일을 쉽게 생성하고 볼 수 있도록 GUI/CLI가 포함된 rrespacker
도구가 제공됩니다.
유연성 : rres
형식은 모든 종류의 입력 파일을 지원하며, 데이터가 기본 데이터 유형으로 분류되지 않은 경우 원시 파일 데이터로 압축할 수 있습니다.
이식성 : rres
파일 형식은 특정 엔진에 묶여 있지 않으며 기본 라이브러리는 리소스 데이터를 압축된 형태로 읽고 해당 데이터를 모든 엔진 구조에 매핑할 수 있습니다. rres 데이터를 raylib 구조에 매핑하는 보조 라이브러리 rres-raylib.h
와 함께 사용 예제가 제공되었습니다.
보안 : rres
필요한 경우 리소스별 압축 및 암호화를 지원합니다. 그러나 파일 형식이 제공하는 지원에도 불구하고 이를 rres
패커 도구 및 엔진 매핑 라이브러리에서 구현하는 것은 사용자의 몫입니다. rres
설계상 특정 압축/암호화 알고리즘을 강제하지 않습니다.
확장성 : rres
파일 형식은 확장 가능하며 필요한 경우 새로운 데이터 유형, 새로운 기능 및 사용자 정의 데이터를 지원합니다.
무료 오픈 소스 : rres
는 오픈 사양이자 무료 오픈 소스 라이브러리입니다. 제공된 도구( rrespacker
)와 함께 사용하거나 모든 엔진 에 대해 사용자 정의 패커/로더를 구현할 수 있습니다. 형식 설명은 자체 데이터 패키징 파일 형식을 만들려는 사람을 위한 학습 자료로도 사용할 수 있습니다.
게임 자산 데이터를 rres
와 같은 형식으로 패키징하는 데에는 몇 가지 중요한 이유가 있으며, 여기에는 그렇게 해야 하는 몇 가지 좋은 이유가 있습니다.
조직 : 최종 게임 빌드에서 수천 개의 파일이 수백 개의 디렉터리에 분산되는 것을 방지합니다. 모든 게임 파일 데이터는 하나 또는 몇 개의 .rres
파일로 구성될 수 있습니다. 게임 디렉토리를 깨끗하고 체계적으로 유지합니다.
성능 : 레벨/맵에 필요한 모든 파일을 단일 .rres
파일로 유지하면 여러 파일에 액세스하기 위한 파일 핸들의 필요성이 줄어듭니다. 파일 핸들은 OS 리소스이며 파일을 여는 데 드는 비용이 적지 않으며 게임이 지연될 수 있습니다. .rres
파일 내부의 데이터 액세스 시간도 중요하며 파일 구성 방식에 따라 로딩 시간도 향상될 수 있습니다.
보안 : 쉬운 복사 또는 수정을 위해 모든 게임 자산을 사용자에게 직접 노출하지 마십시오. .rres
파일에 압축된 데이터는 대부분의 사용자에게 추출 및 수정이 더 어렵습니다. 게임 저작권 자산을 보호하세요. rres
또한 리소스별 데이터 압축 및 암호화를 지원하여 필요할 때 추가 보안 수준을 추가합니다.
다운로드 시간 : 서버에서 데이터에 액세스하여 다운로드해야 하는 경우 자산을 하나 또는 몇 개의 .rres
파일로 압축하면 각 파일을 개별적으로 다운로드하는 것보다 다운로드 시간이 향상됩니다.
rres
2014년부터 개발 중입니다. 저는 raylib용 XNB와 유사한 패키징 파일 형식을 만드는 것을 목표로 이 프로젝트를 시작했습니다. 지난 8년 동안 이 프로젝트는 파일 형식 학습 프로세스에 따라 여러 번의 재설계와 개선을 겪었습니다. 그 당시 나는 +20개의 다양한 파일 형식 에 대한 로더/라이터를 구현했으며 여러 raylibtech 사용자 정의 도구에 대한 +12개의 사용자 정의 파일 형식 도 만들었습니다.
rres
파일 형식은 최소한 4번의 대대적인 재설계를 거쳤습니다.
형식의 첫 번째 설계는 하나의 리소스를 차례로 패키징하는 것으로 제한되었으며 모든 리소스는 하나의 리소스 정보 헤더와 그 뒤에 가능한 4개의 고정 매개변수 집합 및 리소스 데이터로 구성되었습니다. .rres
파일과 함께 리소스 파일 이름(일반적으로 처리되지 않은 데이터의 원래 파일 이름)으로 rresId
를 정의하는 매핑이 생성된 .h
헤더 파일이 생성되었습니다. 이 모델은 매우 간단하고 직관적이었지만 몇 가지 중요한 단점이 있었습니다. 여러 청크가 필요할 수 있는 복잡한 데이터 조각을 고려하지 않았고 원본 소스 파일(또는 유사한 파일)을 추출/검색할 방법이 없었습니다.
두 번째 디자인은 훨씬 더 복잡했고 첫 번째 디자인의 단점을 해결하려고 노력했습니다. 두 번째 디자인에서는 모든 리소스가 일종의 트리 구조에 여러 데이터 덩어리를 포함할 수 있습니다. 실제로 그 디자인은 RIFF 파일 형식과 유사했습니다. 모든 청크에는 헤더와 데이터가 포함된 추가 청크가 포함될 수 있었습니다. 일부 추가 리소스 옵션도 추가되었지만 형식을 이해하고 관리하기가 상당히 복잡해졌습니다. 마지막으로 테스트 구현을 폐기하고 더 간단한 대안을 조사했습니다.
세 번째 디자인은 첫 번째 디자인으로의 복귀였습니다. 단순하지만 개별 리소스에 대한 일부 옵션을 유지했습니다. 단일 입력 파일에서 생성된 여러 리소스 문제는 필요할 때 다음 연결된 리소스를 가리키는 리소스 정보 헤더 의 간단한 오프셋 필드를 사용하여 해결되었습니다. 리소스는 리소스 청크의 배열로 로드되었습니다. 입력 파일에 대한 참조를 유지하기 위해 선택적 중앙 디렉터리 리소스 청크가 추가되었습니다. 형식은 좋았지만 여전히 구현과 추가 조사가 필요했고, 엔진에 구애받지 않아야 했으며 여전히 raylib 구조와 기능에 의존했습니다.
구현 과정에서 네 번째 디자인이 완료되었으며 일관성과 단순성을 위해 거의 모든 구조와 필드가 검토되고 이름이 변경되었습니다. 로드된 리소스 데이터를 사용자 정의 라이브러리/엔진 데이터 유형에 매핑하기 위해 별도의 라이브러리( rres-raylib.h
)가 생성되었으며, raylib에 대한 모든 종속성이 제거되어 완전히 엔진에 구애받지 않는 파일 형식이 되었습니다. rres
의 라이브러리-엔진 연결을 설명하기 위해 raylib에 대한 여러 사용 예가 구현되었으며 여러 유형의 리소스 로딩이 구현되었습니다. rrespacker
도구는 rres
파일을 생성하기 위해 처음부터 만들어졌으며 끌어서 놓기를 지원하는 멋진 GUI 인터페이스뿐만 아니라 일괄 처리를 위한 강력한 명령줄도 지원합니다. 압축 및 암호화 구현은 패키징 도구와 정렬되고 rres
파일 형식을 더욱 깔끔하고 단순하게 유지하기 위해 사용자 라이브러리 구현으로 이동되었습니다.
8년에 걸친 프로젝트 였으며 계속해서 작업하고 많은 재설계와 수정을 거쳤지만 개인적으로 최종 결과에 매우 만족합니다. rres
는 모든 전문 엔진 패키지 형식 수준의 리소스 패키징 파일 형식 이지만 무료 및 오픈 소스이며 이를 사용하거나 구현하거나 사용자 정의 버전을 생성하려는 모든 게임 개발자가 사용할 수 있습니다.
rres 파일 형식은 파일 헤더( rresFileHeader
)와 그 뒤에 오는 여러 리소스 청크( rresResourceChunk
)로 구성됩니다. 모든 리소스 청크에는 FOURCC
데이터 유형 코드와 리소스 데이터 정보를 포함하는 리소스 정보 헤더( rresResourceChunkInfo
)가 있습니다. 리소스 데이터( 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 4개 문자여야 합니다. |
version | 형식의 버전과 하위 버전을 정의합니다. |
chunkCount | 파일에 존재하는 리소스 청크 수입니다. 처리된 입력 파일 수보다 클 수 있습니다. |
cdOffset | 파일 내의 중앙 디렉터리 절대 오프셋. CDIR 은 또 다른 리소스 청크 유형일 뿐이며 중앙 디렉터리는 파일에 있을 수도 있고 없을 수도 있습니다 . 사용자 정의 rres 패커가 구현된 경우 파일의 마지막 청크로 배치하는 것이 좋습니다. 자세한 내용은 rresCentralDir 섹션을 확인하세요. |
reserved | 이 필드는 필요한 경우 향후 추가를 위해 예약되어 있습니다. |
표 01. rresFileHeader
필드 설명 및 세부 정보
고려사항:
rres
파일은 설계상 최대 65535개의 리소스 청크 로 제한됩니다. 더 많은 리소스를 압축해야 하는 경우 여러 개의 rres
파일을 만드는 것이 좋습니다.rres
파일은 32비트 오프셋을 사용하여 다양한 리소스 청크를 처리하므로 최대 4GB의 데이터를 처리할 수 있습니다 . rres
파일을 4GB 보다 작게 유지하십시오. 리소스를 패키징하는 데 더 많은 공간이 필요한 경우 rres
파일을 여러 개 만듭니다. rresResourceChunk
rres
파일에는 여러 개의 리소스 청크가 포함되어 있습니다. 모든 리소스 청크는 자체 포함된 데이터 팩을 나타냅니다. 리소스 청크는 rres
패커 도구로 rres
파일 생성 시 입력 파일에서 생성됩니다. 파일 확장자에 따라 rres
패커 도구는 파일에서 필요한 데이터를 추출하고 하나 이상의 리소스 청크를 생성합니다. 예를 들어 이미지 파일의 경우 이미지의 픽셀 데이터와 리소스 파일에서 해당 데이터를 다시 읽는 데 필요한 속성만 포함하는 RRES_DATA_IMAGE
type
의 리소스 청크가 생성됩니다.
rres
파일이 생성될 때 하나의 입력 파일이 여러 리소스 청크를 생성할 수 있다는 점에 유의하는 것이 중요합니다. 예를 들어, .ttf
입력 파일은 RRES_DATA_IMAGE
리소스 청크와 RRES_DATA_FONT_GLYPHS
리소스 청크를 생성할 수 있습니다. 파일을 일반 RRES_DATA_RAW
리소스 청크 유형으로 압축하는 것도 가능합니다. 이 경우 입력 파일은 처리되지 않고 원시 데이터로만 압축됩니다.
rres
생성 시 rres
패커는 처리된 입력 파일에 대한 데이터를 포함하는 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 에 포함된 리소스 데이터의 유형을 식별합니다. 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 패커 도구/rres 중간 라이브러리가 이를 관리할 책임이 있습니다. 추가 데이터. 리소스 데이터에 추가하고 packedSize 에서 고려하는 것이 좋습니다. |
flags | 구현에 필요한 경우 추가 플래그용으로 예약되어 있습니다. |
packedSize | rresResourceChunkData 의 압축된 크기(압축/암호화 + 추가 사용자 데이터)를 정의합니다. 패키지된 데이터에는 압축/암호화된 데이터 뒤에 추가된 사용자 데이터가 포함될 수 있습니다(예: 암호화된 데이터에 대한 nonce/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] :cultureCode | 텍스트 데이터 |
RRES_DATA_IMAGE | IMGE | 4 | props[0] :너비props[1] :높이props[2] : rresPixelFormat props[3] :밉맵 | 픽셀 데이터 |
RRES_DATA_WAVE | WAVE | 4 | props[0] :프레임수props[1] :sampleRateprops[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] :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
확장자는 점으로 시작하는 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
패키징이 수행되거나 프로젝트 개발이 끝날 때 모든 파일 로딩이 파일 이름을 직접 사용하여 수행된 경우 필요한 코드 변경을 최소화하기 위한 구현 측면에서 매우 유용합니다.
일부 리소스를 유사한 입력 파일로 추출합니다. 입력 파일이 파괴적인 방식으로 처리되지 않은 경우에만 가능합니다. 예를 들어, 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 ;
참고: 중앙 디렉터리 파일 이름 항목은 파일 액세스 시간을 향상시키기 위해 4바이트 패딩으로 정렬됩니다.
rres.h
사용 가능한 경우 rres
파일에서 Central Directory
로드하는 기능인 rresLoadCentralDirectory()
와 원래 파일 이름에서 리소스 식별자를 가져오는 기능인 rresGetIdFromFileName()
을 제공합니다.
Central Directory
없이 rres
파일이 생성된 경우 사용자 코드에서 사용할 모든 리소스에 대한 ID 참조와 함께 보조 헤더 파일( .h
)을 제공해야 합니다.
rres
는 모든 게임 엔진에서 사용할 수 있는 엔진 독립적인 파일 형식 으로 설계되었습니다. rres
채택한 개발자는 사용자 정의 라이브러리와 사용자 정의 추상화를 구현하여 rres
일반 데이터를 자체 엔진 데이터 구조 및 사용자 정의 rres
패키징 도구 에 매핑할 수 있습니다.
다음 다이어그램은 raylib
라이브러리에 대한 rres
의 샘플 구현을 보여줍니다.
그림 02. rres 샘플 구현: 사용자 정의 엔진 라이브러리 및 도구.
rres
구현은 여러 부분으로 구성됩니다.
rres.h
rres-raylib.h
rrespacker
rres.h
기본 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
제공된 함수인 rresLoadResourceChunk()
를 사용하여 .rres
파일에서 로드할 수 있으며 rresUnloadResourceChunk()
를 사용하여 언로드할 수 있습니다.
전체 rresResourceMulti
제공된 함수인 rresLoadResourceMulti()
를 사용하여 .rres
파일에서 로드할 수 있으며 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 Ramon Santamaria (@raysan5)