펄린 3D로는 동굴 같은 지형을 만들수는 있어도 자연스러운 동굴과는 거리가 멀더라
펄린 웜 이라는걸 사용하는게 좋다고 함.
하나의 점에서 해당 좌표를 이용한 x방향,y방향,z방향의 펄린1D값을 구하고(또는 각도를 구하고) 그걸 이용해 다음 점을 구해나가는 방식이라고 이해했음.
각 점에서 구 형태로 지형을 깎아내는데, 지름 역시 노이즈 값으로 변화를 줌
이전 점과 가까운 점이기 때문에, 방향이 랜덤이지만, 전 위치에서의 방향과 유사한 방향으로 나아가는 것 같음.
만약 region마다 한번에 로드하는 식이 아닌, 청크마다 로드하는 식이라면,
펄린 웜의 시작점 여러개를 청크ID로 구할 수 있어야 하고, 청크의 동굴을 파낼 때,
근처 청크의 시작점 모두로부터 펄린 웜으로 동굴을 체크하고, 내 청크와 겹친 부분을 파내는 방식이 될 것 같음
문제는 난 region의 동굴을 한번에 만드려고 함.
최소 수십만개의 블록을 한 프레임에 변경하려 했더니 어마어마하게 끊김.
코루틴으로 딜레이를 줘서 내일 해결 할 생각임.
다 만든 후에 값들을 변화시키며 실험해 볼 생각. 자연스럽기 위해선 동굴밀도가 최소한 두배 이상 되어야 할 듯. 노이즈 빈도값도 조정하고.
근데 딜레이를 주면 로드된 청크 위에서 동굴을 파야 하는 경우가 생김. 지금까지는 region이 전부 로드 된 후에 청크가 로드되서 그럴 가능성이 없었음.
최악의 상황에서는 유저의 눈 앞에서 동굴이 생성될지도 모름.
근데 region을 통채로 생성할거라면 이 문제는 어쩔수 없이 넘어가거나, 청크가 로드된 경우, 강제적으로 동굴을 끊어줄 수 밖에 없을것 같음.
스레드로 돌려주고 싶긴 한데, 이러려면 위에 적은대로 동굴을 강제적으로 끊는 방법을 택해야 할듯.
동굴을 스레드로 생성중인데 플레이어가 거기다 블록을 설치하면 안되잖아.
최종적으로는 region 하나당 수백만개의 블록을 파내야 할 텐데, 이거 때문에 세이브 형식을 예전으로 되돌릴까 생각중임.
모든 블록을 저장할 때는 하나의 블록당 1바이트가 필요함.
근데 변화된 블록만 저장하면 한 블록당 3~4바이트가 필요함. 난 4바이트 씀.
결국 청크의 블록중 25% 이상이 변화했다면 결과적으로는 용량을 더 차지한다는 뜻임.
뿐만 아니라, 블록을 변화시킬 때, 단순히 배열에서 자기 자리를 찾아가는게 아닌,
변화한 블록 구조체를 생성해서 이걸 청크별로 저장시켜줘야 함.
일반적으로는 문제가 안되겠지만 이런식으로 대규모 블록의 변화가 일어날 때 불리함.
난 앞으로 대재해 등을 추가할건데, 이러면 곤란하겠더라.
대신 모든블록을 저장하는 대신 압축하는 법을 알아봐야겠음. 마인크래프트가 그러더라.
region마다 16mb는 진짜 아닌것 같아.
또, 이 과정에서 region정보를 저장할 때 로드 된 적이 있는지에 대한 정보도 저장하도록 함.
원래는 플레이어가 근처에 다가간 region만 생성 하지만, 그렇지 않은 경우에도 region정보가 생성이 되어야 하는 경우가 생겼음.
region에서 region을 가로지르는 지형(동굴)을 만들어야 해서.
데이터가 존재하더라도 로드된적은 없는 region은 로드될 때 동굴생성 알고리즘을 실행시켜서 동굴을 생성하고,
동굴이 옆 region으로 넘어가면, 그 region이 로드된 적 없는 경우에만 해당 region의 데이터를 새로 만들거나 불러와서 동굴을 이어감.
내가 로드된적이 없더라도, 옆 region에서 넘어온 동굴의 데이터는 존재 할 수 있는 구조.
생각보다 신경쓸게 너무 너무 많음. 특히 성능 관련해서
그리고 마지막으로 현재 y값에 제한이 없는데(성능문제의 가장 큰 원인임),
그걸 이용해서 지하로 100~200만큼 내려갈 때마다 평지에 가까운, 최소 높이 20 이상의 거대한 공간이 나오도록 하고, 그걸 "층"으로 명시하고
난이도와 자원 값을 조정하면 재밌을 것 같음.
요건 그냥 노이즈로 바로 생성 가능
상상만 했는데 너무 좋다
난 동굴같은 구조물 생성하다가 걍 무한월드 포기함 너무 어려움 이거 하다간 별다른 개성도 없는 마크짭겜인데 시간이랑 노력만 엄청 들일거 같아서
ㄹㅇㄹㅇ 신경써야하는게 너무 많음. 앞으로 어떤 문제점들이 나올지 모르니깐 새로운거 추가할때마다 앞서 만들었던 구조를 손봐야되는데 이럴때마다 너무 지침
하 시바 언리얼로 마칭큐브 하는데 멀티스레드 패키징 하니깐 퍼포먼스 뚝 떨어진다 왜 떨어지냐 똑같은 동작을 하는건데 씨발 ㅠㅠ
언리얼은 잘 모르겠는데 멀티스레드가 느려지는건 스레드를 계속 새로 생성해서 사용하는것 말고는 생각이 안난다 ㅜㅜ
지형생성은 마칭큐브임?
그냥 정사각형들인데, 규칙에 따라서 모양을 조금씩 변형시켜서 어느정도 부드럽게 보이게 만듬