인프런 커뮤니티 질문&답변

술홍님의 프로필 이미지
술홍

작성한 질문수

유니티 Addressable 을 이용한 패치 시스템 구현

Addressable 핵심 런타임 API

캐싱을 할때 캐싱 진행상황을 제대로 표시하고싶어요

작성

·

304

·

수정됨

0

안녕하세요.

 

제가 어드레서블을 사용해서 다운을 받고 생성하는거까지 해봤는데요.

여기서 몇가지 궁금한게 생겨서요.

제가 포톤 pun2를 사용하고있어서 에셋을 바로 PhotonNetwork.Instantiate를 사용할수가 없는 상황이더라구요..

그래서 찾아보다가 포톤에서 프리펩풀이라는게있어서 수동으로 생성을 할수있다고 하더라구요

DefaultPool defaultPool = PhotonNetwork.PrefabPool as DefaultPool;

Task<GameObject> task = character.LoadAssetAsync<GameObject>().Task; // 불러옵니다.

await task; //대기.

defaultPool.ResourceCache.Add("player01", task.Result); // 넣기

_player = PhotonNetwork.Instantiate("player01", Vector3.zero, Quaternion.identity);

그래서 이런식으로 프리펩풀에 넣어놓고 불러오는 방식을 사용하게됐습니다.

그리고 불러와지는걸 확인을 했죠! 그런데 여기서 문제가 발생하더라구요.. 안드로이드로 스위칭을 한상태라서그런지

쉐이더라 에디터상에서는 깨지는문제가 발생하더라구요

그래서 playmode script를 simulategroup을하게되면 에디터상에서 정상적으로 보이기는 하는데.. 그전에는 쉐이더가 안불러와져서 그런지 핑크색이긴하지만 바로바로 불러와졌는데

씬을 불러오니까 캐릭터가 생성되기까지 시간이 2~3초정도 걸리더라구요

그래서 무슨문제일까 찾아보다가 씬에 미리 캐싱을 해두고 써야한다는말이 있어서

​ public IEnumerator LoadMultipleAssetAsync(List<string> AssetNames, string scene)

{

foreach (string asset in AssetNames)

{

// Addressables.DownloadDependenciesAsync를 사용하여 씬 캐싱

AsyncOperationHandle handle = Addressables.DownloadDependenciesAsync(asset);

// 캐싱 완료될 때까지 대기

while (!handle.IsDone)

{

Debug.Log(handle.PercentComplete);

 

yield return null;

}

// 씬 로드

SceneManager.LoadScene(scene);

}

// 씬 로드 완료 후 처리

}

이렇게 진행상황을 표시하는걸 만들고

StartCoroutine(LoadMultipleAssetAsync(assets, "Tutorial"));

이렇게 씬을 불러오게 만들었는데

여기서 문제가 발생합니다. player01을 불러올때 0.8부터 불러온다는 문제가 생기더라구요..

그리고 불러오고 나서도 씬이 자연스럽게 나오는게 아니라 뭔가 부자연스럽게 한..0.2~3초정도 눈에 보일정도로 딜레이가생기면서 생성되더라구요.. 제가 여기서 궁금한건 0.8부터 불러지는거랑 딜레이가 생기는부분이 궁금한건데요.. 어떤 문제가 있는걸까요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

술홍님, 유니티의 Addressable 시스템을 사용하여 캐싱 과정 및 진행 상황을 제대로 표시하고 싶으신 상황에서 발생하는 문제에 대해 문의하셨군요. 캐싱이 0.8에서 시작되는 문제와 생성 시 딜레이가 발생하는 문제는 여러 요인에 의해 발생할 수 있습니다.

첫 번째로, 0.8부터 불러오는 것과 관련하여 캐싱 과정이 제대로 진행되지 않거나 캐싱을 확인하는 로그 기록 시점이 실제 다운로드가 시작되기 전이 아닐 수 있습니다. 캐싱 진행상황을 확인하기 위해선 handle.PercentComplete 대신 handle.GetDownloadStatus().Percent를 사용하여 다운로드 진행률을 좀 더 정확히 확인해 볼 수 있습니다.

두 번째로, 딜레이가 발생하는 부분은 씬 로딩이나 리소스의 인스턴스화 과정에서 발생할 수 있습니다. 리소스가 로드되고 나서 메모리에 할당되고 초기화되는 과정에서 시간이 소요될 수 있습니다. 캐싱 이후에도 쉐이더 컴파일 또는 리소스의 인스턴스화 때문에 딜레이가 발생하는 경우는 프로파일러를 사용하여 성능 병목이 발생하는 구체적인 지점을 찾아내어 최적화 작업을 수행할 필요가 있습니다.

이처럼 딜레이를 줄이기 위해서는 캐싱 로직을 최적화하고, 리소스 로딩 및 처리 과정에서 성능 병목을 찾아내어 개선하는 과정이 필요합니다. 또한, 에디터와 실제 안드로이드 환경에서 발생하는 차이로 인해 추가적으로 플랫폼별 최적화가 필요할 수 있습니다.

이와 관련하여 좀 더 상세한 질문이나 다른 문제가 발생한다면, 언제든지 문의해 주시기 바랍니다.

술홍님의 프로필 이미지
술홍
질문자

오~!!! handle.GetDownloadStatus().Percent 이걸로 하니까 정확하게 0부터 진행돼요~!! 정말정말 감사드립니다~!! 제가 잘못쓰고 있었던거였네요~!

그리고 딜레이는 제가 해결인 안되는데 혹시 프로젝트로 드리면 확인해주실수있나요?

술홍님의 프로필 이미지
술홍

작성한 질문수

질문하기