리소스에 대해

2023. 5. 14. 19:38유니티/성능 관리

* 틀린 정보 지적은 언제나 감사합니다 *

 

리소스 폴더에 대해 공부하던 중 알게 된 정보를 적어보도록 하겠습니다.

 

1. Resources 폴더

Resources 폴더는 Resources.Load() 메서드를 사용할 때, 가져올 오브젝트들을 넣어두기 위해 사용한다고 합니다.

다른 폴더 아래에 여러 Resources 폴더가 있어도 된다고 하며

Resources 폴더 아래 다른 폴더가 여러개 있어도 된다고 합니다.

 

리소스 폴더는 빌드 시 모든 오브젝트가 resources.asset 형태의 파일로 빌드된다고 합니다.

이 과정에서 빌드 시 시간이 오래 걸리게 된다고 합니다.

 

2. Resources.Load() (이하 로드)

오브젝트를 로드할 때 가져온 정보는 사라지지 않고 캐시 정보로 메모리에 남는다고 합니다.

객체 풀링을 하기 위해 가져온 리소스 정보는 사용한 후에 언로드 해줘야한다고 합니다.

public class MyClass
{
    GameObject obj;
    List<GameObject> pool;
    
    private void Start()
    {
        obj = Resources.Load<GameObject>("MyObject");
        pool.Add(Instantiate(obj));
        
        // 사용 후 더 이상 사용하지 않는 리소스는 언로드 시킨다.
        Resources.UnloadAsset(obj);
    }
}

 

3. 동기/비동기

Load() 는 동기 로드 방식을 사용하기 때문에 데이터를 완전히 불러들인 다음에 프로그램이 진행됩니다.

이 때, 불러들이는 데이터의 용량이 클 수록 프로그램에는 지연 현상이 발생하기 쉽다고 합니다.

 

이를 방지하기 위해 비동기 로드를 사용해야 한다고 합니다.

비동기 로드를 사용하려면 LoadAsync() 를 사용하면 된다고 하며

유니티에서도 이 방법을 권장한다고 합니다.

 

사용 예시

using System.Collections;
using UnityEngine;

public class LoadAsyncTest : MonoBehaviour
{
    void Awake()
    {
        StartCoroutine(LoadAsync());
    }

    IEnumerator LoadAsync()
    {
        ResourceRequest request = Resources.LoadAsync<GameObject>("myResource");

        yield return request;
        
        if (request.asset == null)
            Debug.LogWarning("Asset Load Fail");
    }
}

 

 

또한 비동기 로드는 씬에도 적용이 가능하다고 합니다.

 

씬 자체를 넘길 경우

로딩 씬을 먼저 보여주고, 그 동안 다음 씬을 불러들이는 방식으로 사용한다고 합니다.

 

또는 포켓몬 게임과 같은 방식으로

가까워지는 씬을 로드하고, 멀어지는 씬을 언로드하는 것으로

긴 로딩 시간 없이 연속적으로 맵이 존재하는 것 처럼 만들 수 있다고 합니다.

 

 

4. 에셋 번들

빌드를 할 때, 리소스 폴더도 패키지 파일에 포함되기 때문에

빌드한 프로그램의 용량이 커지게 됩니다.

 

이 때, 사용자는 커다란 용량의 파일을 받게 되기 때문에

모바일 게임 같이 용량에 민감한 플랫폼에서는 특히 이 것에 주의해야 합니다.

 

이 때 사용하는 것이 AssetBundle 이라고 합니다.

에셋을 패키지 파일에 포함하지 않고 따로 온라인 스토리지에 업로드하고

프로그램 동작 시 추가적인 데이터를 다운로드를 받을 수 있게 하는 방식이라고 합니다.

사진 출처 : https://www.thisisgame.com/webzine/event/nboard/4/?n=89270

에셋 번들 사용법에 대해서는 다음에 다시 다루도록 하겠습니다.