뒤끝 초보입니다. 꼭 좀 알려주세요.ㅠㅜ

문의를 남기실 경우 다음 항목을 작성해 주시면 빠른 답변 처리에 도움이 됩니다.

  • 프로젝트명 : 뒤끝 공부중
  • 뒤끝SDK 버전 : 5.4
  • 에러 코드 : 코드 내용 질문좀 드리겠습니다.

안녕하세요. 뒤끝으로 코옵 게임을 꼭 만들고 싶어서 전공자는 아니지만 퇴근후에 계속 공부해보고 있습니다.
뒤끝을 이용해서 뒤끝 로그인과 구글 로그인까지 진행했습니다.

문제는 Dispatcher인데요.
뒤끝 예제 샘플에 디스패쳐 에셋이 있어서 알아보니, 유니티에서 스레드(동시에 여러개의 함수를 실행하는 기능?) 를 쉽게
가능하게 해주는 에셋 이라는걸 알게됐고, 해당 에셋을 받고 사용하려고 하다보니 내용이 너무 어려워서 검색 하다 하다 결국 질문 남기게 되었습니다.ㅠㅜ

제가 Dispatcher 스크립트에서 궁금한 부분입니다.

public void BeginInvoke(Action action)
{
while (true)
{
// 질문 1. Interlocked.Exchange가 무엇인가요?
if (0 == Interlocked.Exchange(ref m_lock, 1))
{
m_wait.Enqueue(action);
m_run = true;
Interlocked.Exchange(ref m_lock, 0);
break;
}
}
}

// 질문 2. 업데이트 내용에 대해서도 궁금합니다.
// m_wait 대기열에 행동해야할 action 이 있을때만 업데이트가 실행되서(m_run), 순차적으로 action 을 실행한다고
// 이해하면 될까요? 자세하게 부탁드립니다.ㅠㅜ
private void Update()
{
if (m_run)
{
Queue execute = null;
if (0 == Interlocked.Exchange(ref m_lock, 1))
{
execute = new Queue(m_wait.Count);
while (m_wait.Count != 0)
{
Action action = m_wait.Dequeue();
execute.Enqueue(action);
}
m_run = false;
Interlocked.Exchange(ref m_lock, 0);
}

            if (execute != null)
            {
                while (execute.Count != 0)
                {
                    Action action = execute.Dequeue();
                    action();
                }
            }
        }

긴 글 읽어주셔서 감사합니다. 아직 초보 수준이라서 답답한 마음에 글 남겨봅니다.
제가 잘못 이해하고 있는 부분이 있다면 말씀해주셔도 괜찮습니다. 답글 꼭 좀 부탁드립니다.(__)

안녕하세요 개발자님.

질문1 : Interlocked.Exchange 함수는 첫번째 변수의 값을 두번째 변수의 값으로 변경하는 함수입니다. 그리고 리턴값은 변경하기 전의 함수를 리턴합니다.

그러므로 if (0 == Interlocked.Exchange(ref m_lock, 1)) 코드는 현재 해당 쓰레드의 BeginInvoke 함수가 실행중이지 않을때 라는 쓰레드 중복 현상 방지용 코드입니다.

BeginInvoke 함수 내에서는 if 안에 동작중에는 m_lock이 1이 되어 작업중이라는 것을 나타내고, 작업이 끝나면 0으로 다시 변환되며, 다음 함수가 호출될때에는 m_lock이 0이었기 때문에 다시 함수를 Enqueue하게 됩니다.

이러한 경우는 적겠지만 만약 BeginInvoke 함수의 호출이 거의 동일한 시간에 이루어질 경우 하나는 Enqueue되지 않습니다.(존재한다면 BeginInvoke 함수를 단시간 내에 아주 많이 호출할 경우)

질문2 : 개발자님 말대로, 하나라도 Invoke한 작업이 존재한다면(m_run이 true라면) 큐에 저장하고,
Invoke된 행동들을 순차적으로 메인쓰레드에 있는 Queue에 저장하고 순차적으로 실행합니다.

Queue에 저장하고 실행하는 것은 프레임 마다 메인쓰레드에서 실행되기 때문에(Update) 한 프레임에 너무 많이 Enqueue될 경우 일시적인 멈춤현상이 발생할 수 있습니다.

뒤끝매치에 존재하는 Dispatcher.cs의 코드는 뒤끝측에서 작성한 코드가 아닌 UI쓰레드에 쉽게 접근하도록 Dispatcher 오픈소스에서 수정 없이 그대로 가져온 코드입니다.

뒤끝 매치를 개발하실때 Dispatcher안에 있는 코드를 완벽히 이해할 필요가 없으며 해당 함수의 사용법만 알아도 개발에는 문제가 되지 않으며,
이후에 유니티 UI 쓰레드에 접근이 불가능한 문제나 다른 쓰레드에 대해 궁금하실 때 코드를 분석해보는 것을 추천드립니다.

좋아요 1

너무 감사합니다!!!(__)