728x90

여기 정리글은 내 경험 토대로 적는거라.. 당연한 말일수도 있고 틀릴것이 있을수도 있고 혹은 되려 몰랏던 부분을 이글을 통해 알게 되는 사람이 있을수도 있다.. 고려해서 보길 바란다..


처음 번들 개념에 접근할때 햇갈리면 안되는 부분이 있다 번들은 해석하면 말그대로 묶음이다.

유니티에서 사용하는 에셋번들은 여러 에셋들을 하나로 묶어서 하나의 에셋번들로 만든다라는 개념으로 봐야한다.

(꼭 에셋번들이 여러개를 뭉친 작품이라는것은 아니다, 에셋한개당 번들 한개로도 만들수 있다 그건 개발하는 사람에 따라..)


번들을 만들때 우리는 에셋마다 에셋번들네임을 지정해준다. 이 번들네임은 에셋한개당 고유한 네임이 아니다. 3개의 오브젝트가 잇다면 이 오브젝트 모두 동일한 에셋번들네임을 지정해줄수 있고, 번들을 빌드해서 나온 결과를 보게 되면 지정한 에셋번들이름으로 에셋번들이 생성되어 있고 매니패스트 파일을 보게되면 그안에는 3개의 오브젝트가 각각 들어있다는것을 알수 있다.


이렇게 만들어진 에셋번들을 로드해와서 에셋번들안에 있는 우리가 알고 있는 에셋들의 이름을 통해 접근하고 가져와서 사용할수 있는거다.


번들작업을 하면서 크게 느꼇던 과정이 Ngui를 사용한 아틀라스를 번들로 만들어서 쓸때와 Scene을 번들로 만들어서 쓸때이다.


ngui로 아틀라스 작업을 하면 총 3개의 결과물이 생성된다. (아틀라스 프리팹과, 머테리얼, 텍스쳐) 번들에있는 아틀라스를 가져와서 모바일 기기에 적용시키려고 하니, 프리팹에 있던 각 스프라이트들의 아틀라스 연결이 다 끊어져있었다. 그래서 이것을 하나하나 다시 연결시켜줘야할 필요성이 있었는데, 번들로부터 아틀라스 프리팹을 가져와서 uiatlas 컴포넌트에 접근해서 다시 붙여 줬다. 하지만 안됬다.


왜 안되나 햇더니 번들을 잘못 만들엇던 것이다. 저 3개의 결과물을 한 번들안에(=같은에셋번들이름 지정)으로 해서 만들어야했는데 (프리팹만 번들로 이름을 지정하고 불러와서 적용이 되는걸 보니 머티리얼과, 텍스쳐의 참조성이 유지되는것 같다), 각각 이름이 달라 개별적으로 번들이 만들어져 버린것이다.

그래서 아틀라스 프리팹에 연결되어야했던 머테리얼이나 텍스쳐들이 연결성이 깨져버려서 안된것이다.


Scene같은 경우엔 날밤새면서 애좀 먹었다. Scene 자체를 번들에서 로드해오는건 어렵지 않았으나, 씬 안에 있는 여러 오브젝트들 그리고 그 오브젝트들이 사용하고 있는 머테리얼이나 셰이더가 다 깨져서 핑크(Pink)로 화면에 가득 채우는 현상이 발생했다.


외부에서 만든 커스텀셰이더를 사용할 경우에는 Edit -> Project Settings ->Graphics 항목에 들어가서

Always Included Shaders 항목에 사이즈를 추가시키고 해당하는 커스텀셰이더를 넣어라는 포럼 글을 봐서 했는데 되나? 싶더니 여전히 핑크가 되고 있었다.


좀 더 찾아보니 다른 글들을 보면 모두가 번들로 뽑아낸 셰이더와 관련된것들은 해당 플랫폼 기기에서는 잘 나오고 유니티 에디터 상에서는 핑크로 된다라는 공통적인 글들을 볼수 있었다.


그런데 이상하게 내가 하고있는건 에디터 상에선 잘나오는데 해당 플랫폼 기기에서는 핑크화 되는 것이였다.


너무 이상해서 작업한 코드를 다시 살펴 보던중 씬을 로드 할때마다 해당 씬에 있는 renderer들을 모두 가져와서 거기에 있는 머테리얼의 셰이더들을 다시 셋팅해주고 있었다;;;


예전에 어떤 글에서는 핑크화 될 경우에 셰이더들을 다시 잡아주면 된다라는 글을 보고 그렇게 한 것이고 에디터에서 잘 나오길래 오~ 하며 이렇게 하는거구나 햇는데 


이 부분이 모바일에서 핑크화 되는 원인이였던 것이다.


좀 더 포럼에서의 글들을 보니 셰이더와 관련된것들은 번들화 되었을때 해당 플랫폼에 맞는 그래픽 API로 변환된다는것을 보았다 Ios/Android 같은 경우는 OpenGLES2/3, Metal 등과 같은 그래픽 API라고 하는데 이렇게 되면 해당 플래폼 기기에서는 잘나와야 정상이라는 것이다.


핑크로 나온다는건 번들화 되어 있는 셰이더에서 사용하는 그래픽 api와, 기기에서 사용하는 그래픽 api가 달라서 그렇다는 것이다.


유니티 에디터는 윈도우라면 기본적으로 DirectX를 그래픽 api로 잡고있는데 번들에서 가져온 셰이더는 IOS/Andorid용으로 이미 만들어버린 다른 그래픽 api라서 핑크핑크로 나온다는 것이다.


그래서 저 코드 부분을 주석처리하고 빌드해서 하니 핑크 현상이 다 깔끔하게 사라졌다.


결론은 이 핑크현상은 유니티 에디터에서만 발생하는 것이고(그래픽api가 다르기 떄문에), 해당 플랫폼에선 번들화 될때 해당 플랫폼 그래픽 api에 맞게 셰이더가 변환되기 떄문에 잘 나온다는 것이였다. 


!!유니티 에디터에서 번들화 된것을 가져와서 핑크현상이 없이 보고 싶다면 머테리얼에 있는 셰이더를 다시잡아주는 작업을 코드로 해라 라는 그런 팁과 같은 글이 또 있었다. 나는 두서 없이 그냥 머테리얼 셰이더를 다시 잡아주니 잘되서 오 이거구나 한게 그냥 잘못이었던 것이다.


그리고 번들의 용량이 크지 않다면 unLoad 할필요 없이 딕셔너리 같은곳에 번들을 저장해두었다가 꺼내 쓰는 식으로 해도 되지만, 번들 하나 하나의 용량이 크다면 상황에 맞춰서 번들을 꼭 unload(true)를 해주어야 한다. (번들은 사용이 없을 경우엔 꼭 타이밍에 마춰서 unload(true)를 해주자 안그러면.. 번들이 계속 메모리에 올려져 와서 메모리가 계속 쌓이는 현상이 발생해버린다.)


실수로 번들을 로드한 후에 번들안에 있는 에셋들을 모두 가져다 썻다라고 생각하고 이제 해당 에셋번들을 unload(ture)를 한다면 씬에서 사용되고 있던 번들의 에셋들이 모두 메모리에서 제거 되서 한마디로 망해버리는수가 있다..


그러니 메모리에 계속 올라와있는건 그만큼 자원을 잡아먹고있다는 부분이니까 꼭 unload(true)를 해주되 더이상 해당 씬이라던지 아니면 어떤 상황에서 쓰지 않는 번들이라는 판단이 확실할 경우에만 unload를 해주어야 한다.

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침