용량이 커서 15프레임으로 찍음


지하로 무한히 내려갈 수 있음.

동굴 모양이 예쁘지 않은건 아직 디버깅도 다 못해서 많이 못만져봄

파내는 원의 지름의 변화를 좀 더 극적으로 줘야 할 듯

내리막 각도도 제한을 주고

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b9276523861b7293e45be37763fec7a490aafca242d81557d432cba752e677d8aa173e23fa2b


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b9276523861b7293e45be37763fec7a490aafca242d81557d432cda003e1278cae433e23fa2b



결국 스레드로 작업을 넘기는데 성공함

로드가 느리긴 하지만, 지금 터널을 엄청 많이 파내고 있다는 점을 감안하면 괜찮을듯.

스레드로 넘겼기 때문에 로드 때문에 프레임 저하는 일어나지 않음


Region 클래스를 생성하는 부분은 스레드 밖에서, 안의 내용물을 채워넣는 작업은 스레드 안에서 돌리도록 바꿨음

왜냐면 일단 region이 로드되지 않았더라도 다른곳에서 요구할 수 있기 때문.

스레드를 돌면서 내용물이 로드되기 전까지 loaded = false로 유지되어서, 모든 청크, 메쉬의 생성이 큐에서 홀드됨.


다시말하자면, region이 아직 로드되지 않았다면 청크 자체가 로드되지 않음.



현재 내 상황


region을 로드할까? -> 큐에 넣고 스레드로 하나씩 직렬로 처리


청크를 로드할까? -> region 클래스 자체는 무조건 존재함

region이 로드되어있다면 예

region이 로드되는중이라면 큐에 넣어주고 region이 로드 된 후에 청크를 로드함



청크 게임오브젝트를 로드할까 -> 청크 클래스 자체는 무조건 존재함

청크가 로드될때까지 마찬가지로 큐에서 대기




내일 처리할 문제는

일단 region의 로드와 언로드 + 저장을 하나의 큐로 처리. 이거 완전 중요!!! 순서가 매우 중요함!

얘는 직렬로 처리되어서 이게 가능함.


근데 청크는 지금 병렬로 처리됨.

로드가 아직 되지 않았다면 언로드 대기.

근데 이때 다시 로드시켜버린다면? - 이미 존재하는 청크라서 오류라고 판단하고 패스

아직 겪어본적은 없지만 머릿속 시뮬레이션에 따르면 로드가 안되어있는 청크가 생길 것 같음.


이걸 어떻게 해결하느냐.

로드가 될때까지 언로드를 대기 시키지 않는다!

청크를 모아두는 배열에서 그냥 바로 빼버린다.

청크는 스레드에서 계속 로드가 진행되겠지만 그건 더이상 유효한 청크가 아님.

이 상태에서 다시 로드시킨다? - 새로운 청크를 생성해서 새로 로드시킨다.



그리고 지금 어떻게든 만들어내는데에만 신경써서 가비지생성문제가 있는것 같은데 그건 좀 나중에 해결할듯




진짜 스레드를 온갖곳에 다 써야하다보니깐 머리가 녹아버릴것 같아

심지어 데이터 로드/세이브 역시 스레드에서 하다보니 신경쓸게 너무 많음


근데 또 스레드를 안쓰면 게임이 엄청 버벅여서 선택지가 없다


그리고 이런버그 찾기 겁나 힘듬. 내가 멍청한걸수도 있고.

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b9276523861b7293e45be37763fec7e0c5ff95a445db13dddd8d5cbe71440c32f5d76436ea5d39f44fa3


여기서 문제가 뭐냐면, 스레드에 델리게이트로 regionToLoad[0]을 전달해주고 regionToLoad.RemoveAt(0)를 호출했음.

근데 델리게이트 안의 내용이 돌기 이전에 regionToLoad.RemoveAt(0)이 먼저 돌아버리는거임

결국 엉뚱한 값이 스레드 안에 들어가는데 하..




작은 팁 하나 주자면 유니티 스레드 안에서는 오류검출이 안되기 때문에 try catch로 오류를 잡아내야 함.

System.Exception e로 받아와서 e.ToString()하면 오류가 나온 라인과 오류 내용을 알려줌.




+ 오늘 세이브 형식을 모든 블록을 저장하기로 바꿨다가 멘붕오고 예전으로 돌려버림.

순식간에 용량이 기가바이트단위로 넘어가더라. 압축 알고리즘을 짜는게 먼저인듯.

게다가 내가 region단위로 모든 정보를 가지고 있다보니깐 기본적으로 잡아먹는 메모리도 어마어마함.

이거때문에 오늘 반나절 날려먹음


오늘 해보니깐 그냥 바뀐 블록만 저장하는 방식으로 가도 될 것 같음. 얘도 압축하면 되지




처음부터 다시 만들면 훨씬 깔끔한 코드를 쓸 수 있을것 같은데 엄두가 안난다 ㅋㅋ

이거 전에도 게임 하나 만들어본적이 있는데 난이도가 차원이 다른듯. 그 게임도 만들기 쉬운건 아니였는데



마지막으로 스크린샷


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b9276523861b7293e45be37763fec7e0c5ff95a445db13dddd8d5cbe71440e34f3816833bf5939e6a69d


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b9276523861b7293e45be37763fec7e0c5ff95a445db13dddd8d5cbe71440136f18f6031b05f39bc8d07


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b9276523861b7293e45be37763fec7e0c5ff95a445db13dddd8d5cbe71445d36f2846637ee0f398d07fe