방문자

오늘
—
어제
—
누적
—

불러오는 중

게임 개발 · 기술 동향 · 팀 블로그MIRO
헤드라인

Factorio · 게임 설계

레이더 범위가 겹치는 곳을 매번 계산할 필요가 있을까

Factorio 개발 일지 421의 레이더 범위가 겹치는 곳을 매번 계산할 필요가 있을까 관련 화면
Wube Software의 Factorio 개발 일지 #421 본문 이미지입니다. · 이미지 출처

겹치는 시야를 반복해서 찾는 비용

2024년 7월 26일의 Factorio 개발 기록 #421은 여러 최적화 중 레이더가 밝히는 영역을 다룹니다. 레이더가 많이 겹치는 공장에서는 같은 구역이 여러 장치의 범위에 들어갑니다. 화면에 필요한 것은 그 구역을 지금 볼 수 있느냐는 결과인데, 매번 모든 장치와 구역의 관계를 다시 계산하면 중복 작업이 생깁니다.

개선안은 구역마다 시야를 제공하는 등록 수를 관리합니다. 레이더 하나가 영역을 덮으면 해당 구역의 수를 늘리고, 빠지면 줄입니다. 겹치는 두 레이더 중 하나를 제거해도 나머지가 시야를 유지한다는 사실을 이 수로 표현할 수 있습니다.

결과를 유지하고 변경을 반영합니다

핵심은 ‘현재 어디가 보이는가’를 매번 처음부터 구하는 대신 시야 제공자가 생기고 사라지는 변화를 반영하는 것입니다. 마지막 제공자가 사라져 수가 0이 되면 해당 구역을 지속적으로 갱신할 이유도 없어집니다. 여러 원인이 하나의 활성 상태를 유지할 때 참고할 수 있는 구조입니다.

원문은 갱신 대상을 여러 묶음으로 나누고 한 틱에 한 묶음을 처리하는 방식도 설명합니다. 이는 계산을 없애는 것과는 다릅니다. 필요한 갱신을 시간에 나누어 배치하는 방식입니다. 개발팀이 제시한 특정 저장 파일의 성능 개선은 그 조건의 측정값이므로 다른 공장이나 게임의 보장 수치로 쓰지 않았습니다.

발견한 지도와 현재 시야를 구분합니다

현재 공식 LuaForce API에는 is_chunk_charted와 is_chunk_visible이 따로 있습니다. 전자는 구역이 지도에 기록됐는지를, 후자는 현재 지도에서 전장의 안개에 가려지지 않고 보이는지를 묻습니다. 한 번 탐색한 지형이 남아 있는 것과 현재 상태를 계속 관찰할 수 있는 것은 같은 개념이 아닙니다.

이 구분을 놓치면 레이더를 없앴는데 지도 모양이 남는 현상을 시야 갱신 오류로 오해할 수 있습니다. 공개 API는 외부에서 확인할 수 있는 의미를 보여주며, 내부 카운터와 갱신 목록의 모든 저장 형식을 공개한다는 뜻은 아닙니다.

등록과 해제의 대칭을 시험합니다

직접 해볼 검증은 미실행 제안입니다. 먼저 레이더 두 개의 범위를 겹치게 놓고 겹친 구역, 한쪽만 덮는 구역, 어느 쪽도 덮지 않는 구역을 표시합니다. 레이더를 하나씩 비활성화하거나 제거하며 지도에 기록된 상태와 현재 보이는 상태를 따로 관찰합니다.

자체 모형에서는 각 등록에 식별자를 붙여 같은 원인을 두 번 더하거나 해제하지 못하게 합니다. 추가 순서와 제거 순서를 바꿔도 최종 결과가 같아야 합니다. 저장 후 불러오기와 제공자 이동까지 넣으면 누락된 해제로 시야가 영구히 남는 문제도 찾을 수 있습니다. 이는 Factorio에서 확인한 결함이 아니라 이 구조를 구현할 때 제안하는 테스트입니다.

측정에서는 초기 등록 비용과 평상시 갱신 비용을 분리하는 편이 좋습니다. 장치가 거의 바뀌지 않는 큰 공장과 장치를 계속 이동시키는 환경은 부담이 다릅니다. 캐시를 쓴다는 말만으로 빨라지는 것은 아니며, 무엇이 바뀔 때 결과를 무효화해야 하는지 정확히 정의하는 것이 이 사례의 중요한 부분입니다.

출처

댓글

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

댓글 삭제

헤드라인

같은 카테고리의 글

게임 기술 전체 보기 ↗