게임의 모든 이미지를 1 개의 파일에 어떻게 넣을 수 있습니까?


67

방금 C ++ SFML로 작성된 기본 RPG 게임을 마쳤습니다. 게임에 많은 노력을 기울였으며 배포하고 싶지만 작은 문제가 발생했습니다.

문제는 200 개가 넘는 이미지와 맵 파일 (맵 코드를 저장하는 .txt 파일)이 실행 파일과 동일한 폴더에 있으며 폴더를 볼 때 조금만 울고 싶다는 것입니다. 리소스가 너무 많아서 모든 리소스를 직접 보여주는 게임을 본 적이 없습니다. 대신 리소스가 특정 파일에 압축되어 있다고 생각합니다.

글쎄, 그것이 달성하려는 것입니다. 모든 이미지를 1 파일 (.txt 파일 일 수도 있음)로 압축 한 다음 해당 파일에서 읽거나 쉽게 추가 할 수 있기를 바랍니다.



모든 이미지가 코드의 문자열로 묶인 코드를 보았습니다. 그러나 그것은 요구 사항으로 인해 이루어졌습니다. (64KB Java 경쟁이었습니다)
Omar Kooheji

죄송합니다. 4Kb Java 경쟁입니다. 64Kb가 아닙니다.
Omar Kooheji

답변:


62

게임 프로그래머는 두 가지 주요 데이터 저장 방법 중 하나에 의존했습니다.

  • 각 데이터 파일을 별도의 파일로 저장
  • 각 데이터 파일을 사용자 정의 아카이브 형식으로 저장

첫 번째 해결책의 단점은 낭비되는 디스크 공간 문제와 느린 설치 문제입니다.

두 번째 솔루션은 자신의 함정을 제공합니다. 먼저 자신의 이미지 / 사운드 등을 모두 작성해야합니다. 아카이브 된 데이터에 액세스하기 위해 사용자 정의 API를 사용하는로드 루틴. 추가 단점은 먼저 아카이브를 빌드하기 위해 자체 아카이브 유틸리티를 작성해야한다는 것입니다.

아카이브에서 모든 파일을 항상로드하지 않는 한 TAR / GZ는 특정 파일을 필요할 때 추출 할 수 없기 때문에 좋은 생각이 아닙니다. 이것이 많은 게임이 ZIP 아카이브를 사용하는 이유입니다. 필요에 따라 개별 파일을 추출 할 수 있습니다 (PK3 파일은 확장자가 다른 ZIP 파일에 지나지 않는 Quake 3입니다).

편집 : 게임 폴더 구조 "숨기기"및 실행 파일 만 "보존"

폴더 구조에서 게임 파일을 "숨기기"위해 다른 솔루션이 종종 사용됩니다. 실행 파일과 readme 파일 만 기본 디렉토리에 보관하고 게임 파일을 "data"또는 기타 관련 하위 폴더로 이동하십시오.

편집 : Gamedev Tuts Plus는 좋은 자료를 가지고 있습니다

편집 : libarchive

ZIP 파일과 같은 아카이브에서 파일 추출을 처리하는 아카이브 라이브러리 인 하나의 잠재적 솔루션 libarchive. 또한 추출 된 파일을 표준 FILE 포인터에 할당하여 다른 라이브러리와의 인터페이스를보다 간단하게 만들 수 있습니다.

편집 : 대체 확장자를 가진 ZIP 형식 파일

나는 여기 @Joachim Sauer의 코멘트를 좋아한다

다른 확장자가 ZIP 형식의 파일을 사용하여뿐만 아니라 게임 이외의 좋은 전통이있다 : 자바는 그것을 수행오픈 도큐먼트 포맷 (오픈 오피스 / LibreOffice와 형식 일명)을 수행 , 심지어 ( "새로운"마이크로 소프트 오피스 포맷 일명) 오피스 오픈 XML 그렇습니다 .


2
예, Thief / SystemShock2는 다른 이름을 가진 .zip 파일을 사용했습니다. Java에서는 폴더의 파일 인 것처럼 Zip의 파일에 액세스하기 위해 TrueZip과 같은 것을 사용할 수 있습니다 .C ++ 용 라이브러리가 비슷하다고 생각합니다.
Nick


5
@Svish. 플랫폼에 따라 작은 파일이 많이 차지하는 디스크 공간은 큰 파일이 전혀 압축되지 않은 경우에도 하나의 큰 파일이 차지하는 용량보다 훨씬 클 수 있습니다 ( .tar예 :). 데이터가 디스크에 실제로 저장되는 방식과 관련이 있습니다.
TRiG September

1
아, 맞아 많지 않은 한 많이 있지만,이 경우 실제로 쌓일 수 있습니다. 설치 및 제거가 많은 작은 파일로 인해 인기가 있다고 상상할 수 있습니다.
Svish

2
Kylotan의 의견과 약간 관련이 있는 , 여기에는 아카이브 사용 및 Steam의 패치 메커니즘과의 상호 작용에 대한 The Witness의 dev-blog에 대한 Jonathan Blow 의 게시물 이 있습니다. "증인은 대부분의 데이터를 .zip 형식으로 저장된 단일 2 기가 바이트 파일로 압축합니다. 초기 버전을 Steam에 업로드하기 전에 패치 크기를 최소화하기 위해 안전 조치를 취 했으므로 [...] 파일은 무작위 순서로 저장됩니다. 아마도 모든 패치에는 모든 플레이어가 전체 게임을 다시 다운로드해야합니다!) "
Eric

39

게임 파일을 "숨기기"위해 자주 사용되는 또 다른 솔루션은 폴더 구조입니다. 메인 디렉토리에 실행 파일과 readme 만 유지하고 게임 파일을 하위 폴더 "data"로 이동하십시오. 나는 그렇게 드물게 생각하지 않습니다. 내가 아는 많은 게임들은 그러한 방식으로 그들의 콘텐츠를 저장합니다.


8
+1 디스크 공간이나 보호에 문제가 없다면 가장 쉬운 방법입니다.
Laurent Couvidou

1
다른 사람이 +1을 말했기 때문에 +1 틀릴 수 없어? (농담, 좋은 답변입니다.)
jcora

제 생각에는 이것이 이상적인 선택입니다. 파일 시스템이 효율적으로 처리 할 수 ​​없으면 파일 시스템이 손상되어 OS 제조업체가 파일 시스템을 개선해야합니다.
Omnifarious

3
@Omnifarious 항상 완벽한 것은 아닙니다. 예를 들어, 완벽한 파일 시스템을 사용하더라도 광 디스크에서 읽을 때 과도한 탐색을 방지하기 위해로드 순서대로 파일을 압축하는 것이 일반적입니다 (속도는 실제로 놀랍습니다). 그러나 이것은 하드 디스크와는 완전히 다른 이야기이며 OP는이 경우라고 생각하는 경향이 있습니다.
Laurent Couvidou

3
@ Mr.Beast 당신은 내 요점을 놓쳤다. 나는 광 디스크에 대해 이야기하고 있습니다. 필자는 최고의 프로그래머가 풀 타임 작업을하는 스튜디오에서 일하면서 DVD에 파일을 가능한 한 효율적으로 압축하여 최상의 로딩 시간을 갖도록했습니다. 나는 그가 DVD 파일 시스템에 의존했을 수 있다는 것을 알게되어 기쁘다;)
Laurent Couvidou

22

나는 이것을 위해 PhysFS 를 정말로 좋아 합니다. 동일한 코드를 사용하여 폴더 또는 zip 아카이브에 액세스 할 수 있습니다. 게임 평생의 모든 단계에서 잘 작동합니다.

  1. 개발 중 : 폴더 계층에서 직접 리소스에 액세스합니다. 이러한 방식으로 압축 된 아카이브가 방해가되지 않으며 빠르게 반복 할 수 있습니다.
  2. 초기 배포 : 쉬운 배포 / 빠른 설치를 위해 리소스를 압축합니다. 코드를 변경할 필요가 없습니다. 폴더 대신 Zip을 PhysFS로 지정하십시오.
  3. 업데이트 / 모딩 : PhysFS는 하나의 리소스가 다른 리소스를 재정의하는 여러 개의 zip 아카이브를로드 할 수 있습니다. 변경된 파일 만있는 새 zip처럼 간단하게 업데이트 할 수 있습니다. 모딩과 유사합니다.

최신 정보:

소스와 doxygen 문서 에 포함 된 자습서를 사용하여 PhysFS를 배웠습니다. API는 실제로 매우 간단합니다. 파일 경로 대신 메모리 버퍼를 통해 SFML에 이미지를로드하는 방법을 배우는 데 더 많은 시간을 할애합니다.


4
현재 프로젝트에 PhysFS를 사용하고 있으며 좋아합니다. 콘텐츠 보관 파일을 항상 재생성 할 필요는 없습니다. 검색 경로와 BAM에 업데이트 된 버전을 드롭 할 수 있습니다! 효과가있다.
잭 인간

몇 가지 대답을 한 후 physFS를 사용하기로 결정했습니다. 좋은 튜토리얼을 추천 하시겠습니까? :)
Bugster


3

글쎄, 당신은 그들이 언급 한 것처럼 속일 수 있습니다 :) 당신은 이미지에서 스프라이트 시트를 만들 수 있습니다, 그것은 공간을 많이 절약하지 않으면 요즘 압축 할 필요가 없습니다. 이미지에서 스프라이트 시트 또는 여러 스프라이트 시트를 만든 후에는 단순히 확장명을 바꿀 수 있습니다. 대부분의 게이머는 확인을 귀찮게하지 않으며 앞으로 게임을 수정하고 싶은 아티스트에게이 옵션을 남겨 두지 않겠습니까? 그렇게하면 스프라이트 시트를 만들고 확장명을 바꾸고 롤링을 시작할 수 있습니다.

텍스트 파일을 사용하면 해당 데이터를 이진 형식으로 변환하는 것이 좋습니다. 예를 들어 AZ, az 및 0-9 만 사용하는 경우 각 문자를 나타내는 데 6 비트를 사용하여 저작권이있는 자료를 보호 할 수 있습니다. 다른 사람이지도를 편집하지 못하게합니다. 원하는 경우 언제든지지도 변환기를 추가 할 수 있습니다. 압축은 텍스트에 완전히 합리적입니다.


바이너리로 변환하는 것은 좋은 조언이지만 보호를위한 것은 아닙니다. 구문 분석이 쉽고로드가 더 빠릅니다. 전처리 단계로 제안하지만 질문에 대해서는 주제가 맞지 않습니다.
Maximus Minimus

글쎄, 더 효과적으로 보호하려면 RSA 또는 유사한 알고리즘으로 암호화하려고 시도 할 수 있습니다 (필요 없음). 이진 파일 안에 있으면 인디 게임에서 맵 파일을 무단으로 사용하지 않을 것입니다. 파싱을 계산하는 데 시간을 투자 할 가치가없는 것 같습니다. 텍스트 파일은 완전히 취약하며 데이터 저장에 효과적이지 않은 것을 제안했습니다.
wolfdawn

3
HDD에서는 물리적 디스크에 대한 임의 검색 비용이 적기 때문에 단일 zip 파일을로드하는 것이 많은 작은 파일보다 빠릅니다. 작은 게임을위한 바이너리는 메모리에 매핑 될 수 있고 "마 법적으로"작동 할 수 있으며 거의 ​​구문 분석이 필요하지 않습니다.
Liosan

@Liosan 내가 의미하는 바를 잘못 해석했거나 내가 잘못 이해했을 수있다. 바이너리는 데이터 저장에 더 좋고 다른 게임 디자이너는 바이너리 맵 코드를 구문 분석하는 방법을 배우고 싶지 않을 것입니다. 목적. 따라서 텍스트 파일에 대한 기본적인 보호 기능을 제공합니다.
wolfdawn

2

리소스 수나 디스크 공간에 관한 것이 아닙니다.
텍스처 파일을 렌더링 할 때마다 OpenGL로 렌더링하는 SFML을 사용할 때 다양한 텍스처 파일이있는 경우 OpenGL은 다음 텍스처를 비디오 카드에 바인딩해야합니다 (glBindTexture () 확인). 정말 비싼 작업입니다.
이를 염두에두고 게임의 메뉴 / 레벨 / 맵에 따라 게임이 여러 텍스처를 동일한 텍스처 (소위 스프라이트 시트)에 넣는 이유를 알 수 있습니다.
동일한 바인드 텍스처 호출로 많은 스프라이트를 렌더링하기 때문에 결과적으로 성능이 크게 향상됩니다.


스프라이트 시트를 만드는 것에 대한 몇 가지 참조를 얻은 후에 이미지 수를 줄이기 위해 리팩토링을 고려했습니다. 감사합니다
Bugster

2

나는 이것을 위해 커스텀 바이너리 파일 경로를 개인적으로 내릴 것이다. 이것은 내가 항상 항상하는 일이며, 들리는 것만 큼 어렵지 않으며 게임 리소스 파일에 난독 화 수준을 제공합니다. 나는 당신이 관심이 있다면 얼마 전에 이것에 관한 작은 입문 Gamedev 기사를 썼습니다.

http://gamedev.tutsplus.com/tutorials/implementation/create-custom-binary-file-formats-for-your-games-data/

스프라이트 시트는 완전히 다른 주제이지만 대부분의 게임에서 표준입니다. :)


1

사용할 수있는 다른 방법 :

XnView 의 무료 버전은 " Strip of Images"(SHIFT + A) 라는 기능을 제공합니다 sprite-collections.

이는 파일 액세스를 최소화하며 웹 응용 프로그램 / 게임에서 수를 최소화하는 데 특히 중요합니다 HTTP-roundtrips.

그런 다음 좌표 맵을 통해 개별 이미지에 대한 액세스 권한이 부여됩니다 (예 : css-definitions).


0

먼저 모든 이미지 / 사운드 등을 작성해야합니다. 아카이브 된 데이터에 액세스하기 위해 사용자 정의 API를 사용하는로드 루틴. 추가 단점은 먼저 아카이브를 빌드하기 위해 자체 아카이브 유틸리티를 작성해야한다는 것입니다. 아카이브에서 모든 파일을 항상로드하지 않는 한 TAR / GZ는 특정 파일을 필요할 때 추출 할 수 없기 때문에 좋은 생각이 아닙니다. 이것이 많은 게임이 ZIP 아카이브를 사용하는 이유입니다. 필요에 따라 개별 파일을 추출 할 수 있습니다 (PK3 파일은 확장자가 다른 ZIP 파일 뿐인 Quake 3입니다). http://zpp-library.sourceforge.net/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.