뒤끝 저장 성능 관련 문의입니다.

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.18.1
  • 프로젝트명 :
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

안녕하세요. 뒤끝서버를 이용해서 처음 개발을 하는 와중에 궁금한 점이 생겨서 글 남깁니다.

public void Save(string googleId)
{
    Data.stageNumber = 예시 1
    Data.gold = 예시 2
    Data.playerSkinName = 예시 1

    string json = JsonUtility.ToJson(Data, true);

    Param param = new Param();
    param.Add("userId", googleId);
    param.Add("UserData", json);

    Where where = new Where();
    where.Equal("userId", googleId);

    Backend.GameData.GetMyData("UserData", where, getCallback =>
    {
        if (getCallback.IsSuccess())
        {
            var rows = getCallback.GetReturnValuetoJSON()["rows"];

            if (rows.Count > 0)
            {
                string inDate = rows[0]["inDate"]["S"].ToString();
                string owner_inDate = rows[0]["owner_inDate"]["S"].ToString();

                Backend.GameData.UpdateV2("UserData", inDate, owner_inDate, param);
            }
        }
        else
        {
            Debug.LogError("서버 조회 실패");
        }
    });
}

현재 데이터 저장을 할 때 이런 식으로 코드를 만들어봤는데 저장을 한번 호출할 때마다 프로파일러 상으로 playerloop가 7~8ms정도 찍히고 GC Alloc도 33000kb정도 나옵니다. 원래 이런건지 아니면 제가 이상하게 사용중인지 궁금해서 질문 남깁니다. 감사합니다!

안녕하세요, 개발자님.
남겨주신 코드에서 동기 방식을 사용하고 계신 것으로 확인됩니다.
동기 방식은 이전 호출이 완료되어야 다음 요청이 진행되므로, 호출 주기나 처리 순서에 따라 지연이 발생할 수 있습니다.

이러한 지연 누적으로 인해 메모리 할당(Alloc)이 특정 시점에 몰려 발생한 것으로 추정됩니다.

비동기 방식으로 변경하여 테스트를 진행해 보신 후, 성능 변화를 확인해 주시면 감사하겠습니다.

아 그러면 뒤끝 API를 사용하더라도 callback 함수에서 SendQueue나 async/await같은 방식으로 처리를 해야 한다는 말씀이신건가요?

뒤끝 API를 사용할 때 꼭 SendQueue나 async/await 같은 방식을 써야 하는 것은 아닙니다.
다만 데이터 양이 많거나, 저장 요청이 짧은 시간 안에 여러 번 발생하는 경우에는
비동기 처리 방식을 사용하는 것이 훨씬 안정적입니다.

비동기 방식은 서버에 요청을 보내놓고 결과를 기다리는 동안에도
앱이 멈추지 않고 다른 작업을 계속할 수 있게 해줍니다.
그래서 큰 데이터를 저장하거나, API를 자주 호출하는 구조에서는
비동기 처리를 적용하면 프레임 끊김이나 느려지는 현상을 줄일 수 있습니다.

또 한 가지 참고로, 뒤끝의 콜백 함수도 유니티 메인 스레드에서 실행되기 때문에
아래 예시처럼 UpdateV2 함수를 비동기 방식으로 호출해 주시면
메인 스레드가 잠시 멈추는 현상을 방지하는 데 도움이 됩니다.

Backend.GameData.UpdateV2("UserData", inDate, owner_inDate, param, (callback) => { });

간단한 데이터 전송처럼 가벼운 작업이라면 지금 방식으로도 충분하지만,
데이터가 크거나 호출이 잦은 경우에는 비동기 처리 방식으로 전환해 주시는 것을 권장드립니다.

아 업데이트 부분에서 콜백이 아니라 동기로 호출하고 있었군요. 감사합니다!

좋아요 1