문제

그래서 나는 나만의 작은 3D 게임을 만들려고 노력하고 있습니다.지금은 C#을 배우기 위해 이 일을 하고 있습니다.텍스처/스크립트와 같은 자산을 패키징하는 가장 좋은 방법은 무엇인지 궁금합니다.

일반적으로 내가 생각한 것은 다음과 같습니다.

[header]
[number of records]
[Offset to Record 1 from End of header]
[Offset to Record 2 from end of Record 1]
.
.
[Offset to record N from Record N-1]
[record 1]
[256 bytes represent the filename]
[32 byte size]
[binary data]
[record 2]
.
.

지금은 간단한 사진과 텍스트 파일을 저장하고 싶습니다.나는 주변을 둘러보았고 내가 실제로 발견한 가장 좋은 것은 둠 뭉치가 어떻게 저장되는지에 대한 오래된 예였습니다.

누구든지 경험이 있습니까?

도움이 되었습니까?

해결책

괜찮아.모든 것을 가상 메모리에 로드하고 스왑을 통해 처리할 수 있다면 실제로는 어떤 형식이든 사용할 수 있습니다.하나의 레코드에만 무작위로 액세스하려는 경우(예:압축되지 않은 memmap도 게으른 경우에도 느리게 로드할 수 있습니다. 그렇다면 아마도 인덱스를 메모리에 유지하고 싶을 것입니다.

대부분의 사람들은 마치 파일 시스템의 일부인 것처럼 .zip, .jar, .pak(quake 형식) 또는 기타 유사한(압축 여부에 관계없이) 아카이브 형식에 대한 액세스를 제공하는 라이브러리를 사용합니다(즉, 레코드에 액세스함) 문자열 키로).이미 만들어진 라이브러리를 찾을 수 있다면 반드시 그쪽으로 갈 것입니다. 트루집 자바의 경우. 아파치 커먼즈 하나가 있지만 .NET과 통합하는 것이 얼마나 쉬운지 모르겠습니다(제가 믿는 큰 C 코드 기반입니다). ZipFS 메모리에 헤더만 보관하는 실제 .NET zip 파일 마운터인 것 같습니다.

또는 편의성이 약간 덜한 경우 다음을 사용할 수 있습니다. DotNetZip 곧장

다른 팁

자신의 스토리지 형식을 발명하는 데 시간을 낭비하지 마십시오.

.NET에는 SharpZiplib 또는 다른 무료 압축 라이브러리를 사용할 수 있습니다. 이를 통해 여러 파일을 하나의 아카이브에 포장하고 주문시 별도로 원하는 파일을 추출 할 수도 있습니다.

당신의 디자인은 나에게 좋아 보이지만, 당신이 32를 의미한다고 가정합니다. 비트 32가 아닌 크기 바이트!

나는 당신의 디자인이 모든 자산을 한 번에로드하고 싶은 상황에 가장 적합하다고 생각합니다. 왜냐하면 그것은 순차적 인 디자인이기 때문입니다. 한 번에 몇 가지 자산 만로드하려면 (각 게임 레벨이 자산의 하위 집합 만 사용하기 때문에) 각 자산을 읽어야하기 때문에 다소 효율적입니다. 당신이 원하는 그.

이 경우 더 인덱싱 된 디자인을 시도하고 싶을 수도 있습니다.

[HEADER]
[Miscellaneous header stuff]
[Offset to index from start of file]
[Number of entries in index]
[RECORD 1]
[Asset data]
[RECORD 2]
[Asset data]
.
.
[RECORD N]
[Asset data]
[INDEX]
[ID or filename of asset 1]
[Size of asset 1]
[Offset to asset 1 from start of file]
[Other asset 1 flags or whatever]
[ID or filename of asset 2]
[Size of asset 2]
[Offset to asset 2 from start of file]
[Other asset 2 flags or whatever]
.
.

이렇게하면 자산에 대한 무작위 액세스가 더 좋을 수 있습니다. 이제는 전체 파일 (메모리에 맞지 않을 수 있음)이 아닌 인덱스 (메모리에로드)를 검색해야하기 때문입니다. 당신이 공상을 원한다면 당신은 색인에 나무 나 해시 가능을 사용할 수 있습니다.

전면이 아닌 파일 끝에 인덱스를 넣는 이유는 모든 것을 재건 할 필요없이 팩 파일에 다른 자산을 더 쉽게 추가 할 수 있기 때문입니다. 그렇지 않으면 인덱스의 추가 항목이 모든 오프셋을 버릴 것입니다.


편집하다: 의견에 응답하기 위해 ...

내가 생각했던 것은 당신이 지수를 통해 자산에만 액세스 할 것이라는 것이 었습니다. 아마도 일반적인 사용 사례의 예가 도움이 될 것입니다.

"TankTexture.png"이라는 질감을 읽고 싶다고 가정 해 봅시다. 여기에 당신이 그것에 대해 생각하는 방법은 다음과 같습니다.

  1. 팩 파일을 엽니 다.
  2. 고정 크기 헤더에서 읽으십시오.
  3. 헤더에서 인덱스 오프셋 및 항목 수를 추출합니다.
  4. 색인의 시작을 찾으십시오.
  5. 인덱스를 배열로 읽으십시오 (고정 인덱스 항목 크기 시간 항목 수).
  6. "TankTexture.png"라는 자산에 대한 색인을 검색하십시오.
  7. 인덱스 항목에서 자산 상쇄 및 크기를 추출하십시오.
  8. 자산의 시작을 찾으십시오.
  9. 자산 크기에 의해 주어진 바이트 수를 읽으십시오.

물론 후속 자산의 경우 6-9 단계 만 필요합니다.

나는 그것이 내가 생각한 것을 설명하는 데 도움이되기를 바랍니다. 다른 질문이 있으면 알려주세요.

학습 목적으로 이것을하려면 WAD 형식은 시작하기에 좋은 장소입니다. 그러나 청크 파일 형식을 사용하여 제안합니다.
따라서 기본적으로 제안 된 형식 (예 : 헤더, TOC 등)을 따르지만 각 데이터 항목에 대해 어떤 유형의 데이터가 있는지 식별하는 청크 ID가 있습니다.
여기에는 많은 이점이 있습니다. 주로 이해하지 못하는 청크를 건너 뛰도록 코드를 설정하여 코드 형식에 따라 데이터 형식을 변경할 수 있습니다.이를 통해 도구 개발이 진행되는 동안 게임의 데이터에 대한 호환성을 거꾸로 유지할 수 있습니다.

TOC에 추가 32 비트 '플래그'항목을 사용하는 것이 좋습니다. 이는 비트 필드를 사용하여 압축 유형, 암호화 등과 같은 옵션을 활성화 할 수 있습니다.

도움이되기를 바랍니다

나는 당신의 형식이 좋은 선택이라고 말합니다. 이상적으로는 모든 자산을 한 번 읽기 위해 당기고 싶습니다. 예를 들어, 동일한 패키지에서 레벨 3에 대한 모든 데이터를 원할 경우, 원하는 방식으로 모든 레벨 데이터를 찾지 않고 읽을 수 있습니다. 하나 이상의 패키지에 단일 자산을 두는 것은 괜찮습니다. 자산이 이미로드 된 경우를 처리하고 건너 뛰면됩니다.

데이터를 분할하는 방법 데이터 간의 종속성 (즉, 스크립트에 특정 모델이 필요한 경우 동일한 패키지에 있어야 함)과 읽기를 얼마나 세분화 해야하는지 (예 : 모두 읽을 수 있습니까? 레벨 데이터는 한 번에가요? 그러면 적을 레벨 패키지에 넣을 수 있습니다. 그러나 세계에서 게임 스트림이 있으면 적을위한 별도의 패키지가 필요할 것입니다.)

실제로 데이터 종속성을 추적하는 것은 어려운 부분입니다. 빌드 시점에서 가져 오는 모든 데이터의 종속성을 알고 싶습니다. 실행 시간에 패키지에서 읽고 자산이 메모리에 표시되도록합니다. 또한 런타임에 종속성을 추적해야합니다. 시간을주는 시간에 내릴 수있는 안전한 것이 무엇인지 알아야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top