기존에는 물의 수압이 옆방향으로만 전달되어서 파이프 같은 길에서는 제대로 수압이 구현이 안되었었음.

이제 물의 수압이 위,아래로도 전달돼서 이런 복잡한 길을 지나가더라도 물의 수압은 계속 유지가 됨.



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


이런식으로 파이프처럼 굴곡이 있는 길을 지나도 수압이 제대로 전달이 됨


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


블록마다 "수압" 변수에 나보다 수압이 높은 블록을 가지고 있음

"수압"블록이 존재하고, 내 위로 물을 올려보낼 수 있을 때, "수압"블록에서 물을 내쪽으로 가져오는 알고리즘임.


알고리즘의 핵심에 추가된게 뭐냐면,

기존의 수압 비교는 같은 높이의 물에서만 이루어졌기 때문에, 윗 방향의 물의 양만 체크해주면 되었음.

하지만 이제 수압이 위,아래로 전달이 되기 때문에

내 블록과 비교할 수압블록의 높이 차를 수압에 반영해서 계산해야 함.


어떠한 블록이 나보다 3칸 높이 있다?

-> 그 블록이 받는 수압(위에 있는 물의 양)에 3만큼 추가했을 때 내 위의 물의 양보다 많다면, 이 수압이 나보다 높다고 판단함.



문제라면 성능.

물 2천개 정도라면 무리없이 빠르게 돌아가는데 4천개 5천개 넘어가면 좀 버거워짐.

이건 생각중인게 있음.



또 하나의 문제는 스레드에서 일어나는 데이터 레이스.

현재는 스레드 안에서 청크 데이터에 직접 접근해서 수정을 가함.


현재 물의 시뮬레이션은

코루틴

while(simulate)

{

simulation();

yield return null;

}

이런식으로 안정된 상태가 될 때까지 반복하며 조금씩 물을 옮겨주는 방식임


1. 메인스레드에서 일어나는 청크데이터 작업이 물 스레드 완료를 기다리기

시뮬레이션이 돌아가는 동안은 블록의 설치/파괴 등 물에 영향을 주는 행동을 전부 큐에 담아주고,

1회 시뮬레이션이 돈 후 큐에 담긴 블록설치/파괴를 처리해주고

다시 시뮬레이션을 돌리는 방법.

이 경우에는 블록설치/파괴 뿐만 아니라 청크 관련 모든 작업이 물 시뮬레이션을 기다려 줘야 함.

더러운 방법.


2. 물 스레드와 메인스레드가 이용하는 데이터를 완전히 분리

아마 이걸로 할듯. 깔끔하고 정석적이고 어디서 잘못될 지 불안할 필요가 없을테니.


스레드에서 수천개의 물의 이동을 큐에 담아뒀다가, 스레드 종료 후 메인스레드에서 물의 이동을 적용시켜주기

계산용 물 배열 안에서 시뮬레이션을 돌리고, 완료 후 큐에 담긴 물의 이동을 청크 데이터에 처리해주는데,

이 때 그동안 청크에 일어난 블록의 설치/파괴 등은 역으로 계산용 물 배열에 적용 시켜줘야 함.


데이터를 동기화 시켜주는 추가 작업이 들어가는 만큼 살짝 처리속도가 느려질지도 아닐지도. 모르겠다.


락으로 처리하는건 왠지모르게 불안함



전부 뜯어고칠 생각하니깐 벌써 힘드네