어제부터 지금까지 최적화 부분 작업을 했는데 생각보다 최적화라는게 끝이 없어서 이정도까지만 하고 기능 개발로 넘어가기로함.


영상에 보이는것처럼 4만개 ~ 10만개의 아이템 오브젝트는 생각보다 괜찮은데, 두번째 영상에 72만개는 평균 7 ~ 8프레임으로 아직 매우 처참함.




처음에 해결한 최적화는 아이템 렌더링 부분이였는데


아이템마다 Sprite Renderer를 갖고 있어서 이 부분을 GPU Instancing으로 변경 했더니 렌더링 부분에서는 3백만개 이상도 60프레임 넘게 나오게됨.


두번째로 시도한 최적화는 벨트 시뮬레이션 로직이였는데 단순하게 멀티쓰레딩을 추가하니까 계산 순서가 비결정적이라[1] 테스트를 통과하지 못하더라고


그래서 double buffering 으로 읽기 쓰기를 분리해서 적용하니까 테스트는 통과하는데 프레임이 더 떨어지더라고[2] 내가 제대로 코딩한게 아닐수도있는데


문제는 벨트 구조 자체라고 판단했음. 그래서 직선과 커브 벨트끼리는 TransportLine 으로 t-shape, cross는 Junction으로 최적화 하는 방법이 남아 있는데


기능 개발 먼저해서 테스트코드 양을 좀 늘려두고 시도해보려고



[1] 시뮬레이션 게임에서 비결정적이게되면 아이템이 오는 순서나 벨트에서 허브로 들어갈때 잘못된 순서로 들어갈 수 있음.[2] 스레드 동기화 비용이 비싸고 벨트 애니메이션 자체도 정수 연산으로 처리해둬서 스레드간 작업 + 분배비용 > 실제 싱글 스레드 연산 비용