작성
·
67
·
수정됨
0
몬스터, 화살 이동 전부 독립적인 갱신 주기를 갖게 한 이후로 버그가 생긴 것 같습니다. 화살을 쏘는 동안에는 캐릭터가 안 움직여요.
원인은 화살이 50ms 단위로 일감을 예약하고 몬스터는 200ms로 일감을 예약하다 보니까 화살이 날아가는 중에는 화살의 Update만 호출될 수밖에 없더라고요. 최소 힙으로 예약 일감을 처리하니까요.
이를 쉽게 해결하는 건 몬스터랑 화살 둘 중에 하나를 TickRoom의 room.Update()에 넣어놓는 것인데 이건 임시방편 같고요. 헤딩해봐야 하겠지만 각 화살, 몬스터에 각각 잡큐를 두는 방식밖에 없는 것 같은데, 이런 식의 해결이 일반적인 방법에 가까울까요? 각 오브젝트마다 잡큐를 두는 것이? 실무에서 더 복잡하고 많은 오브젝트들이 처리돼야 할 때 해당 Zone에 하나만 잡큐를 두는 건 굉장히 비효율적인 것 같습니다.
뭐 어떻게든 돌아가면 되긴 하지만 정답은 없어도 오답이란 건 있으니까요. 지금처럼 GameRoom에 잡큐를 두었을 때는 투사체랑 다른 오브젝트들을 순차적으로 처리하는 건 무조건 문제가 생길 것 같고, room.Update()에 빼놓으면 갱신 주기를 조절하기 어려우니, 각각 잡큐를 두는 게 이상적인 것 같아서요.
답변 3
0
0
0
안녕하세요, 인프런 AI 인턴입니다. literate_t님.
MMORPG 게임 개발 시 화살과 몬스터의 갱신 주기 문제로 고민하고 계시군요. 투사체와 몬스터의 갱신 주기가 서로 달라서 발생하는 문제는 비동기적인 환경에서 자주 겪는 과제 중 하나입니다.
먼저, 문제를 해결하기 위한 두 가지 일반적인 접근 방식을 말씀드리겠습니다:
잡큐를 각 객체마다 두는 것: 각 객체가 독자적으로 자신의 갱신 주기를 가짐으로써, 갱신 주기에 따른 문제를 완화할 수 있습니다. 이 방식은 실제 실무에서도 채택하는 방식 중 하나입니다. 각 오브젝트가 독립적인 작업 큐를 가짐으로써, 서로의 영향을 받지 않고 독립적으로 작업을 처리할 수 있습니다. 특히, 대량의 오브젝트가 존재하는 환경에서는 이 방법이 효율적입니다.
Zone 기반의 통합 관리: 모든 오브젝트가 하나의 잡큐에서 관리를 받는 대신, Zone이나 영역별로 잡큐를 나누어 관리할 수도 있습니다. 이 방식은 게임의 규모가 크고 복잡할 경우 효율성을 높일 수 있습니다. Zone 단위로 나뉘어진 잡큐는 해당 Zone 안의 모든 오브젝트를 관리하며, 이렇게 할 경우 메모리와 CPU 사용량을 최적화할 수 있습니다.
이 외에도 게임 디자인에 따라 다양한 방법을 시도해볼 수 있습니다. 잡큐의 구현 방식이나 구조에 따라 파생되는 문제들을 면밀히 분석하고, 상황에 맞는 최적의 해결책을 적용하는 것이 중요합니다.
관련하여 지식공유자님께서 비슷한 문제로 답변한 내용들이 있습니다:
- 화살 쏘는 것을 처리하는 방식
- 화살이 안사라지는 증상과 관련한 질문 및 루키스님의 풍부한 해결 방법
이 링크들에서는 게임 객체의 작업 스케줄링 및 처리 방식에 대해 다양한 시각과 방법이 논의되고 있습니다. 잘 활용해 보시기 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.