Action disabled: source

네트워크 대역폭 최소화(Minimizing Network Bandwidth)

네트워크를 통하여 어떤 종류의 데이터를 보낼지 생각하는 것은 중요합니다. 이상적으로는, 모든 클라이언트들에게 게임이 정확하게 작동할 수 있게 만드는 가장 적은 데이터를 보내야 합니다.

데이터는 어떻게 동기화 되는가

데이터를 어떻게 동기화하는가 하는 것이 사용하는 대역폭에 영향을 줍니다. 네트워크 보기(Network View)에서 Unreliable또는 Reliable Delta Compression의 선택이 있습니다.

Unreliable는 각각의 네트워크 업데이트 룹 (update loop)의 반복마다 모두 보내어지는 것입니다. 업데이트 룹은 Network.sendRate에 의해 설정 되는 것(디폴트: 초당 15번) 에 따라 수행됩니다. Unreliable을 사용하여, 정보의 빈번한 업데이트를 보장하며, 업데이트가 누락되거나 연기되는 것에 신경을 안 써도 됩니다. 누락되거나 밀린 패킷(packet)들은 무시됩니다. 종종 변하는 오브젝트들에게는 이 설정이 동기화를 위한 가장 좋은 방법입니다.

끊임없이 보내지는 데이터의 양을 명심하세요. 예를 들어, 변환을 동기화하면, 9 부동소수점 값을 보내는데, 업데이트마다 36바이트며, 초당 288바이트를 보내게 됩니다. 만약 서버가 8클라이언트를 수행하면 서버는(8*36*15) 4,320 KBytes/s 또는 34,6Kbits/s 를 받고, (8*7*36*15) 30,2 KBytes/s 또는 242Kbits/s 를 보내야 합니다.

네트워크 업데이트에서 보내기 비율을 감소하여, 대역폭에 극적인 효과를 가질 수 있습니다. 이는 게임에 의존하지만, 빠른 진행속도의 게임은 매우 높을 수 있습니다 (15정도).

Reliable Delta Compressed는 데이터가 안정적으로, 순차적으로 보내어지는 것을 의미합니다. 만약 순서가 맞지 않는 패킷들이 도착하면, 정확한 패킷이 있을 때까지 기다립니다. 데이터 또한 “delta compressed” 되는데 이는 마지막 보내어진 상태와 현재의 상태 사이의 차이가 보내어짐을 의미합니다. 차이가 없으면, 아무것도 보내어지지 않습니다. 이는 게임 진행 동안 얼마나 정적인가에 따라 오브젝트들에 사용/할당되는 대역폭을 줄입니다.

어떤 데이터가 동기화 되는가

게임이 어떻게 동기화 될지 (즉, 모든 클라이언트에 동일하게 보이는 것)를 시도하고 창조적으로 생각하는 것은 중요합니다. 모든 것이 정확하게 동일할 필요는 없을 수도 있습니다. 좋은 예는 애니메이션 동기화 입니다. 만약 캐릭터가 걷고 뛰고 달리는 등의 모든 종류의 애니메이션을 가진다면, 동일하게 보이길 원하지만 완전히 동일할 필요는 없습니다. 네트워크 보기에 관측된 컴포넌트로서 Animation 컴포넌트를 직접 넣는다면, 정확히 동기화 됩니다. 시간과 상태 그리고 사용가능 이진수(enable Boolean)를 보냅니다. T이는 시간이 변하는 동안 많은 트래픽을 낳지만, 이 방법의 쉽고 효과적인 대안이 있습니다. 이는 하나의 char 값을 직렬화(serialize)하는 네트워크 애니메이션 스크립트로 만드는 방법입니다. 그리고, 애니메이션 스크립트 안에, 이 네트워크 스크립트로 메시지를 보내고 현재의 애니메이션 상태를 알립니다. 매 애니메이션 변화 시간에 오직 하나의 char 값이 보내어 지는데, 억지 기법(brute force)으로 애니메이션을 동기화 하는 것에 비하면 아주 작은 양입니다.

언제 데이터를 동기화 하는가

모든 클라이언트에게 항상 게임이 동기화 되는 게 필요할까요? 커다란 빌딩들이 넘쳐나는 장소에 또는 숲으로 혹은 언덕 아래위로 들어가는 큰 경주 트랙이 있는 게임을 상상해 보십시오. 클라이언트 하나가 다른 클라이언트의 시야에 있지 않으면, 그들을 동기화 해야 할 필요가 없습니다. 서버는 모두에게 모든 정보를 알릴 필요가 없으므로, 이는 서버의 부하를 크게 감소 시킵니다. 이는 Relevant Sets을 사용한다고 부릅니다. 즉, 각 클라이언트의 관련 집합(받을 필요가 있는 데이터를 정의)을 가집니다. 목표 범위가 강한 컨트롤을 가지므로 이는 RPC등을 통해서만 이뤄져야 합니다. RPC들에게 누가 수신을 해야 하는 지에 관한 자신의 논리에 기반하여 네트워크 플레이어들을 알려줍니다.

Level loading

대역폭에 관해 언제 신경을 써야 하는 가에 대한 하나의 예외는 시작 시 또는 레벨 로딩 시 입니다. 게임을 초기화 하기 위해서 큰 데이터들을 보내는 것은 괜찮습니다. 왜냐하면, 각 클라이언트는 모두가 준비될 때까지 기다려야 하기 때문입니다. 심지어, 질감(texture)이나 그림 데이터를 보내어 플레이어들이 그들의 아바타 들을 커스터마이징(customizing) 하게 할 수 있습니다.

역링크