UE4 에 잘 알려지지 않은 기능 중 하나로, 'physics sub-stepping'(피직스 서브 스테핑)이라는 것이 있습니다. 이 옵션을 켜 주면, 보다 정확하고 안정적인 피직스 시뮬레이션을 얻을 수 있습니다. 가장 눈에 띄게 좋아지는 부분은, 래그돌 지터링이나 기타 복잡한 피지컬 애셋 관련 문제입니다.
서브 스테핑은 프로젝트의 피직스 세팅에서 켤 수 있습니다:
이 기능은 아직 작업중인 기능으로, APEX 디스트럭션에 완벽 지원되지 않습니다. 또한 현재 모바일 디바이스에도 지원되지 않으나, 모양과 느낌을 크게 향상시킬 수 있기에 지원하는 쪽으로 작업중입니다.
어떤 작업을 하나요?
UE4 는 가변 프레임 속도를 사용합니다. 그러면 하드웨어 범위성(scalability)이 좋아지는 반면 피직스 엔진에게는 힘들어지는 것이, 시간이 작게 고정된 단계에서 최상으로 작동하기 때문입니다. 서브 스테핑은 총 프레임 시간을 구한 다음 서브 스텝 수로 나눕니다. 그런 다음 피직스 시뮬레이션을 한 프레임에 여러 번 틱시킵니다. 서브 스텝 횟수는 최대 서브 스텝 경과 시간을 얼마나 작게 설정했는지에 따라 달라집니다. 최대 서브 스텝 시간이 짧아질 수록 시뮬레이션의 안정성은 높아지지만, GPU 비용도 높아집니다.
실제 어떻게 작동하나요?
서브 스테핑은 사용자에게서 완전히 숨겨져 있습니다. 즉 피직스 엔진으로의 일부 호출은 보간 및 유지되어야 한다는 뜻입니다. 예를 들어 사용자가 한 프레임동안 하나의 액터에 힘을 가한다면, 그 프레임은 내부적으로 N 회 서브 스테핑되며, 같은 가속도를 얻기 위해서는 N 회 연속 시뮬레이션 스텝 동안 그 힘을 적용해 줘야 합니다. 그와 비슷하게 사용자가 액터의 타겟 위치를 설정한 경우, 여러 서브 스텝에 걸쳐 해당 타겟 위치로 보간을 해야 원하는 속력을 유지할 수 있습니다. 이러한 모든 디테일은 이미 UE4 내부적으로 처리되지만, 필요한 작업 처리를 위한 CPU 와 메모리 비용이 있습니다.
또 한 가지 알아둬야 할 기술적인 디테일은, 서브 스테핑 도중의 콜리전 콜백 작동방식입니다. UE4 는 별도의 피직스 스레드에 피직스 서브 스테핑을 실행, 게임 스레드가 작업을 계속할 수 있도록 합니다. 최상의 퍼포먼스를 위해 마지막 서브 스텝 완료시까지 콜리전 콜백을 지연시킵니다. 즉 같은 콜리전에 대해 여러 개의 콜백을 얻을 수도 있다는 뜻입니다. 예를 들어 A 가 B 와 충돌하여 튕겨나가는 경우, 같은 프레임에서 A 와 B 가 겹쳤다는 것과 더이상 겹치지 않는다는 콜백을 동시에 받을 수도 있습니다. 내부적으로 모든 콜백은 큐 속에 푸시되므로, 서브 스텝 1 에서의 콜백은 서브 스텝 2 에서의 콜백 전에 처리될 수 있도록 합니다.
이 기능은 어떻게 켜나요?
게임의 필요에 따라 다릅니다. 복잡한 피직스 애셋을 사용중인 경우, 서브 스테핑을 켜면 상당한 퀄리티 향상이 있을 것입니다. 반면 피직스 시뮬레이션이 다른 기능만큼 중요하지 않은 경우, CPU 시간을 다른 곳에 쓰는 것이 나을 것입니다. 어떤 식으로든, 이 기능이 여러분의 게임에 도움이 될 것인지 시험해 볼 것을 강력 추천합니다!
질문이 있으신가요? 잊지 마시고 저희 포럼 에 들러주시기 바랍니다!