본문 바로가기
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
[Pod] Xcode 오픈 소스 사용시 Pod  (0) 2016.05.12
[AWS] Code Deploy  (0) 2016.05.10
[AWS] 인프라 구축  (0) 2016.04.06