큰 타일 맵과 던전에서 영역을 '존재'


10

내 게임은 의사 무한대와 무작위로 생성되는 방식으로 Minecraft와 같은 맵을 가지고 있습니다. 그리고 큰. 사용자가 1000x1000 영역 (여기서는 2D)을 탐색했다고 가정하면 1,000,000 개의 타일입니다.

분명히 나는 ​​모든 것을 메모리에 저장할 수 없을 것입니다. 또한 10 타일 또는 반지름의 모든 것을 무시하고 싶지 않습니다. 모두 업데이트되지 않을 것입니다 (모든 NPC, 아마도 반응성 타일) 1382,12918과 같은 어색한 위치에서 작업해야합니다.

따라서 그것을 청크 나 영역 또는 64x64 타일로 나누려면 각 타일과 객체의 위치를 ​​다음과 같이 저장해야합니다.

청크 a, b. 위치 x, y

그러나 내지도에서 던전 등을 원한다면 어떻게해야합니까? 따라서 단일 타일은 40 층 던전으로 이어지며 각각 40x40의 면적을 갖습니다. 같은지도에 정확히 저장할 수는 없습니다.

그리고 메모리 측면이 있습니다. 메모리에 동시에 합리적으로 얼마나 많은 양을 저장할 수 있습니까? ID로 타일을 아주 쉽게 만들 수 있고 거기에 정상적인 2D 배열이 있습니다. 또는 타일 유형의 데이터 파일을 갖는 것보다 효과적인 솔루션이 있습니까? 따라서 64x64.의 경우 20K 또는 그 이상입니다. 가장 현실적인 업데이트를 위해 가능한 한 주변 환경을로드하고 싶습니다. 그러나 나는 메모리 호깅이되지 않고 어떤 종류의 한계에 도달 할 수 있는지 모르겠습니다.

답변:


9

"증명 된 문제가 아니라면 걱정하지 마십시오"라는 정서에 동의하지만, 초기에 생각할 가치가 있다고 생각합니다. 그렇습니다. '가까운'타일 만 업데이트하면됩니다. 그러나 게임 세계에서 효율적으로 아이템을 저장하고 처리하는 것은 성능상의 이유로 매우 중요합니다.

여기서 실제로 생각하는 것은 희소 데이터 세트입니다. 잠재적 인덱스가 크거나 무제한이지만 실제로는 작은 비율 만 사용됩니다. 중요한 점은 어떤 비율이 사용될 것인지 정확히 알지 못한다는 것입니다.

드문 데이터 세트 문제에 대한 표준 솔루션은 실제 데이터 스토리지에서 인덱스 / 주소를 분리하는 것입니다. 따라서 타일 개체가 비싸면 컴팩트 한 형태 (예 : 평면 배열)로 저장하십시오. 그러나 더 저렴한 객체를 통해 색인을 생성 할 수 있습니다. 가장 간단한 형태로, 이것은 좌표로 쉽게 색인을 생성 할 수있는 2D (또는 3D) 행렬 일 수 있지만 행렬의 각 항목은 단순히 색인입니다. 그런 다음 해당 색인을 사용하여 실제 타일 내용을 별도의 컴팩트 한 배열로 찾습니다. 타일 ​​내용이 아직 없으면 배열 끝에 추가하고 3D 행렬에 색인을 저장하십시오.

내용 삭제를 지원하려는 경우 (내용 배열의 조각화로 이어짐) 타일 내용이 저렴한 경우 색인의 추가 가중치 (32 비트 또는 64 비트 색인)가 더 복잡해집니다. 잠재적으로 모든 단일 타일을 저장하지 않음으로써 절감 효과를 압도 할 것입니다. 또한 추가 조회이므로 캐시 성능이 저하됩니다.

추가 간접 계층을 도입하여 스토리지 효율성을 더욱 높일 수 있습니다. 타일을 청크로 구성하고 청크의 단위가 64x64x64라고 가정 해 봅시다. 125, 1, 132의 타일이 있으면 청크 (1,0,2)에 속합니다. 따라서 소형 청크 배열과 청크 인덱스 행렬로 구성된 월드가 있습니다 (청크가 존재하지 않는 경우 -1). 각 청크 (있는 경우)의 내용은 64x64x64의 타일 인덱스 매트릭스 (타일이없는 경우 1)와 사용 된 타일의 컴팩트 한 배열입니다. 이런 식으로, 결코 사용되지 않은 덩어리에 대해 막대한 양의 타일 인덱스를 태우지 않습니다. 이러한 종류의 접근 방식을 따르고 청크 세분성에 대한 합리적인 숫자를 선택하면 우주를 대규모로 확장하고 메모리 사용을 제어 할 수 있습니다. 실제로 청크를 32x32x32로 만들면

당신은 또한 특별한 무언가를 의미하기 위해 청크 또는 타일 인덱스의 고차 비트를 사용하는 것과 같이 열악한 트릭을 할 수도 있습니다. 따라서 타일 매트릭스의 항목에 최상위 비트가 설정되어 있으면 하위 31 비트가 타일 인덱스를 의미하는 것이 아니라 '워프 인덱스'또는 이와 유사한 것을 의미하며 별도로 유지 관리되는 목록에서 찾을 수 있습니다. 이 좌표를 찾아야합니다.


나는 앞으로이 질문에 누군가가 올 것이라고 경고 할 것입니다 :이 게시물의 아무것도 잘못되었지만, 스파 스가 아닌 세계를 가진 Minecraft와 같은 게임에는 정직하게 끔찍합니다. (그리고 MrCranky이 많이 말한다.)이에서 당신의 세계는 장점이 몇 가지 일도하고 많은 경우 의 속삭임 , 적지 않은 일도하고 많은 빈 상자를 .

1
스파 스 데이터 세트 스토리지 솔루션을 유지 관리하는 데 드는 오버 헤드가 상당히 높다는 점에 진심으로 동의합니다. 따라서 잔액이 희미하게 비뚤어진 경우에만 해결해야합니다. 여기서 중요한 요소는 데이터 비용 항목 및 데이터 항목 확률이 사용되지 않는 것입니다. 마인 크래프트는 방대한 양의 잠재적 데이터 세트 (각 방향에있는 많은 수의 타일)를 가지고 있습니다. 사용 된 잠재적 인 게임 세계의 실제 비율은 매우 작습니다. 전 세계를 움직일 때 큰 뭉치가 있다고 주장하더라도 여전히 잠재적 인 데이터 항목의 작은 부분입니다.
MrCranky

1
Minecraft의 다른 점은 단위당 비용이 작다는 것입니다. 단일 바이트 스토리지일까요? 하나의 값은 '아무것도 없음'을 나타내고 나머지는 블록 유형이며 바이트 단위로 쉽게 맞출 수 있습니다. 따라서 단일 블록에 대한 인덱스가 없습니다. 즉, 미친 것입니다. 인덱스는 실제 블록 값을 저장하는 것보다 훨씬 큽니다. 그러나 희소 데이터 세트 규칙은 여전히 ​​상위 레벨에서 작동합니다. 각 청크 (예 : 64x64x64)는 저장하는 데 비용이 많이 듭니다 (256K 블록). 하나의 작은 값을 사용하여 부재를 나타내거나 해당 주소가있는 경우 해당 주소를 나타내는 경우 대용량 스토리지를 저장 한 것입니다.
MrCranky

6

백만 개의 타일을 메모리에 저장할 수없는 이유는 무엇입니까? 내 휴대폰에도 256MB RAM이 있습니다. 백만 개의 빈 타일은 4-32MB입니까?


저장하는 것이 그렇게 큰 것처럼 보였습니다. 또한 업데이트하는 데 시간이 오래 걸립니다.
공산주의 오리

2
디스크 페이징 솔루션을 처리하는 것보다 업데이트 타일 세트를 무시하는 것이 훨씬 쉽습니다. 그냥 .. 무시해 알려진 액터로부터 X 거리 이상의 타일을 업데이트하지 마십시오.

2
@TheCommunistDuck 중요한 것은 타일 수가 아닌 타일을 저장하는 데 사용 된 총 메모리 양입니다.
저스틴

1
크라 겐과 조와 합의했습니다. 많이 들리는 것에 대해 걱정하지 마십시오. 수학을 수행하고 해결하십시오. 문제가되지 않을 것입니다.
Kylotan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.