2013-03-30 4 views
1

그래픽에서 OBJ 및 COLLADA와 같은보다 일반적인 텍스트 기반 형식이 필요하지 않도록 3D 에셋의 저장을 위해 사용자 지정 바이너리 파일 형식을 만드는 방법에 대한 이야기가 많이 있습니다. 런타임에 파싱해야합니다. 말이된다.바이너리로 저장하기 위해 데이터를 C 헤더로 변환

그러나이 간단한 파일의 실제 작성은 직렬화 또는 다른 방법 (일부는 C++에서 처리하지 못했을 수도 있음)을 포함하기 때문에 간단하지는 않습니다. 가장 최근의 변형을 제외하고는.

그러나 이러한 텍스트 기반 형식 중 하나를 C 스타일 헤더로 구문 분석하면 데이터가 float 또는 struct 선언으로 간단하게 구문 분석되는데이 데이터는 다음과 같이 이진 형식으로 컴파일됩니다. 나머지 앱. 즉, 구문 분석은 앱 외부에서, 스크립트에 의해 수행되며, 변환 단위가 헤더를 포함하므로 컴파일시 바이너리로의 변환이 처리됩니다.

제 생각이 맞고 실제로 이진 파일 형식을 만들고 그 경로로가는 것과 어떻게 비교할 수 있습니까?

답변

2

귀하의 생각은 정확합니다. 텍스트 표현을 바이너리로 변환 할 때 컴파일러의 도움을받을 수 있습니다. 오히려 헤더를 사용하는 것보다, 나는 별도의 변환 장치에 데이터를 입력하고 스크립트에 의해 채워 데이터 구조의 앞으로 선언에 고정 된 헤더를 유지하는 것입니다 :

헤더 :

// This is fixed 
extern float data_array[]; 
extern size_t data_array_cnt; 

CPP 파일 :

// This gets generated by a script 
float data_array[] = {1.2, 3.4, 5.6, 7.89 }; 
size_t data_array_cnt = sizeof(data_array)/sizeof(float); 

두 가지 방법 사이의 가장 큰 차이점은 파일의 바이너리 표현을 유지하는 것은 당신이 모든 것을 컴파일 후 을 표현대로 수정할 수 있다는 것입니다. 사실, 제작 과정에서 다른 바이너리로 바꿀 수 있으며 즉시 적용됩니다. 반대로 컴파일러 경로를 사용하면 바이너리 데이터를 변경해야 할 때마다 프로그램을 다시 컴파일해야합니다. 효과적으로 바이너리 데이터가 프로그램 내용에 "구워집니다".

동적 연결을 지원하는 환경에서는 별도의 동적 링크 라이브러리에서 이진 데이터를 분리하고 "기본"코드와 별도로 해당 라이브러리를 컴파일하여 중간 솔루션을 만들 수 있습니다. 이진 데이터는 코드의 일부로 남아 있지만 이제는 나머지 프로그램과 독립적으로 새로운 데이터 조각으로 바꿀 수 있습니다.

+0

다음과 같은 내용을 명확히 할 수 있습니까? "일반 C/C++ 파일을 사용합니다 (머리글은 고정되어 있으며 컴파일하기 전에 스크립트에 의해 채워진 데이터 구조의 전달 선언과 함께 사용됩니다)." C 헤더는 사실 C 파일입니다. 그렇지 않습니까?아니면 헤더 파일이 아닌 번역 단위로 데이터를 넣으라고 말하는 것입니까? 헤더 파일이 "고정"상태라는 것은 무엇을 의미합니까? – johnbakers

+0

@SebbyJohanns 기술적으로 "번역 단위"에 이미 헤더가 포함되어 있으므로 용어를 오해했을 것입니다. 그가 말한 것은 재 컴파일 의존성을 줄이거 나 소스 파일을 외부 동적 라이브러리로 외부화하기 위해 헤더가 아닌 소스 파일에 데이터를 넣을 수 있다는 것입니다. – TC1

+0

@SebbyJohanns 간단한 예를 들어 편집을 살펴보십시오. – dasblinkenlight

0

컴파일 시간 등을 제외하고, 가장 큰 이유는 가장 큰 이유입니다. 가장 큰 이유는 외부 파일이며 스왑 가능 파일이기 때문입니다. 이 헤더 형식으로 모든 종류의 DLC를 만드는 것은 거의 불가능합니다.

당신의 방법은 리소스가 변경 될 때마다 관련 프로젝트 부분의 재 컴파일을 강제하는 반면, 외부화는 분석을 런타임으로 이동시킵니다. 아티스트는 모델, 텍스처 및 기타 모든 작업을 수행 할 수 있지만 개발자는 서로의 방식대로 작업하지 않고 코드를 작업합니다.

+0

"DLC"란 무엇입니까? – johnbakers

+0

@SebbyJohanns [다운로드 가능한 콘텐츠] (http://en.wikipedia.org/wiki/Downloadable_content). dasblinkenlight가 이미 말했듯이, 기술적으로 당신은 그것들을 모두 역동적 인 lib로 링크시킬 수 있지만, 여전히 엄청나게 고통 스럽습니다. – TC1

+0

"DLC"가 실제로 무엇을 의미했는지 궁금했지만 그 의미를 알아 냈습니다. – johnbakers

관련 문제