기존에는 물의 수압이 옆방향으로만 전달되어서 파이프 같은 길에서는 제대로 수압이 구현이 안되었었음.
이제 물의 수압이 위,아래로도 전달돼서 이런 복잡한 길을 지나가더라도 물의 수압은 계속 유지가 됨.
이런식으로 파이프처럼 굴곡이 있는 길을 지나도 수압이 제대로 전달이 됨
블록마다 "수압" 변수에 나보다 수압이 높은 블록을 가지고 있음
"수압"블록이 존재하고, 내 위로 물을 올려보낼 수 있을 때, "수압"블록에서 물을 내쪽으로 가져오는 알고리즘임.
알고리즘의 핵심에 추가된게 뭐냐면,
기존의 수압 비교는 같은 높이의 물에서만 이루어졌기 때문에, 윗 방향의 물의 양만 체크해주면 되었음.
하지만 이제 수압이 위,아래로 전달이 되기 때문에
내 블록과 비교할 수압블록의 높이 차를 수압에 반영해서 계산해야 함.
어떠한 블록이 나보다 3칸 높이 있다?
-> 그 블록이 받는 수압(위에 있는 물의 양)에 3만큼 추가했을 때 내 위의 물의 양보다 많다면, 이 수압이 나보다 높다고 판단함.
문제라면 성능.
물 2천개 정도라면 무리없이 빠르게 돌아가는데 4천개 5천개 넘어가면 좀 버거워짐.
이건 생각중인게 있음.
또 하나의 문제는 스레드에서 일어나는 데이터 레이스.
현재는 스레드 안에서 청크 데이터에 직접 접근해서 수정을 가함.
현재 물의 시뮬레이션은
코루틴
while(simulate)
{
simulation();
yield return null;
}
이런식으로 안정된 상태가 될 때까지 반복하며 조금씩 물을 옮겨주는 방식임
1. 메인스레드에서 일어나는 청크데이터 작업이 물 스레드 완료를 기다리기
시뮬레이션이 돌아가는 동안은 블록의 설치/파괴 등 물에 영향을 주는 행동을 전부 큐에 담아주고,
1회 시뮬레이션이 돈 후 큐에 담긴 블록설치/파괴를 처리해주고
다시 시뮬레이션을 돌리는 방법.
이 경우에는 블록설치/파괴 뿐만 아니라 청크 관련 모든 작업이 물 시뮬레이션을 기다려 줘야 함.
더러운 방법.
2. 물 스레드와 메인스레드가 이용하는 데이터를 완전히 분리
아마 이걸로 할듯. 깔끔하고 정석적이고 어디서 잘못될 지 불안할 필요가 없을테니.
스레드에서 수천개의 물의 이동을 큐에 담아뒀다가, 스레드 종료 후 메인스레드에서 물의 이동을 적용시켜주기
계산용 물 배열 안에서 시뮬레이션을 돌리고, 완료 후 큐에 담긴 물의 이동을 청크 데이터에 처리해주는데,
이 때 그동안 청크에 일어난 블록의 설치/파괴 등은 역으로 계산용 물 배열에 적용 시켜줘야 함.
데이터를 동기화 시켜주는 추가 작업이 들어가는 만큼 살짝 처리속도가 느려질지도 아닐지도. 모르겠다.
락으로 처리하는건 왠지모르게 불안함
전부 뜯어고칠 생각하니깐 벌써 힘드네
왤케고수임 - dc App
들어도 무슨 말인지 모르겠다 ㅠㅠ
가슴이 웅장해진다. 근데 이거 걍 RnD용임?
ㄴㄴ 만들고 싶은 게임이 있는데, 그 전에 기본적인 시스템을 만들고 가려고