Version: 2017.3
자신만의 Unity 네트워킹 서버 구축(레거시)
레거시 에셋 번들

네트워크 대역폭 최소화(레거시)

(새 프로젝트에는 5.1에서 도입된 새로운 네트워킹 시스템을 사용해야 합니다. 다음 내용은 이전 네트워킹 시스템을 사용하는 레거시 프로젝트를 대상으로 작성되었습니다.)

네트워크 통신은 게임의 다른 부분에 비해 비교적 느릴 수 있으므로 이를 최소화하는 것이 중요합니다. 따라서 주고받는 데이터 양과 데이터를 주고받는 빈도를 고려하는 것이 아주 중요합니다.

데이터 동기화 방식

네트워크 대역폭의 사용량은 데이터를 동기화하기 위해 Unreliable 모드를 사용하는지 Reliable Delta Compression 모드를 사용하는지에 따라 크게 좌우됩니다. 모드는 Network View 컴포넌트에서 설정할 수 있습니다.

Unreliable 모드에서는 동기화되는 오브젝트 전체가 네트워크 업데이트 루프가 반복될 때마다 전송됩니다. 업데이트 빈도는 Network.sendRate의 값을 따르며, 기본값은 초당 15번입니다. Unreliable 모드에서는 업데이트가 자주 발생하지만, 손실되거나 지연된 패킷은 쉽게 무시됩니다. 오브젝트의 상태가 자주 변경되고 놓친 업데이트의 효과가 아주 짧게 지속될 때 사용할 수 있는 최고의 동기화 모드입니다. 하지만 업데이트마다 전송되는 데이터 양을 고려해야 합니다. 예를 들어, 트랜스폼을 동기화하는 경우 3 개의 플로트를 각각 가지는 3개의 Vector3s를 전송해야 하므로, 9개의 플로트 값을 전송해야 합니다. 이는 업데이트당 36바이트를 전송해야 한다는 의미입니다. 서버가 8개의 클라이언트로 실행되고 디폴트 업데이트 빈도를 사용하고 있다면 초당 4,320KB(8\36\15) 또는 초당 34.6Kb를 수신하고, 초당 30.2KB(8\7\36\*15) 또는 초당 242Kb를 전송한다는 의미입니다. 업데이트의 빈도를 줄임으로써 대역폭의 소모를 줄일 수 있지만 기본값인 15는 액션이 빠르게 진행되는 게임에 일반적으로 적합한 값입니다.

Reliable Delta Compressed 모드에서는 데이터가 안정적으로 올바른 순서대로 전송됩니다. 패킷이 손실된 경우 패킷이 다시 전송되며, 순서가 다를 경우 시퀀스의 패킷이 모두 도착할 때까지 버퍼링됩니다. 이 모드에서는 전송된 데이터가 올바르게 전달되지만, 대기 시간과 재전송 과정으로 인해 대역폭 사용이 증가합니다. 하지만 데이터는 델타 압축되므로 이전 상태와 현재 상태의 차이점만 전송됩니다. 두 상태가 일치하는 경우 아무 정보도 전송되지 않습니다. 따라서 델타 압축의 이점은 상태가 얼마나 변하는지, 또는 상태가 변경되는 정도와 프로퍼티에 따라 달라집니다.

동기화되는 데이터

상태가 모든 클라이언트에서 동일하게 표시되도록 게임을 독창적으로 설계하는 방법은 다양합니다. 예를 들어, 애니메이션이 동기화되는 경우를 들 수 있습니다. Animation 컴포넌트가 네트워크 뷰에서 관찰되는 경우 이 프로퍼티는 정확하게 동기화되어 애니메이션 프레임이 모든 클라이언트에서 동일하게 표시됩니다. 어떤 경우에서는 바람직할 수 있지만 일반적으로 캐릭터가 걷거나, 뛰거나, 점프하는 것으로 보이는 것만으로도 충분합니다. 따라서 애니메이션은 어떤 애니메이션 시퀀스를 재생할지를 나타내는 정수 값을 보내는 것만으로도 대충 동기화할 수 있습니다. 이렇게 하면 Animation 컴포넌트 전체를 동기화하는 것에 비해 대역폭 소모를 크게 줄일 수 있습니다.

데이터 동기화 시기

모든 클라이언트에서 게임을 계속 완벽하게 동기화할 필요가 없는 경우가 많습니다. 예를 들어, 플레이어가 일시적으로 게임 월드의 다른 영역에 있어 서로 마주치지 않는 경우입니다. 이 때는 상호작용할 수 있는 클라이언트만 동기화를 유지하면 되므로 서버로의 로딩뿐만 아니라 대역폭도 줄일 수 있습니다. 때로는 이러한 개념을 관련 집합 이라고 합니다. 즉, 전체 게임에서 특정 시간에 특정 클라이언트와 관련 있는 하위 집합이 있는 것입니다. 상태 업데이트의 대상을 더 잘 제어할 수 있기 때문에, 관련 집합에 따라 클라이언트를 동기화하는 것은 RPC로 처리될 수 있습니다.

레벨 로딩

레벨 로딩의 경우 각 클라이언트는 다른 클라이언트가 플레이할 레벨을 초기화할 때까지 대기만 하면 되므로 대역폭 사용량에 대해 걱정할 필요는 없습니다. 레벨 로딩은 이미지나 오디오 데이터를 비롯한 상당히 큰 용량의 데이터 항목을 전송하는 과정을 포함하기도 합니다.

자신만의 Unity 네트워킹 서버 구축(레거시)
레거시 에셋 번들
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961