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

움직이는 모든 물건의 좌표가 필요할까요?
2017년 2월 3일의 Factorio 개발 기록 #176은 벨트 위 아이템의 이동을 더 적은 갱신으로 처리하는 방법을 공개했습니다. 벨트에 수많은 물건이 있을 때 각 물건의 절대 위치를 매 틱 바꾸는 방식은 비용이 큽니다. 개발팀은 연결된 운반 구간과 아이템 사이의 간격에 주목했습니다.
같은 속도로 움직이는 물건 사이의 거리는 그대로입니다. 앞뒤 간격이 변하지 않는 동안에는 모든 좌표를 따로 갱신하지 않아도 움직임을 표현할 수 있습니다. 원문은 아이템 간 거리와 양 끝 간격을 보관하는 구조를 설명합니다. 이는 화면에 물건을 그리지 않는 것이 아니라, 위치를 표현하고 갱신하는 방식을 바꾸는 최적화입니다.
막힌 끝에서 줄어드는 간격
벨트 끝이 막히면 뒤에서 온 아이템이 빈 공간을 메우며 밀집합니다. 이미 밀집한 이웃 사이의 간격은 계속 계산할 필요가 줄어듭니다. 개발팀은 마지막으로 남은 비어 있는 간격의 위치를 기억해 찾아가는 작업을 줄이는 방법도 설명했습니다.
다만 중간에서 투입기가 물건을 넣거나 빼면 간격이 다시 달라집니다. 전체 게임이 항상 상수 시간에 실행된다는 뜻으로 읽으면 안 됩니다. 원문의 설명은 특정 운반 구간과 이동 처리의 조건에 관한 것입니다. 구간을 합치고 나누거나 아이템을 검색하는 일까지 모두 없어지는 것은 아닙니다.
이동 표현과 플레이 규칙을 나눕니다
Factorio Wiki의 벨트 물리 문서는 아이템을 넣고 꺼내는 동작과 이동 처리의 관계를 설명합니다. 각 레인은 별도로 다뤄지며 벨트 처리량은 이동 속도와 적재 밀도의 영향을 받습니다. 같은 속도로 흘러도 빈자리가 많으면 실제 운반량은 줄어듭니다.
개발 기록에서는 위치를 찾기 위해 간격을 누적하는 과정과 투입기의 연속적인 탐색도 다룹니다. 덕분에 단순한 ‘배열 하나로 압축했다’는 설명보다 실제 요구를 볼 수 있습니다. 이동을 싸게 만드는 표현이 원하는 위치의 아이템을 찾는 데에도 적합한지 함께 확인해야 합니다.
두 표현을 비교하는 작은 모형
다음은 실행하지 않은 실험 제안입니다. 아이템 100개가 한 방향으로 이동하는 모형을 만들고, 한 버전은 절대 좌표를, 다른 버전은 앞뒤 간격을 보관합니다. 출력 위치가 같다는 것부터 확인한 뒤 한 틱에 수정한 값의 수와 처리 시간을 따로 측정합니다. 수정 수가 적다고 실제 실행 시간이 반드시 같은 비율로 줄지는 않습니다.
이후 끝을 막았다가 열고, 중간에서 물건을 하나 제거하고, 새 물건을 넣는 경우를 추가합니다. 물건의 순서와 총개수, 최소 간격이 유지되는지 검사합니다. 삽입·제거가 드문 경우와 많은 경우를 나누면 어떤 입력에서 표현 방식의 장점이 줄어드는지도 알 수 있습니다.
이 사례에서 가져갈 핵심은 모든 상태를 매번 직접 갱신할 필요가 없다는 점입니다. 함께 움직이는 것 사이에서 변하지 않는 관계를 찾으면 계산 범위를 줄일 수 있습니다. 반대로 그 관계를 깨는 행동을 빠뜨리면 빠르지만 틀린 시뮬레이션이 됩니다. 공개된 최적화를 자신의 시스템에 적용할 때에는 성능 수치보다 먼저 성립 조건을 옮겨야 합니다.
미로


댓글
이 글에 대한 생각을 남겨 주세요.