• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Npc 퀘스트 탐색

23.07.12 22:44 작성 조회수 181

0

안녕하세요

각 NPC가 퀘스트 목록들이 있는 퀘스트 그룹을 가지고있는데

이 퀘스트가 가능한지 조건 검사를 어떻게 해야할지 고민입니다.

제가 생각한건 각 NPC가 퀘스트 목록들이 있는 퀘스트 그룹 변수를 가지고있고

0.2초마다 각 퀘스트 목록에 condition을 체크해서 발생 가능한 퀘스트면 NPC가 퀘스트를 주는거를 생각했는데 문득 이런 방식이 NPC도 많고 검사할 퀘스트도 많다보니까 성능에 영향이 갈거같은 생각이 들어서 혹이 보통 어떤식으로 NPC를 활용해서 퀘스트를 주는지 궁금합니다. ㅜㅜ

답변 1

답변을 작성해보세요.

0

안녕하세요.

조건 검사는 수강생분께서 최초에 생각하신 일정 주기마다 검사하는 방식이 가장 간편합니다. 퍼포먼스 이슈가 걱정이라고 하셨는데, 가령 한 Scene에 100명의 NPC가 있고, 각 NPC가 10개의 Quest를 가지고 있다한들 총 검사 수는 1000번 밖에 되지 않습니다. 1000번의 검사가 모두 복잡한 수식을 거치는게 아닌 이상 퍼포먼스 이슈가 발생하긴 힘듭니다. 이것도 최악을 가정한 것이고, 보통 한 Scene에 Quest를 주는 NPC가 100명씩 나오는 일이 없다는 것을 생각해보면, 조건 검사 때문에 퍼포먼스 이슈가 생길 확률은 한 없이 0에 가깝습니다.

퍼포먼스에 관한 태도는 "퍼포먼스 이슈가 생길거 같은데?->다른 방법이 없나?"보다는 "퍼포먼스 이슈가 생기네?->다른 방법이 없나?"로 접근하시는게 좋습니다. 유명한 프로그래밍 명언 중 "섣부른 최적화는 만악의 근원이다."라는 말이 있습니다. 확실하지 않은 퍼포먼스 이익을 위해 시간 낭비와 코드를 엉망으로 만드는 행위를 하지 말라는 의미입니다. 일단 구조적으로 가장 깔끔하다고 생각되는 방식으로 진행해보고, 퍼포먼스 이슈가 생기면 그때 개선 작업을 하는게 좋습니다. 생기지도 않을 일을 먼저 걱정하는건 개발 시간 낭비니까요.

또 다른 방식으로는 Event 기반 프로그래밍으로 Event 호출에 맞춰 조건 검사를 하는 것입니다. 예를 들어, 캐릭터의 레벨이 10이되면 받을 수 있는 Quest가 있고, 이 Quest의 조건 검사 Module인 IsReachedLevel Action이 있다고 가정해보겠습니다. Quest가 Setup될 때 조건 Module(IsReachedLevel)도 Setup해서 IsReachedLevel이 플레이어 캐릭터의 Level이 바뀌었을 때 호출되는 Event(ex.onLevelChanged)에 Callback 함수를 연결하도록 합니다. Callback 함수가 호출됐다는건 플레이어 캐릭터의 Level이 바뀌었다는 얘기이므로, 이 함수에서 플레이어 캐릭터의 Level이 조건 Level에 도달했는지 여부를 판단하고, IsPass Property 같은걸 만들어서 값을 기록합니다. 그리고 Quest는 주기적으로 조건 검사 Module의 IsPass Property가 true인지를 확인합니다. 이렇게하면 Quest가 주기적으로 검사해야하는건 똑같지만, 처음 방식이 일정 주기마다 조건 검사 로직을 실행하는 것과 달리, 이 방식은 기록된 결과가 true인지만 확인하면되기에 약간의 퍼포먼스 이익이 있을겁니다.

조금 복잡하죠? 개발자가 Event를 세세하게 다룰 수 있어야하기 때문에 난이도도 조금 있는 방식입니다. 혹시나 오해하실까봐 말씀드리자면 Event 방식이 일정 주기마다 검사 로직을 실행하는 방식보다 더 나은 방식이 아닙니다. 그저 병행할 수 있는 또 다른 방식일 뿐입니다.

결론적으로, 생각하신대로 해보시고 퍼포먼스 이슈가 발생하면 그때 프로파일러로 어디서 문제가 발생하는지 확인하여 개선하시면 될 것 같습니다.

감사합니다!! 이해가 쏙쏙되네요!!