inflearn logo
강의

Course

Instructor

[C# and Unity MMORPG Game Development Series] Part 9: MMO Content Implementation (DB Integration + Large-scale Architecture + Live Preparation)

DummyClient #2

화살 처리 관련 질문이 있습니다!

116

progammer

68 asked

0

안녕하세요.

제가 겪은 오류 관련해서 이미 예전 질문 글이 있었고 그와 관련해서 잡 캔슬이 얼마나 중요한지 알게 되면서 이것저것 정리하면서 생각해보다 보니까 문득 화살을 파괴할 때느 잡 캔슬을 하지 않았던 게 생각 나더군요.

사용자가 상호작용을 할 때만 발사되는 거라서 몬스터나 비전큐브랑 같지 않다는 건 아는데요. 문득 이런 의문이 들었습니다. Arrow.Update()가 다음과 같습니다~

public override void Update()
{
    if (Owner == null || Room == null || Data == null || Data.projectile == null)
        return;

    int tick = (int)(1000 / Data.projectile.speed);
    Room.PushDelayed(tick, Update);

    Vector2Int destination = GetFrontCellPosition();
    if (Room.Map.ApplyMove(this, destination, applyCollision: false))
    {
        GameRoom room = Room;
        S_Move movePacket = new();
        movePacket.ObjectId = Id;
        movePacket.PosInfo = PositionInfo;
        room.Broadcast(CellPos, movePacket);
    }
    else
    {
        GameObject target = Room.Map.Find(destination);
        if (target != null)
        {
            // 피격
            target.OnDamaged(this, Data.damage + Owner.TotalAttack);
        }

        // destroy
        Room.Push(Room.LeaveGame, Id);
    }
}

제가 상상해낸 버그의 해결 방법은 이미 알고 있습니다. 다만 그런 상황이 가능할까 궁금하더라고요.

화살을 파괴하는 일감인 (Room.LeaveGame, Id)가 잡큐에서 실행되기 전에 Update() 함수 초기에 예약해둔 일감 Room.PushDelayed(tick, Update)이 잡큐에서 먼저 실행되면 한 화살이 아직 파괴되기 전이므로 대미지가 두 번 이상 발생할 수 있는 상황이 올까? 싶었습니다. 저희가 GameLogic에서 일감들을 flush 하고 Job 클래스를 보면 JobTimer를 먼저 flush하니까요. 타이밍 이슈로 충분히 그럴 수 같은데? 생각이 들더라구요. 아직 재현된 이슈는 아닙니다. 가끔씩 화살이 몬스터를 뚫고 지나가기도 하는데 이런 타이밍 이슈와 관련이 있을까 하는 생각도 같이 들었습니다. 제 부족한 경험으로는 명쾌한 해답을 찾기가 어렵네요ㅠ

MMORPG

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. literate_t님이 질문하신 내용은 실시간 시스템에서 발생할 수 있는 타이밍 문제와 관련이 있습니다. 화살이 몬스터를 관통하는 현상은 주로 업데이트 루프와 관련된 비동기적 처리에서 발생할 수 있는 상황입니다.

화살 파괴와 타이밍 이슈에 대해:
1. 일감 순서: 잡큐에서 Room.LeaveGame이라는 화살 제거 작업이 실행되기 전에 Room.PushDelayed(tick, Update)가 먼저 실행되면, 이전 프레임에서 예약된 움직임이 아직 처리되지 않으면서 충돌 처리가 이뤄질 가능성이 있습니다. 이런 경우 대미지가 두 번 발생할 수도 있죠.

  1. 타이밍 이슈: 특히 서버와 클라이언트 간의 상태 동기화가 늦어지면서 이러한 문제가 발생할 수 있습니다. Update에서 다음 스케줄을 예약하는 방식이 곧 문제가 될 수 있습니다. 연속된 움직임이 처리되기 전에 객체가 파괴되지 않도록 주의해야 합니다.

  2. 버그 해결 접근법:

    • 기간 설정: Room.PushDelayedRoom.Push 간의 스케줄링을 적절히 설정하여 Update가 중복 실행되는 것을 방지해야 합니다.
    • 충돌 검사 및 로직 검토: if 조건에 따라 제대로 충돌 검사 및 제거 로직이 작동하는지 확인이 필요합니다.

유사한 질문이 포함된 기존 게시물을 참고하시길 권장합니다:

위 링크들을 통해 실무에서의 비슷한 문제와 그 해결 방법을 참고하시기 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

질문 있습니다.

0

42

2

심리스 존 방식 난이도

0

86

2

RewardPlayer함수 에 대해서

0

55

1

모바일 데이터 환경에서의 렉 현상 문의 드립니다.

0

88

2

part1~9 모두 완료하였습니다.

0

209

2

이번 수업 특히 좋았습니다

0

149

1

화살과 몬스터 버그와 관련한 질문입니다

0

169

3

DummyClient cpu스펙 질문있습니다.

0

120

2

InventoryManager 클래스에서 사소하지만 꼭 알고 싶은 사항이 있습니다

0

111

2

FANTASTIC UI STARTER PACK이 없네요..

0

119

1

면접 질문 드립니다.

0

146

1

로그인 정보 암호화는 어떻게 하나요?

0

231

2

조건식 중단점을 걸면 문제가 발생합니다

0

133

0

GenProto.bat 파일 오류

0

169

2

코드변경을 하면 오류가 생기는데요

0

188

2

아이템 슬롯 선적용에 대한 질문입니다

0

193

1

M1 M2강의의 경우 어느정도 수준이 필요한가요?

0

308

1

3~4일 간격으로 CPU 99% 사용되는 문제

0

421

2

JobSerializer 관련

0

287

1

3D 게임 이동 동기화

0

462

2

GameLogic 쓰레드에서 모든 GameRoom을 처리하나요?

0

255

1

Async와 Job방식의 차이가 궁금합니다.

0

293

1

EF사용시 async사용

0

254

1

해당 강의를 완강하면 실제 여러 대 PC의 환경에서 MMO구현이 가능할까요?

0

358

1