1:22 · broadcast N² · AOI · view radius · boss fight

보스가 뜨면 왜 렉이 걸릴까?

MMO에서 보스가 등장하면 왜 렉이 걸리는지 설명하는 영상이다. 한곳에 모인 인원이 N명이면 서버가 보내야 할 상태 갱신은 N × (N − 1)로 늘고, 시야 반경을 넓히면 보이는 인원이 반경의 제곱으로 늘어 부담이 더 커진다. 게임은 보내는 양을 줄이거나 한곳에 모이는 인원을 나누는 방식으로 대응한다.

01사람이 몰린다

보스가 뜨는 순간, 흩어져 있던 플레이어가 한곳으로 · ▶ 이 장면 보기

화면의 점 200개가 플레이어다. 평소에는 맵 전체에 흩어져 있어서 서로 보이지 않고, 서버가 서로에게 전해 줄 것도 적다.

보스가 등장하면 플레이어가 보스 주변 타원 안으로 모여든다. 왼쪽 아래의 보스 주변 인원 숫자가 이동에 따라 올라가 최대 200명에 이른다. 같은 존, 같은 시야 안에 수십에서 수백 명이 들어오는 상황이 이후 모든 문제의 출발점이다.

02브로드캐스트는 N × (N − 1)

한 명의 변화를 보는 사람 모두에게 복제해서 보낸다 · ▶ 이 장면 보기

한 명이 움직이면 서버는 그 변화를 그 사람을 보고 있는 나머지 N − 1명에게 각각 복제해서 보낸다. N명 모두 움직이면 한 틱에 보내야 할 갱신은 N × (N − 1)이다. 왼쪽 그림에서 연결선이 인원 증가에 따라 빠르게 빽빽해진다.

오른쪽 표는 이동만 계산한 틱당 브로드캐스트 수다.

200명이면 틱당 39,800 갱신이고, 20Hz로 곱하면 초당 796,000 갱신이다. 갱신당 50바이트로 잡으면 약 40MB/s, 약 320Mbps가 존 서버 하나에서 나간다. 갱신은 보통 클라이언트마다 틱당 패킷 하나로 묶어 보내므로 패킷 수는 N × 20 = 4,000개 수준이고, 인원의 제곱으로 느는 것은 바이트다.

이동뿐 아니라 공격, 이펙트, 버프 등 상태 하나가 바뀔 때마다 보는 사람 수만큼 복제된다. 그래서 비용은 인원의 제곱으로 늘고, 200명은 20명보다 갱신이 10배가 아니라 약 100배 많다.

03시야가 넓으면 더 나빠진다

반경이 2배면 보이는 사람은 약 4배 · ▶ 이 장면 보기

왼쪽은 시야 반경 r, 오른쪽은 반경 2r이다. 같은 필드에서 원 안에 들어온 점의 수가 각 패널 오른쪽 위에 보이는 인원으로 표시된다.

04보스 전투가 더하는 것

광역기 · 이펙트 · AI · HP 갱신도 모두 인원과 함께 곱으로 커진다 · ▶ 이 장면 보기

보스 전투는 이동 외에도 인원과 함께 곱으로 커지는 일을 더 만든다.

05어디서 터지나

서버 CPU · 틱 · 아웃바운드 · 클라 수신 · 렌더가 함께 오른다 · ▶ 이 장면 보기

보스 주변 인원이 20명에서 200명으로 늘어나는 동안 다섯 개 지표가 함께 움직인다. 다섯 가지는 모두 인원 N에서 각각 나오는 결과다.

인프라 쪽에서는 보스 시간대에 특정 존 서버만 아웃바운드 pps와 대역폭이 급등하고, 한 코어가 100%가 되고, 연결 끊김이 늘어나는 형태로 보인다. 위 수치는 인원에 따라 늘어나는 모양을 보여주기 위한 계산값이다.

06게임은 이렇게 줄인다

보내는 양을 줄이거나, 모이는 인원을 나눈다 · ▶ 이 장면 보기

왼쪽 그림은 거리별 갱신 빈도다. 가까운 대상은 자주, 먼 대상은 드물게 갱신한다. 오른쪽에 게임이 쓰는 대응 방법 여섯 가지가 나온다.

정리하면 보스전 렉 대응은 보내는 양(N², r²)을 줄이거나 한곳에 모이는 N을 나누는 것이다.

이 영상에 나온 용어는 용어집에 정리했다.