공장 틱
커피 스테인 스튜디오는 업데이트 3에서 병렬화(즉, 멀티스레딩)를 추가했습니다.
이 시스템은 공장 틱에 의존합니다.
공장 틱은 거의 모든 공장 처리 주기에서 실행되는 특별한 기능입니다. 이 틱은 공장 기계가 멀리 떨어진 플레이어로 인해 일반적으로 대기 상태로 전환될 때 물건을 처리하고, 아이템을 전송하고, 전력을 생성하는 등의 작업을 수행할 수 있게 합니다. CSS는 모든 기계 틱을 처리하기 위해 여러 스레드를 생성할 수 있지만, 이 기능에 대한 추가 작업이 없으면 많은 동기화 문제로 인해 잘 작동하지 않을 것입니다.
공장 틱 처리는 새로 생성된 스레드에서만 발생하지 않습니다.
일부 틱(로드 밸런서가 어떤 건물이 어떤 스레드에서 틱을 수행할지 결정함)은 메인 스레드에서 발생합니다.
메인 스레드는 실제로 대부분의 게임 플레이가 발생하는 스레드입니다.
메인 스레드는 입력, 렌더링, 물리 업데이트 등을 처리합니다.
이로 인해 많은 언리얼 엔진 함수는 메인 스레드에서 실행되도록 보장하는 시스템을 구현합니다. 이러한 함수의 예로는 즉, 공장 틱 내에서 이 기능을 호출하면 처음에는 작동하는 것처럼 보일 수 있지만, 기다리면 로드 밸런서가 다른 스레드에서 공장 틱을 실행하기로 결정하면 게임이 실제로 충돌할 수 있습니다. 따라서 공장 틱 내에서 이러한 특별한 함수를 호출해서는 안 됩니다. 대신, 코드를 재구성하여 메인 스레드에서 수행될 수 있도록 해야 합니다. |
공장 틱은 여러 스레드에서 처리되며, 이들은 메인 게임 루프에서 생성됩니다. 실행될 때, 오직 공장 틱만 해당 시간 동안 실행되며, 다른 것은 없습니다. 렌더링도 없고, 입력도 없고, 아무것도 없습니다. 하지만 여러 틱이 동시에 실행됩니다.
즉, 공장 틱에서 수행하는 변경 사항은 공장 외의 다른 것들이 실행되기 전에 완료될 것임을 확신할 수 있습니다(예: 시각적 업데이트나 "정상" 언리얼 엔진 틱).
이것은 스레드 안전성을 무시할 수 있다는 의미가 아닙니다! 즉, 다른 공장 틱이 동시에 읽을 수 있으므로 메모리에 쓰지 않도록 해야 합니다. 대부분의 경우 이러한 일이 자주 발생하지 않겠지만, 항상 알고 있는 것이 좋으므로 스레드 안전성에 대해 연구해 주십시오. 이것은 또한 공장 틱에 블루프린트 코딩을 사용해서는 안 되는 이유입니다! 블루프린트에서는 무엇이 안전한지, 무엇이 안전하지 않은지 정확히 알 수 없으며, 대부분의 경우 불명확하거나 레이블이 없습니다. 만약 이를 잊어버린다면, 나쁜 일이 발생할 가능성이 높습니다. C++에서는 뮤텍스와 같은 멀티스레딩 솔루션을 구현하여 다른 스레드가 동시에 읽거나 쓸 수 있는 메모리에 여전히 쓸 수 있도록 할 수 있으므로, 공장 틱 관련 코드를 C++에서 작성하는 것이 좋습니다. |
공장 시뮬레이션 시간과 게임 시간
공장 틱은 일관된 비율로 작동하도록 설계되었습니다. 게임의 프레임 속도와 달리, 이는 지연 스파이크에 따라 변동할 수 있습니다. 이로 인해 "공장 시간"이 언리얼의 "게임 시간" 측정보다 뒤처질 수 있으며, 일부 공장 틱은 높은 델타 시간 상황에서 건너뛰어질 수 있습니다.
디스코드에서 Ben에 따르면:
모드가
게임 시간
==공장 시뮬레이션 시간
을 가정하면 항상 약간의 오차가 발생합니다. 게임 시간은 프레임당 발생하는 일을 계산하는 데 걸리는 시간과 같습니다. 공장 시간은 클램프되어 있어 극단적인 값을 얻지 않습니다. 따라서 FPS가 몇 프레임 떨어지면 이상한 동작이 발생하지 않습니다. 이것은 또한 공장 시뮬레이션이 "잃어버린" 시간을 의미합니다. 예를 들어, 게임이 81초 동안 실행되고 있다면, 게임 시간은 총 81초가 됩니다. 하지만 프레임 드롭/지연 등에 따라 공장 시뮬레이션은 79.x 초일 수 있습니다. 따라서 그 모드가 게임 시간이 공장 시뮬레이션 시간과 동일하다고 가정하면, 제공하는 정보는 항상 잘못될 것입니다.