2011-12-16 5 views
2

저는 텍스트 기반 게임을 만들고 프로 시저 월드 생성을 구현하려고합니다.대규모 유니버스를 프로 시저로 생성

나의 초기 계획은 조금 우연적이었다. 각 우주는 태양계의 은하계의 3 차원 배열을 가지고 있으며, 차례로 무작위로 된 천체로 전파 될 것이다. 별도로 실제 지역을 생성 할 계획 이었지만, 현재 가지고있는대로 작업을 완료 할 수 있는지 확신 할 수 없습니다.

Each universe is a Galaxy[10][10][10] (arbitrary number at the moment), 
each galaxy is a randomly sized SolarSystem[50-150][50-150][50-150], 
each SolarSystem is a randomly sized CelestialBody[5-20][5-20][5-20]. 

나중에 모두 읽을 수 있도록 데이터 파일에 기록됩니다.

지금 생각해 보면 틀림없이 (ClassSize^3)^3)^3) 바이트가 필요합니다. ClassSize가 4 바이트 인 경우에도 저장할 수 없습니다.

배열 배열에 대한 나의 의도는 처음에는 클러스터를 효율적으로 그룹화하고 플레이어가 우주에서 어디에 있었는지 확인하는 데 도움이되었습니다.

제 질문은 어떻게 저 스케일의 세계를보다 효율적으로 만들 수 있습니까?

+0

이 배열의 자바 배열에서'_int_'는 ** 실제로 ** 공간의 낭비입니다. 왜냐하면 자바의'a [2] [2] [2] '는 int 배열로 두 개의 참조를 배열하는 두 개의 참조 그래서, 당신은 6 개의 심판과 8 개의 int (이 경우)를 가지고 있습니다. 더 정확한 위치에 1 차원 배열을 사용하십시오. –

+1

사실 당신은 classsize * (시스템 당 몸체^3) * (gal per system axy^3) * (우주 당 은하^3). 따라서 가장 작은 숫자는 4 바이트 * 5^3 * 50^3 * 10 * 3 ~ = 58GB입니다. 플레이어의 관점에서, 각 신체에 5 초를 소비하는 데는 2500 년이 걸리기 때문에 디자인의 일부를 다시 생각해 볼 수 있습니다. – Thomas

답변

9

결과 우주를 저장하는 대신 각 플레이어에 대해 고유 한 임의 시드 값을 만들고 플레이어를 재생할 때 순식간에 세계를 절차 적으로 생성하는 데 사용합니다.

매번 동일한 값으로 생성기를 시드하면 매번 동일한 난수가됩니다. 따라서 내 고유 한 무작위 플레이어 ID가 654156475이라면 게임을로드 할 때 유니버스 생성기에 해당 ID를 던져서 생성기가 매번 동일한 유니버스를 생성합니다. 다른 플레이어는 다른 우주를 갖게 될 것입니다. 왜냐하면 그들의 종자가 내 것과 다를 수 있기 때문입니다.

게임에서이 기술을 사용하는 방법에 대한 간략한 개요는 this article의 "비디오 게임"섹션을 참조하십시오.

또는 우주 생성기로 쓰는 대신 태양계 생성기 (또는 플레이어가 차지할 공간의 최소 단위)로 씁니다. 그런 다음 각 솔라 시스템 을 각 태양계에 저장하고 비교적 적은 양의 데이터 인이 씨앗을 사용하여 플레이어가 재생할 때 즉시 재생 필드를 생성합니다 (나중에 동일한 필드를 다시 생성합니다). .

이 접근법의 가장 큰 장점은 매우 적은 양의 데이터 인 디스크에 시드 값을 저장하기 만하면되므로 유니버스 데이터를 전혀 저장할 필요가 없다는 것입니다. 뿐만 아니라 비행 중에 우주의 작은 부분을 재생성하는 것은 디스크에서로드하는 것보다 훨씬 빠를 수 있습니다.

5

많은 사람들이 몇 년 전에 설명했듯이 (PC에 2 개의 5.25 인치 플로피 드라이브가 있었을 때) 전체 게임을 메모리에 미리 할당하지 않았으므로 게임을 분할하여 게임의 일부분을로드해야합니다. 플레이어가있는 우주, 10x10x10 차원의 3D 블록으로 말하십시오. 방황하는 공간이로드 된 공간의 경계를 가로 질러 움직일 때 그 공간을 디스크에 쓰고 이동 한 공간을 읽습니다.