본문 바로가기

관심분야/게임

NPC의 이동 관리

1) MOVE를 통보(Notify)받는 NPC에 대한 Priority Queue 관리
     : 해당 처리를 통해 NPC가 플레이어가 존재하는 블럭에서만 이동할수 있도록 할수  있다.

       - Priority Queue는 전체 NPC를 한번에 처리 하지 않는 구조에 적합하며,
         전체 NPC를 한번에 처리해야 하는 구조에서는 일반 list 처리가 빠른 성능을 보인다.

       - 해당 방식을 사용하기 위해서는 전체 NPC의 처리가 특정 시간에 집중 되지 않도록 분포시키는 기법이
         중요하다.

         : 예를 들어, 전투/선공 상태의 NPC를 우선 처리하는 기법이 사용될수 있다.
         : 또한 Priority Queue의 insert/remove 시간을 줄이기 위해 형태별 독립된 Queue의 구성도 고려될수
           있다.

         : 이러한 처리를 통해, CPU로드 증가시 우선순위가 높은 NPC를 선처리 할수 있다.

     : CPU로드 증가 예상 원인
       - Priority Queue의 잦은 위치 변화가 발생되는 처리 구조는 배제하여야 한다.
       - 이를 위해 전체 NPC를 하나의 Priority Queue에 등록하고, 해당 NPC의 이동 가능 시간을 MOVE를
         사용해 갱신하여 처리 하는 방식으로 구성해야 한다.

         npc_class *npc;

         while ((npc = pq_top( npc_queue)) != NULL)
         {
             if (npc->moving_time < current_time)
                break;
             else {
                 // live_time은 MOVE 발생시 시간을 갱신한다.
                 if (npc->live_time >= current_time)
                 {
                    ...
                 }

                 // time_status가 일반/전투/선공/리젠 상태에 따라 별도의 시간 적용
                 npc->moving_time = current_time + npc->next_time[npc->time_status];
             } pq_update( npc);
         }

        - Priority Queue: http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Priority-Q/
          : 기본 정렬 알고리즘은 Heap 소팅을 사용(Heap Tree?)

  2) Priority Queue에 저장된 NPC정보의 시간 재 설정은 처리 발생시 하도록 한다.
     : 잦은 Priority Queue의 갱신은 CPU 로드 증가의 원인이 된다.
     : 일반 이동 상태일 경우 전투 발생
       - 몬스터의 이동을 전투 발생 지점에서 멈추고, 잔여 이동 시간을 전투 공격 대기시간으로 처리하여,
          Priority Queue의 갱신을 없앤다.

       - 해당 처리를 위해서는 일반 이동 상태의 최대 이동 시간의 결정이 필요하다.
         : 최대 이동 시간이 작다면 몬스터의 반응이 빨라지게 되며, 크다면 몬스터는 늦게 반응하게 된다.

       - 일반 이동중인 상태에서 공격이 발생될 경우, 전투대기 시간 이상의 시간차가 존재하는 경우, 이동
         받은 상태에서 몬스터가 해당 플레이어를 공격하는 처리루틴을 구현하도록 하여 위의 오차를 최소화 한다.

  3) 전투/선공 상태의 NPC는 주변 객체(NPC 및 플레이어)의 이동(MOVING)이 발생될때 마다 이동 결정한다. (PathFinding 알고리즘 선택 중요)

     : MOVING은 일정 주기로 발생되도록 유지해야 한다.
       - 잦은 이벤트 발생은 NPC의 처리로 인한 CPU로드의 원인이 된다.

* MOVIE       시야로 이동이 발생(전 또는 후에 시야 밖/안으로 이동)
* MOVING     시야내에서 이동 발생