벨트에서 아이템이 지나가는 양 등 생산량에 관련된 값을 측정하고 싶은 경우가 있음
이때 한 틱의 결과만 얻어서 사용한다면 결과가 매우 들쭉날쭉해서 써먹기 힘듬
따라서 과거의 여러 틱의 결과들을 합산해 그 평균을 사용하게 됨
이를 구현할 수 있는 가장 간단한 회로는 누적합을 구하다가 일정 틱마다 초기화시키는 회로임
하지만 이 회로는 초기화된 직후에 측정값의 신뢰성이 좋지 못하며 신뢰성이 계속 변화한다는 단점이 있음
그렇다고 과거의 값을 전부 기억하는 방법을 쓰려고 하니 상당히 많은(O(N)개의 메모리 셀) 조합기가 필요하게 됨
그래서 적은, 정확히는 일정 값 이하의 N에 대해 지난 N틱 동안의 누적합을 기억할 때 N에 상관없는 상수(O(1)개의 메모리 셀) 개의 조합기를 사용하는 회로가 있다면 좋을 것임
위 회로를 구현하는 방법을 다음과 같음
참고로 아마 N = 255임 (정확히는 게임 내 존재하는 신호의 종류 수에서 두세 개 빠진 양)
1 N틱을 주기로 1틱에 특정한 종류의 신호 하나를 1로 내보내고, 다음 틱엔 또 다른 신호를 1 내보내고, .. 이런 회로를 만듬
2 [각각 * 벨트아이템 = 각각] 조합기로 벨트의 산출량과 1의 출력값을 곱함
3 곱한 결과를 저장함, 저장하는 조합기는 [각각 > 0 이면 각각 출력]의 되먹임 조합기.
- 이때 2에서 벨트아이템의 제곱이 들어갈텐데 이걸 상쇄하도록 3에 벨트아이템이 -2억 정도로 지속적으로 공급됨
4 1의 출력값에 -20억을 곱해 2보다 1틱 먼저 3에 더해주는 회로를 만듬 (3에 저장된 값을 지우는 역할)
5 2와 3의 출력을 받아 [각각 + 0 = 벨트아이템] 을 만듬
6 5의 결과를 받아 N으로 나눠 사용
끝
구현은 없음 누가 해줘..
https://m.dcinside.com/board/factorio/55506?headid=40
이런거랑은
다른건가요?
아마 위에서 언급한 신뢰성이 달라지는 회로인 것 같습니다
그냥 틱 초기화 시점이 다른 5개정도의 메모리셀을 만들고 그거의 평균을 쓰면 적당히 신뢰도 높아지지않을까
1 N틱을 주기로 1틱에 특정한 종류의 신호 하나를 1로 내보내고, 다음 틱엔 또 다른 신호를 1 내보내고, .. 이런 회로를 만듬 <<< 여기서 이미 O(N) 되어버릴것같은 느낌이 드는데..
이렇게 구현할수도 있지 않을까.
모든 신호 1씩 가지고있는 산술조합기 다발을 만들고 300틱(300종류라고 치겠음) 마다 1틱짜리 펄스로 되먹임회로로 쏴줌
https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=31527
여기 나온기능 이용하면 internal prototype order로 정렬가능 -> 신호 중 우선순위가 제일 높은거 하나씩만 뽑아올 수 있음. 여기에 -1곱해서 되먹임회로로 다시 넣으면 다음 틱에는 그 다음 우선순위를 가진 애가 나오겠지?
이렇게 하면 내가 밑에서 말한 문제도 해결 가능할거같음. 300이 아니라 299틱마다 쏴주는걸로 하고 산술조합기에서 벨트아이템만 쏙 빼주면 됨
이건진짜 어처구니가 없는 해법이네 ㅋㅋ
다시 생각해보니까 이건 어려운게 아니네. 일정신호조합기로 철1,구리2,돌3,... 이렇게 번호하나하나 매기고 그냥 카운터 하나 돌려서 노란별==카운터 출력1 먹이면 끝나네. 일정신호조합기가 O(N/20)이긴 하지만
와 이런방법이
1번은 어떻게 만들지? 게임상 존재하는 모든 신호가 빙빙돌아가게 회로를 짠다쳐도 3번때문에 벨트아이템 신호는 못가서 이빨빠진 신호가 돼버리니깐 그거 상쇄하는 메커니즘도 추가해야할텐데. 그런다 쳐도 조합기 하나당 300틱정도만 저장할 수 있을거고. 어짜피 1틱에 벨트 하나에는 최대 아이템이 2개까지밖에 못 들어오니까 2비트단위로 쪼개서 시프트연산 먹이면 조합기 1개당 1만틱정도까지는 저장 가능하려나? 해석은 각각 mod 2^k로 한번 거른다음 합하면 되는거고..
나도 지금 이거 생각하고 있었는데 쉬프트로 계속 쌓아서 비트가 1인 개수 더하는게 괜찮아보이긴함. 당장 조합기 하나가 16틱 저장할수있는거고 그럼 조합기가 16개만 있어도 글에 나온 256틱정도까지는 저장할 수 있는거니깐
그냥 쉬프트는 2가 아니라 1씩만 하게 하고 만약이 인풋이 한틱에 2가 들어오면 두 틱에 나누어서 1씩 입력해주는식으로 처리 하면 저장량 두배 늘어날거고
두 틱으로 나누는건 진짜 괜찮네. 어짜피 바닐라에서는 초당 60이상 속도 벨트가 없으니깐..
바닐라 레벨에선 무리 없이 될것 같고 벨트 모드써서 벨트속도가 초당 60이 넘어버리면 한틱당 3개 이상씩도 들어올 수 있을것 같아서 이땐 문제가 될 수 있겠네