정확한 UPS 하락 원인 찾는다고 넘 삽질했는데, 결국 방법을 찾아서 공유함



우선 F4를 누르면 나오는 디버깅 매뉴에서


show-detailed info 와 show-time usage 를 확인하면 하락 원인을 대략적으로 알 수 있음






show-detailed-info를 보면 저렇게 빨간색으로 동그라미 친 부분이 Active Entity 즉 활성화 된 객체 숫자임


UPS 하락과 비례하는 값이므로 참고할 필요가 있음






그리고 show-time-usage를 보면, 각 업데이트에 경과 된 시간이 표시되는데 이게 핵심임


짤보면 Update: 25~~~/~~~/~~ 이런식으로 값이 나오는데, 업데이트를 한번 하기까지 걸린 시간임


여기서 1은 1ms임. 즉 1/1000초


이 값이 1000이면 1초란 얘기임



짤에서 빨강 파랑 노랑으로 밑줄 그은 / 로 나눠진 값들은 각각


현재값 / 최근 1분간 최소값 / 최근 1분간 최대값 을 뜻함




UPS가 60이면 1초에 Update를 60번 한다는 얘기임


따라서 이 Update 값이 16.6666..( 1000 / 60 ) 을 넘어서면 UPS가 60아래로 떨어지게 됨



근데 이 통계에는 문제가 있음


짤방을 보면 Entity update가 유난히 오랜시간을 소모해서 이 넘이 문제라는 건 알겠는데


도대체 이 넘이 어떤 넘인지 정확히 알 수가 없다는 것임


Entity에는 바이터, 밸트, 열선, 로봇, 레이더 등등 모든 객체가 다 포함되거든



구글링해봐도 하위 정보를 보는 방법이 안나오길래 고민하다가


각 Entity 군을 한 종씩 지웠을 때 변화되는 시간을 측정하면 되겠다란 생각을 했음




우선 활성상태의 Entity 수를 맵에서 확인해봤음




F4의 매뉴 중에 show-active-entities-on-chunk-counts 로 확인이 가능함


참고로 숫자 중


빨간색은 활성화 된 Entity

파란색은 플레이어가 접근 시 활성화 되는 Entity

초록색은 적이 접근 시 활성화 되는 Entity임



대충 보니 바이터가 매우 의심스러움


그래서 우선 바이터와 둥지부터 날려봄


방법은 ` 키로 콘솔창을 열고


/c local surface=game.player.surface for key, entity in pairs(surface.find_entities_filtered({force="enemy"})) do entity.destroy() end

를 치면 됨


해당 명령어는 https://wiki.factorio.com/Console#Kill_all_enemies 에서 확인할 수 있음



참고로 치트 명령을 처음 실행할 때는 두번 입력해야됨. 콘솔창에 한번 더 입력하라고 안내가 나오니 알 수 있을 것임



매우 깔끔하게 날아갔음




Update 시간도 22에서 8로 확 줄어들었음



UPS 하락시키는 주요원인은 일단 찾았는데 여전히 남아있는 저 Entity update 8이란 수치가 마음에 안듬


그래서 어떤게 8이나 잡아먹는지 Entity를 한 종류씩 날려봤음




바이터 다음으로 의심가는 넘은 날라다니는 수만 마리의 로봇이였음


F4에서 show-logistic-robots-on-map 으로 현재 활동 중인 로봇을 맵에서 확인 가능함



근데 이놈을 날려볼랬더니 위키에 방법이 안나옴


그래서 팩토리오 API 문서를 뒤져서 스크립트 함수를 찾아봤음


https://lua-api.factorio.com/latest/index.html


API 문서 링크임



/c local entity="robo"

local surface=game.player.surface

local count=0

for key, ent in pairs(surface.find_entities_filtered({force=game.player.force})) do

if string.find(ent.name,entity) then

if ent.can_be_destroyed() then

ent.destroy()

count = count + 1

end

end

end

game.player.print(count)


그리고 이런 스크립트를 짯음


여기서 첫줄을 보면 /c local entity="robo" 이렇게 되있는데


entity 이름에 robo가 들어가는 모든 놈을 다 찾고 지우는 스크립트임


요거 한방으로 로보포트 물류로봇 건설로봇 다 날아감. 왜냐면 다 robo란 글자가 들어가니까



아무튼 이 스크립트로 날려봤음



깔끔


update time이 4ms 줄어듬



여전히 남은 4ms가 마음에 안들어서 이것저것 다 날려봤는데



요약 결과로는


레이더 1700개 날렸을 때 0.5ms 감소


다이소 쪽 밸트 날렸을 때 0.5ms 감소. 밸트가 거의 없긴 했음. 참고로 밸트 날릴 때 express로 검색했음. 왜냐면 belt로 검색하면 분배기가 안날아가서..


15G 를 생산하는 원전 부속들을 전부 날렸을 때 1ms 감소


투입기 전부 날렸을 때 0.5ms 감소. 이건 근데 이미 로봇을 날려서 대부분 셧다운 상태라 적게 줄어든듯..


등등..


생각보다 원전과 레이더가 update time을 적게먹는다는 사실을 알게됐음



근데 이런 요인들은 기지 구조에 따라서 다 다른거니까 직접 확인해보는게 정확할 것임 ㅇㅇ