게임 개발 · 기술 동향미로의 개발노트
카테고리

Factorio · 시뮬레이션 최적화

Factorio의 벨트는 왜 아이템의 위치 대신 간격을 기억할까?

작성 기준일 · 블로그 공개

아이템이 수백 개여도 서로의 간격이 그대로라면, 줄의 양 끝만 갱신할 수 있다. 막혔을 때는 어떤 값이 바뀌는지 살펴본다.

빨간 선으로 운반 벨트의 연속 구간을 나눈 Factorio 개발진의 게임 화면
Factorio 개발 일지의 운반 벨트 구간 도식. 빨간 선은 연속 구간의 경계를 표시한다.

아이템 200개를 움직이는 데 숫자 200개가 필요할까?

공장에 놓인 운반 벨트가 한 틱 전진한다. 아이템마다 좌표를 가지고 있다면 200개를 전부 갱신해야 한다. 하지만 같은 속도로 이동하고 서로 추월하지 않는다면, 이웃한 두 아이템 사이의 거리는 그대로다. Factorio 개발진은 0.15 최적화에서 연속된 벨트를 묶고, 줄 안의 아이템은 절대 좌표 대신 서로의 간격으로 저장했다. 줄 전체가 자유롭게 흐르는 동안에는 양끝의 여유만 바꾸면 된다.

벨트가 막히면 어디가 먼저 줄어들까?

앞 아이템이 출구에서 멈춰도 뒤쪽 아이템은 그 앞에 공간이 남아 있는 동안 이동한다. 이때 바뀌는 값은 출구 쪽에서 가장 가까운, 아직 남아 있는 간격이다. 매 틱 뒤로 훑어 그 위치를 다시 찾으면 비용이 커진다. 개발진은 그 간격의 위치를 기억했다. 외부에서 아이템을 끼워 넣는 경우를 제외하면, 이미 서로 맞닿은 아이템이 막힌 구간에서 저절로 벌어지지 않는다. 덕분에 다음 간격을 찾아야 할 때 탐색 위치가 한쪽 방향으로만 움직인다.

작은 모형으로 직접 비교하기

12칸짜리 줄에 아이템 네 개를 같은 방향으로 흘려보낸다. 먼저 개별 좌표 배열을 만들고, 다음에는 아이템 간격과 양끝 여유를 저장한다. 두 버전 모두 같은 위치에 아이템이 그려지는지 대조하면서 틱당 몇 개의 상태를 갱신했는지 세어 본다. 출구를 막고, 다시 열고, 중간에 아이템을 넣는 경우를 차례로 비교하면 간격 표현이 유리한 상황과 재계산이 필요한 상황이 드러난다. 줄 사이 이동이나 합류가 잦으면 줄 내부의 갱신 비용을 줄여도 경계 처리 비용이 남는다.

출처