[Error] Unity Jittering in Network

qweasfjbv·2025년 3월 10일

Error

목록 보기
7/7
post-thumbnail

개요


멀티플레이를 만들 면서 동기화를 제대로 구현하지 못하거나 그 외에 특정 상황에서 Jittering 이라는 덜덜 떨리는 현상이 일어납니다.
Jittering 이 왜 일어나고 어떻게 해야 해결할 수 있는지 확인해보겠습니다.

구현


1. 물리연산과 동기화의 충돌

Unity에서 Jittering은 물리 연산과 Transform 동기화 사이에서 자주 일어납니다.

위 영상은 캐릭터이기도 하고 GIF로 바꾸다보니 잘 안보이지만, 물체가 좀 더 커지면 문제가 확 보이게 됩니다.

일반적으로, 이런 현상이 일어나는 이유는 두 개 ( 혹은 그 이상의 ) 코드가 하나의 오브젝트에 간섭했기 때문입니다.

우선 멀티플레이 환경에서 하나의 오브젝트라고 하더라도, 각 클라이언트에서 보이는 물체는 다른 물체라고 생각해야합니다.

공 튀기기를 예로 들어 보겠습니다.

Host와 Client에서 각자 물리연산을 하면서 Host에서 Client에게 위치 동기화 정보를 전달하는 상황입니다.
Host에서 Client까지 정보를 전달하는 데 시간이 걸리고, 그 시간동안 Client의 물리연산에 의해 오차가 발생합니다.
그 과정에서 속도의 차이가 생기면서 보간, 보정등의 연산과 함께 Jittering이 지속됩니다.


이걸 해결하는 방법은 아주 간단합니다.
1. Client 에서의 물리연산을 막고 Host에서만 물리연산 후 ClientRPC로 모두에게 위치 알리기
2. Host 에서의 물리연산을 막고 Client 에서 위치를 Host에게 알리기

제일 안전한 방법은 Host에서만 물리연산을 하는 것이지만, 그렇게하면 키 딜레이가 생기게 됩니다.
반대로 Client에서 모든걸 연산하고 Host에게 알리면 치팅을 쓰는것을 허용하게 될 수도 있습니다.

일단 클라이언트에서 실행을 한 뒤에, 서버에서 키 입력을 통해 시뮬레이션 한 결과와 크게 다르면 동기화하는 방식으로 절충하기도 합니다. (Client-side prediection)



2. Update와 FixedUpdate의 충돌

유니티에서 Render나 Transform 조작은 Update 주기에, 물리연산은 FixedUpdate 주기에 연산합니다.
따라서 해당 주기를 잘 맞춰주지 않으면 Jittering 이 발생하게 됩니다.

위 그림은 빨간색은 Update, 파란색은 FixedUpdate에서 위치를 갱신하며 오른쪽으로 이동하는 모습입니다.
시간에 따라 빨간색과 파란색의 위치가 계속 바뀌는 모습을 확인하실 수 있습니다.

물론, 그냥 옆에서 보면 둘 다 비슷하게 지나가는 것 처럼 보일 수 있지만 둘 중 한 쪽에 카메라가 붙어있다면 파란색이 빠르게 떨리는 것 처럼 보이게 됩니다.

위 영상이 실제로 해당 주기를 맞춰주지 않아서 생긴 Jitter 입니다.


주기가 맞지 않기 때문에 생긴 Jitter는 주기를 맞춰주면 당연히 해결됩니다.

Update 에 있는 로직을 FixedUpdate로 넣기에는 Input과 연결된 경우가 많거나 꺼려지는 경우가 많고, FixedUpdate에서의 물리연산은 엔진 내부에 있기 때문에 Update 로 옮기지 못합니다.

이런 경우에는 Rigidbody 컴포넌트의 Interpolate 기능을 사용하면 물리 연산이 Update 주기에도 부드럽게 연산되기 때문에 해결할 수 있습니다.

마무리


두 가지 Jitter 가 일어날 수 있는 상황을 겪고, 원인을 찾아 해결해보았습니다.

첫 번째 Jitter의 경우에는 멀티환경에서만 나타나기도 하고, 비교적 원인을 찾기 쉬웠습니다.
하지만 두 번째 Jitter의 경우에는 로컬 환경에서도 나타날 수 있는 에러이며, UpdateFixedUpdate 주기의 차이를 생각해내지 못하면 해결하기 힘든 에러였습니다.

0개의 댓글