놀이터 › 블록 실험실 › 블록 실험실 세계는 어떻게 만들어지나, 씨앗과 무한 지형과 저장
블록 실험실 세계는 어떻게 만들어지나, 씨앗과 무한 지형과 저장
가로로 끝이 없다는 것은 미리 만들어 둘 수 없다는 뜻입니다. 그래서 지형을 저장해 두는 대신 계산해서 만듭니다. 좌표를 넣으면 그 자리의 땅 높이가 나오는 식입니다. 같은 씨앗과 같은 좌표면 몇 번을 물어도 같은 답이 나오기 때문에, 갔다가 돌아와도 세계가 그대로입니다.
세계의 크기
| 항목 | 값 |
|---|---|
| 가로 | 끝 없음 |
| 세로 | 128칸 |
| 해수면 | 위에서 56번째 줄 |
| 지표 높이 범위 | 14~96번째 줄 사이 |
| 한 덩어리(청크)의 가로 | 32칸 |
| 맨 아랫줄 | 기반암 |
세로를 128로 묶은 이유는 한 덩어리의 크기를 고정하기 위해서입니다. 가로 32칸 세로 128칸이 한 덩어리이고, 필요한 덩어리만 그때그때 만들고 멀어지면 내려놓습니다.
씨앗 하나로 같은 세계
씨앗은 숫자여도 되고 글자여도 됩니다. 글자를 넣으면 한 글자씩 섞어서 숫자로 바꿉니다. 같은 글자는 늘 같은 숫자가 되기 때문에 친구에게 씨앗을 알려주면 같은 세계를 볼 수 있습니다.
지형은 여러 층의 물결을 겹쳐서 만듭니다. 큰 물결이 산과 골짜기를 만들고, 작은 물결이 울퉁불퉁한 디테일을 얹습니다. 좌표를 넣으면 그 자리의 높이가 바로 나오는 방식이라 순서대로 만들 필요가 없습니다. 저 멀리 10만 칸 떨어진 자리도 바로 계산할 수 있습니다.
이 성질이 무한 세계의 핵심입니다. 지형을 어딘가 저장해 두고 불러오는 것이 아니라 필요할 때 다시 계산합니다. 그래서 아무리 멀리 가도 메모리가 늘지 않습니다.
지형 세 가지
| 지형 | 어떻게 생기나 | 특징 |
|---|---|---|
| 평지와 숲 | 기본값 | 풀과 흙, 나무, 가끔 호수 |
| 산 | 지형 값이 높은 구간 | 위로 24칸까지 솟습니다. 꼭대기에 눈 |
| 사막 | 지형 값이 낮은 구간 | 모래로 덮이고 높낮이가 거의 없습니다 |
세 가지가 갑자기 바뀌지 않고 서서히 섞입니다. 풀밭에서 사막으로 갈 때 중간에 풀과 모래가 섞인 구간이 지나갑니다.
6,000칸 안에 사막과 산이 모두 나오는지, 눈이 쌓일 만큼 높은 산이 있는지를 검사로 확인합니다. 어떤 씨앗을 넣어도 한 종류 지형만 끝없이 이어지는 일이 없게 하려는 것입니다.
호수는 해수면보다 낮은 자리에만 물이 찹니다. 산 중턱에 물이 떠 있는 일이 생기지 않습니다.
지하
지표 아래는 흙이 몇 칸, 그 아래는 돌입니다. 돌 사이에 석탄과 금이 묻혀 있고 깊은 곳에는 용암이 고여 있습니다.
| 묻힌 것 | 어디에 |
|---|---|
| 석탄 | 얕은 곳부터 넓게 |
| 금 | 더 깊은 곳에만 |
| 용암 | 아주 깊은 곳 |
| 기반암 | 맨 아랫줄 |
깊이 파고 내려가다 용암을 건드리면 그때부터 일이 벌어집니다. 용암이 파 놓은 굴을 따라 흐르기 시작하고, 위에 나무가 있었다면 불이 올라옵니다. 물을 미리 준비해 두는 것이 안전합니다.
바꾼 것만 저장합니다
지형은 계산으로 다시 만들 수 있으니 저장할 필요가 없습니다. 저장해야 하는 것은 사람이 바꾼 부분뿐입니다.
그래서 덩어리마다 "건드렸는가" 표시를 둡니다. 블록을 하나라도 놓거나 부수면 그 덩어리만 저장 대상이 됩니다. 아무것도 안 한 덩어리는 아무리 많이 지나다녀도 저장되지 않습니다.
| 상황 | 저장되나 |
|---|---|
| 그냥 지나간 지형 | 아니요. 다시 계산합니다 |
| 블록을 놓거나 부순 곳 | 예 |
| 모래가 저절로 무너진 곳 | 예. 블록이 바뀌었으니까요 |
| 멀리 떠나 화면에서 내려간 곳 | 바꾼 것이 있으면 따로 보관합니다 |
저장할 때는 같은 블록이 이어지는 구간을 한 번에 묶어 줄입니다. 돌이 백 칸 이어지면 "돌 100칸"으로 적습니다. 지하는 같은 블록이 길게 이어지기 때문에 크게 줄어듭니다. 검사에서는 덩어리 하나가 6,000자 미만으로 저장되는지를 확인합니다.
멀리 갔다가 돌아왔을 때 만들어 둔 것이 그대로 있는지도 검사 항목입니다. 화면에서 내려갔다 다시 올라올 때 바꾼 블록이 보존되는지를 매번 확인합니다.
무한을 다루는 세 가지 장치
"가로로 무한"은 말은 간단한데 세 군데서 문제가 생깁니다. 만드는 쪽, 계산하는 쪽, 저장하는 쪽입니다. 각각 다른 방법으로 풀었습니다.
| 문제 | 푸는 방법 |
|---|---|
| 전부 미리 만들 수 없다 | 좌표를 넣으면 높이가 나오는 계산식으로 그때그때 만듭니다 |
| 전부 계산할 수 없다 | 화면에 보이는 덩어리만 한 박자씩 돌립니다 |
| 전부 저장할 수 없다 | 사람이 건드린 덩어리만 저장합니다 |
세 가지가 맞물려야 무한이 성립합니다. 하나라도 빠지면 멀리 갈수록 느려지거나 저장 용량이 터집니다.
화면 밖의 덩어리를 계산하지 않는 것에는 눈에 보이는 결과가 있습니다. 멀리 만들어 둔 물탱크에 구멍을 뚫어 놓고 자리를 떠나면 물이 더 안 흐릅니다. 돌아오면 떠날 때 그 상태 그대로 있다가 다시 흐르기 시작합니다. 실제 세계와 다른 점이고, 무한 세계를 브라우저에서 돌리려면 치러야 하는 값입니다.
음수 좌표도 똑같이 동작합니다. 0에서 왼쪽으로 가도 오른쪽과 같은 방식으로 지형이 만들어집니다. 덩어리 경계에서 읽고 쓰는 것이 어긋나지 않는지는 검사 항목으로 확인합니다.
빠른가
| 잰 것 | 걸린 시간 | 기준 |
|---|---|---|
| 화면에 보이는 224칸 한 박자 | 0.41밀리초 | 8밀리초 안 |
| 새 덩어리 하나 만들기 | 0.26밀리초 | 12밀리초 안 |
초당 60번 그린다고 하면 한 번에 쓸 수 있는 시간이 16밀리초입니다. 한 박자 계산에 0.41밀리초를 쓰니 여유가 많습니다. 새 지형을 만드는 순간에도 0.26밀리초라 끊김이 없습니다.
여유가 생기는 가장 큰 이유는 화면에 보이는 칸만 계산하기 때문입니다. 저 멀리 만들어 둔 물탱크는 보고 있지 않으면 흐르지 않습니다. 세계가 무한해도 계산량은 화면 크기에 묶여 있습니다.
속도도 검사 항목에 넣어 두었습니다. 규칙을 하나 고쳤을 때 느려지면 바로 드러나게 하려는 것입니다. 검사는 모두 53개이고 지형, 모래, 물, 용암, 불, TNT, 식물, 저장, 속도를 묶어서 돌립니다.