최근에 절차 세계를 만드는 방법에 대해 읽었지만 어떻게 저장합니까?
Terraria 또는 Minecraft와 같은 게임에서 사용자는 풍경을 자유롭게 수정할 수 있지만 시작 시드에서 해당 세계를 다시 만들 수는 없습니다. 절차 적이지만 수정 가능한 세계를 구하기 위해 어떤 기술이 사용됩니까?
답변
월드 생성에 사용한 시드와 수정 사항을 원자 “명령”또는 그 결과로 저장하십시오.
그런 다음 저장된 게임을로드 할 때 다음을 수행하십시오.
- 현재 방문중인 세계의 일부를 절차 적으로 생성합니다.
- 저장된 명령을 적용하거나 생성 된 요소를 저장된 요소로 덮어 씁니다.
업데이트 : 물론 리소스가 사용 가능한 경우 (마인 크래프트에서 볼 수있는 경우) 생성 된 세계를 일반 세계와 마찬가지로 저장할 수 있습니다. 이 경우, 이미 방문한 (세계에서 절차 적 생성은 거의 의미가 없을 것입니다) 타일별로 저장해야합니다. 이것은 더 많은 HDD 및 / 또는 데이터베이스 리소스를 소비하지만 게임을로드 할 때 CPU 전력이 덜 필요합니다.
답변
절차 적으로 생성 된 세계를 저장하는 것은 타일 맵 데이터를 저장하는 것과 같습니다.
세계가 다른 유형의 타일로 구성되어 있다고 가정하면 세계를 이진 형식으로 저장하려고 할 것입니다.
- 서로 다른 타일 유형의 총 수를 결정하십시오. (따라서 각 타일을 나타내려면 더 많거나 적은 비트가 필요합니다)
- 방문한 (수정 된) 세계의 너비와 높이를 정의하십시오.
- 맨 위 왼쪽 타일 (하늘 포함)에서 맨 아래 오른쪽 타일까지 타일별로 월드 타일을 나타냅니다.
- 공간을 절약하려면 DEFLATE 또는 유사한 알고리즘을 사용하여이 2 차원 배열 (1 차원으로 표시)을 압축하십시오. http://en.wikipedia.org/wiki/DEFLATE
- API에 적절한 파일 I / O를 사용하여 데이터를 디스크에 저장하십시오.
같은 방법으로 복셀 기반 맵도 저장할 수 있습니다.
정점 기반 맵 모델을 저장하는 것이 더 복잡합니다.
그 주제에 대해 자세히 설명해 주시겠습니까?
답변
Minecraft에 대해 세계는 복셀을 사용하므로 저장하기가 훨씬 쉽습니다.
http://www.minecraftwiki.net/wiki/Region_file_format
http://www.minecraftwiki.net/wiki/Level_Format
이미 말했듯이, 세계를 생성하는 데 사용되는 시드를 저장하고 세계가 만든 것 (큐브, 원자 등)에 저장 형식을 적용하십시오.
답변
월드에 메모리에 저장하기 위해 사용하는 데이터 구조는 디스크에서 쓰고 읽을 수있는 템플릿으로 사용될 수 있습니다. 디스크에서 사용할 수있는 데이터가없는 경우 게임의 절차 부분에서 이러한 데이터 구조를 처음 채 웁니다. 그런 다음 메모리에서 영역을 언로드 할 준비가되면 생성 또는 수정 된대로 디스크에 기록하십시오.
새 영역을 메모리에로드 할 준비가되면 먼저 생성되어 디스크에 저장되어 있는지 확인하십시오. 있는 경우 절차 생성 알고리즘 대신 디스크에서로드하십시오.
일반적으로 이것은 지형 덩어리로 수행됩니다. 각 청크를 자체 파일에 저장하거나 조회 테이블이있는 단일 파일의 데이터를 포함하는 더 복잡한 디스크 구조를 만들 수 있습니다. 데이터를 디스크에 저장하는 좋은 방법에 대한 다른 질문 이 있습니다 .