사용자 도구

사이트 도구


kb:areaofinterestmanagement

Area of Interest Management

플레이어의 시야를 기준으로, 플레이어가 볼 수 없는 사건에 대한 정보를 보내지 않음으로서, 각종 리소스를 절약하는 일을 말한다. 게임 서버를 만들 때 상당히 중요한 역할을 차지하는 부분이다.

무식한 방법

x, y = 이벤트.좌표;
for (플레이어 in 서버에 접속한 모든 플레이어)
{
    if (range(플레이어.좌표, (x, y)) < 플레이어.시야)
    {
        send(이벤트.정보);
    }
}

즉 이벤트가 발생했을 때, 서버에 접속해있는 모든 플레이어의 목록을 횡단하면서 시야를 검사한 후, 이벤트가 플레이어의 시야 안에서 발생했다면 이벤트 정보를 보내주는 것이다.

당연히 이런 식으로 서버 짰다가는 욕만 얻어먹는다. 조그만 게임이라면 상관없겠지만, 동시에 수천명이 접속해 있는 서버에서는 CPU 사용량, 대역폭이 감당할 수 없는 수준까지 올라가기 때문이다.

타일을 이용한 방법

가장 익숙하고 오래된 방법. 하나의 오브젝트는 좌표에 따라 하나의 타일에 속하게 된다. 이벤트 발생시 발생 지점의 좌표를 이용해 타일 좌표를 얻어낸 다음, 주위의 N타일에 속해 있는 오브젝트들에게 이벤트 정보를 뿌려주는 방식이다. N은 보통 고정값을 이용하게 된다.

ex, ey = 이벤트.좌표;
tx, ty = 타일 좌표로 변환(ex, ey)
for (y = ty - N; y < ty + N; ++y)
{
    for (x = tx - N; x < tx + N; ++x)
    {
        tile = 타일(x, y);
        tile.for_each_object(send(이벤트.정보))
    }
}

링크

다운로드

kb/areaofinterestmanagement.txt · 마지막으로 수정됨: 2014/11/08 13:05 (바깥 편집)