본문 바로가기
Etc/경험담

[Unity] AssetBundle 시스템 구축

by 생각하는달팽이 2016. 5. 23.

안녕하세요?

이번시간에는 Unity 에서 AssetBundle 시스템 구축에 대한 경험을 얘기하고자 합니다.

두서없고 짧은 글이니 집중해서 읽어주세요.. 하하 ;;


세가지 스텝으로 진행하도록 하겠습니다.


1. AssetBundle Builder

어셋 번들을 만들어보자. 어셋번들을 빌드할 경우 저의 경우에는

AssetBundle 이라는 폴더안에 Atlas, Scene, Effect, Sounds 등의 서브 폴더를 두고 그곳에 정리를 하였습니다.

Assets 의 하위폴더로 두었습니다. 

Assets > AssetBundle



이후 Scene 의 경우에는

BuildPipeline.BuildStreamedSceneAssetBundle( scenePath ,path ,target ,BuildOptions.UncompressedAssetBundle );


다른 리소스의 경우에는 


BuildPipeline.BuildAssetBundleExplicitAssetNames(assets.ToArray(),names.ToArray(),path,options,target);


위에서 Option 의 경우에는 아래와 같이 주었습니다.


private static BuildAssetBundleOptions options = 

BuildAssetBundleOptions.CollectDependencies |

BuildAssetBundleOptions.CompleteAssets |

BuildAssetBundleOptions.DeterministicAssetBundle |

BuildAssetBundleOptions.UncompressedAssetBundle;



각 옵션 중 중요한 부분들을 간단히 설명하자면 ( API 문서를 보시는걸 추천해드립니다. )


CollectDependencies  : 의존관계의 리소스를 함께 압축한다.

DeterministicAssetBundle : 초기 생성된 파일으 GUID 해시값을 보존한다 ( 이를 이용하여 리빌드시의 해시의 변경을 막을 수 있었습니다. )


저의 경우 AssetBundle 을 만든 후 해당 패스와 hash 값을 csv 에  맵핑하여 저장합니다. 이를 패치 리스트로 만들어 사용합니다. ( 해시가 중복되는 녀석들은 다운받지 않습니다 ! )


2. AssetBundle Downloader

다운로드의 경우 위에서 만든 파일을 AWS S3 에 업로드 한후 WWW 를 이용하여 다운로드 하였습니다.



3. AssetBundle Loader


로드의 경우 다운받은 Path 를 참조하여 어셋을 로드하게 됩니다.

이때 주의하여야 할 부분이 메모리 Leak 인데요.


저의 경우 처음 안드로이드에서는 잘 돌던 AssetBundle 의 경우 iOS 문제가 생겨 이리저리 고민해본 끝에 다음과 같은 글들을 접하고 어셋 디렉토리 구조를 다시 잡았습니다.


초기 약 400개 정도의 어셋 리스트를 > 61개 정도의 어셋리스트로 줄이니 해결되었습니다.


당시 에러코드는 다음과 같았습니다.


Error while reading AssetBundle header!

File is Too small !


해결방법은 다음과 같습니다.


너무 많은 어셋번들은 좋지 않습니다. ( 저의 경우 해당 문제였습니다. )


460여개의 어셋번들을 -> 61개의 어셋번들로


교체 후 문제를 해결하였습니다.


다음은 참고하실 내용입니다.


Each AssetBundle has some technical overhead. AssetBundles are files that wrap Assets. This wrapper adds to the overall size of the AssetBundle. Even though this is not a significant increase in size, it is measureable. AssetBundles also require a certain amount of management to organize, create, upload and maintain. The more AssetBundles being used increases overhead for a project, both technical and managerial.


When organizing AssetBundles, a balance must be struck between too many small AssetBundles that need to be tracked and generate overhead, and too few AssetBundles that are large and contain unnecessary or redundant data. The exact balance will depend heavily upon the needs of the project.



감사합니다 (_ _)



추가적으로 어셋번들 구축시 생긴 문제에 대한 경험입니다.

저의 경우 iOS 에서 구동시 메모리가 튀는 경우가 있습니다. 어느 순간 200MB 를 넘는 순간이 있는데요...

그 때 앱이 뻗는 수가 있습니다. 

해결방법은 다음과 같았습니다.


1. 어셋번들을 다운로드 받을때

2. 어셋번들을 압축해제 할때


www.Dispose();
www = null; 

yield return null;				

System.GC.Collect ();
System.GC.WaitForPendingFinalizers ();


코루틴 내에서 www 객체를 생성하여 사용할 경우. 해당객체 생성후 www 객체를 해제해주어야 합니다. 그렇지 않으면 메모리 leak 이 발생하게 됩니다.


댓글이 달려서 추가 적으로 이해하기 쉽도록 이미지 업로드 해드립니다.


우선 해당 앱의 각 Phase 별 디렉토리 구조입니다. ( AWS s3 기준 )


CSV 폴더에 들어가면 다음처럼 버전별로 디렉토리들이 존재합니다. 


해당 버전별 디렉토리에 들어가보면, os 별 csv 파일이 존재합니다 ( asset의 path, hash file 명, 크기 등이 저장된 csv )


android_assetbundles.csv


다음처럼 csv 파일은 구성되었었습니다.


아무쪼록 도움이 되길 바랍니다. XD


반응형

'Etc > 경험담' 카테고리의 다른 글

[Unity] Prime31 IAP,IAB 사용하기  (0) 2016.05.25
[Unity] 특이한 경험  (0) 2016.05.24
[Unity] AssetBundle 시스템 구축  (3) 2016.05.23
[Pod] Xcode 오픈 소스 사용시 Pod  (0) 2016.05.12
[AWS] Code Deploy  (0) 2016.05.10
[AWS] 인프라 구축  (0) 2016.04.06

댓글3

  • rbtree 2018.07.04 22:46

    안녕하세요. 궁금한게 있어서 여쭤봅니다.

    hash로 버전관리? 패치관리? 를 하신것 같은데 어떤식으로 사용하셨는지 너무 궁금합니다. 이걸로 벌써 며칠째 밤새고있네요 ㅜㅜ
    답글

    • 안녕하세요? 우선 제가 작업했던 시기는
      유니티 4.x 버전으로 기억합니다.
      우선 저의 경우.
      AssetBundle Builder 와 AssetBundle Loader 를 만들었습니다.

      Builder 의 역할은 AssetBundles 폴더내의 폴더및 파일들을 생성하는 역할을 합니다. ( 여기서 hashing 된 naming 으로 어셋 파일들이 생성됩니다. ) 그리고 이를 csv 파일에 기록합니다.
      그리고 그렇게 나온 파일들(csv 파일 포함 ) 을 AWS S3 에 올렸습니다.

      이를 다운로드하여

      AssetBundle Download 를 통해 WWW 를 이용 어셋을 다운로드 합니다.

      이후 AssetBundle Loader 를 이용하여 다운받은 어셋파일들 ( builder 가 생성한 파일들로 hash 로 파일이름이 작성되었습니다. )

      위의 과정으로 어셋이 시스템이 구축이 되어 있습니다.
      다만, 추가적으로 csv 파일을 작성해서, 해당 어셋들을 기록하여 함께 올렸던것으로 지금 기억하고 있습니다. ( 2년전이라 기억이 가물가물하네요 )
      이유는 중복되는 어셋의 경우 다운받지 않기 위해서였습니다.
      local 에 존재하는 asset hash file list .csv 와
      서버에 존재하는 asset hash file list .csv 를 비교해서.
      동일한 asset 은 받지 않았던것으로 기억합니다.
      이때 local 에 존재하는 asset 은 다운로드 완료한 asset 입니다.

      어셋의 경우 버전별로 관리하고, 어떤 어셋을 받는지는. 어셋 받기전 config.json 등의 파일을 다운받아 어셋 정보를 가져왔었습니다.

  • rbtree 2018.07.26 10:17

    제가 질문을 잘못올였었네요.. hash 가.. manifest 파일을 어떤식으로 사용하셨는지 여쭤보고 싶었었습니다 ㅜㅜ

    여튼! 답글 감사합니다. 지금은 달팽이님이 말씀해주신 방법과 다르지 않게 문제를 해결하였습니다. 감사합니다!! 좋은하루 되세요~!
    답글