온라인 게임에서 NPC의 비중은 최소 최대 예상 PC의 5배수 이상인 경우가 많다. 그만큼 많은 NPC의 처리가 발생하게 된다.
이러한 상황에서 고려해야 할 상황을 정리해 보자~
1. 이동
- 특징: 주기성을 가지게 되어, 부하 분산 처리에 용의하다.
* 일정 주기 단위로(수초 이상) 이동 - 처리 부하 분산 목적
* 이동을 마친후 해당 위치에서 일정 시간 이상 대기 하도록 처리 - 처리 부하 분산 목적
- 이동 중 공격 발생에 대한 처리 상황
- 사용 가능 알고리즘
: 이동해야 할 객체를 판단하기 위해, 3x3 블럭별 Priority Queue 구성
- 이동전 블럭의 PQ에서 이동해야할 NPC를 얻어 이동할 블럭의 PQ로 저장
* 제한: 블럭당 최대 NPC갯수 지정을 통해, NPC가 한곳으로 모이는 것을 방지
* 단점: 블럭별 PQ 할당으로 인해 메모리 소모 - 해결 위해 메모리 풀 사용
. PQ를 사용하는 이유:
NPC의 이동이 발생됨을 event화 하기 위해. (PQ의 정렬키는 - 이동 시작 시간)
- 이동 상태에서 공격 상태로 전환시, 해당 NPC의 이동 처리를 공격 대상 PC와 일치 시키기 위해,
블럭의 PQ에서 해당 NPC을 제거 하고, 블럭의 list 에 추가 관리 - list의 상대적 처리 속도 빠름
* NPC를 해당 PC에 attach시키지 않는 이유는 NPC와 PC의 이동 간격이 일정 거리 이상 멀어질
경우, NPC의 공격 상태를 복구 시키기 위해서 이다.
2. 공격
- 특징: 주기성이 무시되는 경우가 많고, target로 설정된 객체를 감시해야 한다.
* 공격을 위한 최소 이동 시간 설정이 필요
: 예를 들어, 기본 이동 interval이 0.5초인 경우 공격을 위한 최소 이동 시간은 0.25초로 하여 PC의
이동 및 공격에 가능한 빠른 대처가 가능하도록 한다.
: 빠른 공격을 위해, interval 시간을 적게 사용하는 경우 서버는 상대적으로 공격 처리중인 객체 수에
따라, CPU 부하가 높아서 타 PC 또는 NPC에 영향을 줄수 있음을 명심하자!
- 사용 가능 알고리즘
: 공격 중인 NPC는 기존의 PQ에서 관리하지 않는다.
* PQ는 remove(), insert()시 기존 list 이상의 CPU를 사용하는 단점을 가지고 있다.
* 공격 대상의 상태에 따라, 이동 변화 및 공격 처리가 빈번히 바뀔수 있기 때문에 상대적으로
메모리에서 제거 하거나, 위치 변경등의 처리가 쉬운 list를 사용한다.
관심분야/게임