Factorio의 벨트는 왜 아이템의 위치 대신 간격을 기억할까?
작성 기준일 · 블로그 공개
아이템이 수백 개여도 서로의 간격이 그대로라면, 줄의 양 끝만 갱신할 수 있다. 막혔을 때는 어떤 값이 바뀌는지 살펴본다.

아이템 200개를 움직이는 데 숫자 200개가 필요할까?
공장에 놓인 운반 벨트가 한 틱 전진한다. 아이템마다 좌표를 가지고 있다면 200개를 전부 갱신해야 한다. 하지만 같은 속도로 이동하고 서로 추월하지 않는다면, 이웃한 두 아이템 사이의 거리는 그대로다. Factorio 개발진은 0.15 최적화에서 연속된 벨트를 묶고, 줄 안의 아이템은 절대 좌표 대신 서로의 간격으로 저장했다. 줄 전체가 자유롭게 흐르는 동안에는 양끝의 여유만 바꾸면 된다.
벨트가 막히면 어디가 먼저 줄어들까?
앞 아이템이 출구에서 멈춰도 뒤쪽 아이템은 그 앞에 공간이 남아 있는 동안 이동한다. 이때 바뀌는 값은 출구 쪽에서 가장 가까운, 아직 남아 있는 간격이다. 매 틱 뒤로 훑어 그 위치를 다시 찾으면 비용이 커진다. 개발진은 그 간격의 위치를 기억했다. 외부에서 아이템을 끼워 넣는 경우를 제외하면, 이미 서로 맞닿은 아이템이 막힌 구간에서 저절로 벌어지지 않는다. 덕분에 다음 간격을 찾아야 할 때 탐색 위치가 한쪽 방향으로만 움직인다.
작은 모형으로 직접 비교하기
12칸짜리 줄에 아이템 네 개를 같은 방향으로 흘려보낸다. 먼저 개별 좌표 배열을 만들고, 다음에는 아이템 간격과 양끝 여유를 저장한다. 두 버전 모두 같은 위치에 아이템이 그려지는지 대조하면서 틱당 몇 개의 상태를 갱신했는지 세어 본다. 출구를 막고, 다시 열고, 중간에 아이템을 넣는 경우를 차례로 비교하면 간격 표현이 유리한 상황과 재계산이 필요한 상황이 드러난다. 줄 사이 이동이나 합류가 잦으면 줄 내부의 갱신 비용을 줄여도 경계 처리 비용이 남는다.