assetbundle building, change file

반응형

내용은 이러함.

1. 에셋번들 빌드

2. 빌드결과 파일들 복사.

3. 프로젝트 아무것도 안 건드리고 다시 빌드

4. 두번째 빌드결과 파일들과 첫번째 빌드 파일들 비교

이상하게 몇몇 파일들이 자꾸 결과물이 다르다.

실제로 파일용량도 다르다.

대략 내용을 보면 내용은 같은데 파일의 내용 부분에서 저장 데이터 위치가 

조금씩 바뀌면서 용량도 틀려지고 하는듯 하다.

근데 왜 저장 위치가 달라지는 거지?


현재 사용 버전 : 5.5.1p3

결론 : 빌드할 때마다 특정 scene들의 파일 용량이 다르며, 실제이 조금씩 달라진다.

         그럼으로 인해 파일의 CRC 또한 달라진다.


첫번째 해결 시도

혹시 editor 관련 코드들이 random 을 만들어 내거나 하지 않을까?

editor 코드들을 제거. 끝없이 제거..딱히 정확한 연관성을 찾지 못함.


두번째 해결 시도

scene이 제대로 저장되지 않은게 아닐까?

프리팹들을 여기저기에 쓰는데 scene에서도 정보를 자체적으로 저장하니까,

그리고 이미 유니티 버전업도 몇번 진행했으니까 마이그레이션에서 문제가 있을수도 있고..

그래서 모든 신을 오픈하고 다시 저장하는 스크립트를 만들어서 돌림.

그랬더니!!!

파일 해쉬는 여전히 바뀌지만 파일 용량은 바뀌지 않음!!!

이 부분에서 유추할 수 있는 내용은 뭘까?

어느 부분이 해결되서 파일 용량이 안바뀌게 된걸까?

버전에 따른 추가정보 저장이 있는걸까?

그런데 왜 특정 scene만 저장해서 하면 계속 용량이 바뀌는 걸까?

결국 뭔가의 연관성이라는 게 있는걸까?


세번째 해결 시도

복사 붙여넣기 프리팹이 문제일까?

실제로 하나의 프리팹을 만든 후 그걸 여러군데에서 떙겨쓰고 apply하고 수정하고 하는 

일들을 많이 한다.

이는 프리팹을 쓰는 정확한 가이드 라인과 잘못 사용하는 프리팹을 찾을 수 있는 기능을

처음부터 제시하지 못한 나의 잘못. 그래서 이 부분에 대해 조사.

우선 프리팹의 문제인지 검증하기 위해 의심가는 프리팹을 링크를 끊어서 테스트.

여러번 빌드해도 해시과 변경되지 않는다!!

결국은 프리팹이 문제인 건데 여기서 다시 프리팹에 붙어 있는 특정 script가 문제 인가 하여

script를 지우면서 테스트 해 봐도 그건 아닌 듯 하다.

프리팹 링크에 대한 문제인듯 하다.

scene에 올려져 있는 세개의 프리팹의 링크를 끊었다.

a.prefab : 해당 scene에서만 사용하는 프리팹으로 editor 관련 컴포넌트가 붙어있다.

b.prefab : 몇군데의 scene에서 사용하는 프리팹으로 프리팹 안에 다른프리팹들이 여러개 들어 있다.

c.prefab : 해당 scene에서만 사용하는 프리팹으로 컴포넌트에 다른 프리팹에 대한 링크를 들고 있다.

위 프리팹들을 하나씩 다시 재 구축하며 테스트를 진행하였다.


a.prefab를 위한 테스트.

다시 프리팹으로 만들어서 테스트 : 두번의 빌드 후 scene 비교 결과 결과값이 다르다.

새로 만든 프리팹이며 하나의 신에서만 사용하는데도 신 빌드 결과값이 다름.

이 프리팹에 붙어있는 두개의 컴포넌트는 아래와 같다.

- script1 : editor script

- script2 : mono script

테스트를 진행해 봤다.

script1을 제거하고 테스트, script2를 제거하고 테스트 등 몇가지 테스트를 해 봤지만

script가 하나라도 붙어 있으면 계속 빌드를 하면 결과값이 바뀐다.

왜 script가 하나라도 붙어있으면 결과값이 바뀌는 걸까? 

다른 프리팹은 안바뀌는데... 

결과값에 영향을 안주는 프리팹과 비교해 본 결과 차이점은 결과값에 차이를 안 주는 프리팹은 

유니티 자체 컴포넌트(ex : animation, mesh 등)을 사용하고 있었다.

그래서 다시 a.prefab에 유니티 자체 컴포넌트를 붙여서 테스트 해 보니 결과값이 바뀌지 않음.

결론은....커스텀 script를 컴포넌트로 가지는 프리팹이 scene의 하이라키에 있으면 scene을 빌드할 때 문제가 생긴다??

혹시 custom하게 추가 한 스크립트 실행순서 때문일까? 모두 지우고 테스트 해 보니 이건 원인이 아님.

(지웠던 순서를 되돌리기 위해선 해당 스크립트의 메타를 고쳐야 한다. 순서는 메타에 저장된다)


여기까지의 정리를 보자면

1. scene의 하이라키에 프리팹이 올려져 있고 그 프리팹이 unity 지원이 아닌 자체 script을 컴포넌트로 가지면 

   번들을 빌드할 때 마다 파일이 조금씩 달라진다.

2. 새로 프로젝트를 만들어서 똑같이 테스트 해 본 결과 달라지지 않는다. 즉 현재 작업중인 프로젝트에 무었인가가 

   빌드시 프리팹을 건드는게 있다고 추측할 수 있다.

3. 그리고 scene의 하이라키에 missing난 컴포넌트가 있으면 결과 번들파일이 달라진다.

   그러니 missing난 컴포넌트를 잘 살펴보자.


분석 시작 3주째....

어느순간 내가 분석한 데이터가 다 필요없다는걸 깨달았다.

분명 두번 빌드해서 결과값이 같은걸 보고 연관성을 찾으려 했는데

사실 두번 빌드 했을 경우 우연히 결과값이 맞을수도, 틀릴수도 있다는 걸 알았다.

그래서 연속으로 30번 빌드하는 기능으로 바꿔서 테스트 해 보니 내가 찾았던 문제로 의심되던 것들이 

다 의미가 없어졌다. 아무런 연관성이 없다. 이런 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...

미친 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

깊은 빡침이란 이런걸까...아..미친듯이욕하고싶다...이런...

AssetBundleExtractor의 도움으로 내부 덤프파일을 일일이 검사해보니 특정파일의

SInt64 m_PathID 값이 다른걸 발견했다.

이 m_PathID를 검색해 보니 이런 을 발견했다.


작업을 위해 필요했던 것들.

1. 모든 번들을 다 빌드하면 시간이 많이 걸리기 때문에 하나의 번들과 그에 연관된 번들만

   빌드하기 위해 파일별 개별 빌드 기능을 만듬.

2. scene 파일이 많기 때문에 모든 scene을 열어서 새로 저장하는 기능이 필요해서 만듬.

3. 특정 프리팹을 지울 때 이 프리팹을 쓰는 scene들을 찾기 위한 기능을 만듬.

   모든 scene을 열어서 하이라키에 특정 프리팹을 쓰는 곳이 있는지 찾음.

4. 특정 번들만 다른이름 으로 두번 연속 빌드해서 결과값 비교 기능 만듬.

5. 모든 스크립트 재컴파일 기능 추가.

6. 모든 scene의 모든 컴포넌트를 검사하여 missing 찾는 기능 추가.



딮빡침......그래서 유니티 패치를 찾아봄.....

아...이런..딮딮딮...빡침...미친...빡침...

나의3주가...나의시간이....허무하게소비되었어.....패치를꼼꼼히읽어야지.늘생각했거늘...이런...

업그레이드 후 테스트 하니 잘 됨.

이 버그를 발견해서 수정하려고 시작한 날짜가 5.12일 이고 위 패치노트가 나온날이 5.24일 이니까

이 때 미친듯이 구글링 했을때 못찾았던건 당연한건가.......

찜찜하지만 해결하는데 한달이 넘게걸렸군.....이런 거지같은...내 인생 최대의 고난이었음...


업그레이드 하지 않고 이 문제를 피해가기 위해서는 나름 테스트한 결과를 토대로 방법을 강구하자면

scene의 하이라키상에 프리팹이 있고 이 프리팹이 유니티가 지원해주는 스크립트가 아닌것을 컴포넌트로 가지면

문제가 발생한다. 그러니 프리팹을 끊던지 컴포넌트를 없애던지 프리팹을 동적로드로 바꾸던지 해야 한다.

이건 테스트 할 당시에는 발생을 안했는데 확실성을 가지진 않는다.

그러니 업그레이드를 추천한다.


Reference Link

- [SCENE]M_ROOTORDER ORDER BEING SAVED AS A PREFABMODIFICATION 

  WITHIN THE SCENE FILE HAS AN INCORRECT VALUE

UNITY TEXT FORMAT AND M_ROOTORDER TEXT

- SOME ASSET BUNDLE COMPONENTS HAVE DIFFERENT M_PATHID COMPARED TO 

  NEW ASSET BUNDLE WITH DELETED LIBRARY

-

'Unity > Unity Study' 카테고리의 다른 글

RenderQueue  (0) 2017.06.21
There are inconsistent line endings  (2) 2017.06.20
메모리 프로파일러  (0) 2017.05.19
Asset Bundles vs. Resources : A Memory Showdown  (0) 2017.04.14
Asset Bundle Compression  (0) 2017.03.22
TAGS.

Comments