본문 바로가기

관심분야/게임

NPC 처리의 구성에서...

온라인 게임에서 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를 사용한다.