글 작성자: Doublsb

개요

4월부터 진행하던 외주 프로젝트가 끝이 났다. 정확히는 끝났다기보다는 계약 기간 이후 유지보수 기간이라, 소소하게 연락 오는 일들을 처리하고 있는 상태다.

마감일이 고정되어 있고, 그렇다고 해서 기간이 널널하지도 않았던지라 시간 관리나 리팩토링 부분에서 아쉬움을 느끼기도 했다.

아무튼 끝났으므로 미래의 나를 위해 이번 프로젝트에서 겪었던 문제상황과 그 해결 방법 등을 정리하고자 한다.

 

주요 문제상황 및 해결과정

- Android 10 지원

구버전과는 달리, Android 10에서는 제약사항이 늘어났다. 대표적으로 저장소 액세스 이슈가 있었다.

10 이상을 타겟팅하는 앱은 외부에 범위 지정 저장소(Scoped Storage)가 생긴다. 이로 인해 원하는 위치에 마음대로 접근할 수 없게 되었다.

 

이 때문에 기존에 이용하던 Runtime File Browser 에셋을 사용하기 어려워졌다. 원하는 공간에 접근하려면 권한이 필요했으므로, 유저 입장에선 조작이 여간 까다로운 게 아니었다.

 

다만 사진, 비디오, 음악 파일 등은 MediaStore을 통해 읽을 수 있으므로 이미지를 가져오는 것은 생각보다 쉬웠고,

앱에서 자체 생성하던 데이터 파일들은 앱 데이터 폴더에 생성 및 읽기를 할 수 있었기 때문에, 에셋 종속성만 제거하여 해결할 수 있었다.

 

- URL의 영상 재생

앱 내에서 특정 영상을 재생해야 하는 문제가 있었다.

최초 기획서를 받았을 때에는 영상을 유튜브에 올려 해당 링크의 영상을 재생하려 했었다.

그 과정에서 Youtube-DL 플러그인을 이용하려 했는데, 유튜브 자체 앱이 아니거나 공식적 인터페이스를 거치지 않은 유튜브의 영상을 재생하는 것은 정책 위반이기에 다른 방법으로 해결해야 했다.

 

일단 최종 클라이언트 측이 영상 재생 서버를 보유하고 있었고, 해당 서버에 업로드 및 URL 참조는 가능했기에 이번 프로젝트는 손쉽게 해결했다.

단, 외주를 맡겼던 클라이언트 측은 영상 재생 서버가 없었고, 스트리밍 기능도 보유하고 있지 않았기 때문에 개발이 필요할 듯 하다. 일단은 미래에 생각하는 것으로 협의했다.

 

영상 재생 에셋은 다양하게 사용해 보았으나, AVPro만한 성능과 편의성을 갖춘 에셋이 존재하지 않아 Core 버전을 구매했다. 세일 기간이라 반값에 구매하긴 했지만 비싸다는 생각이 드는 건 어쩔수 없었다.

 

그 외에 안드로이드 내에서 영상을 재생할 때 버벅이는 등의 문제가 있었는데, 기기의 성능 문제인 것을 확인했다.

갤럭시 탭 S5e에서는 딜레이 없이 정상 재생되었는데 클라이언트 측 기기인 갤럭시 탭 어드밴스 2에서는 렉 현상이 심했다.

영상 품질이나 스트리밍 설정 등 최적화를 최대한 했는데도 잡히질 않아서 고민했는데, 유니티 Rendering 세팅에서 멀티스레딩 기능인 Graphics Jobs 기능을 켰더니 성능 문제를 해결할 수 있었다. Experimental 기능인지라 지켜봤는데, 다행히! 다행히 문제가 없었다.

 

- 텍스트 내에 이미지 표시

해당 부분은 자세한 해결 방법과 순서를 따로 포스팅할 예정.

TextMesh Pro에서 Sprite를 폰트처럼 사용할 수 있다는 건 이미 알고 있었지만, 직접 적용해본 건 처음이었다.

Sprite를 폰트 사이에 표시하는 것은 문제가 없었고, 금방 해결했지만 그러나 문제는 따로 있었다.

텍스트 내에 출력되어야 할 Sprite가 매번 바뀐다는 점이었다. 게다가 해당 Sprite는 번들에 포함되어 있었다.

 

TextMesh Pro는 Multiple Sprite의 위치와 크기 정보를 받아와 자른 뒤 그것들을 폰트처럼 받아와 표시하는 방식이었는데, 어떻게 번들을 받아온 뒤 런타임 시점에서 스프라이트를 쪼개고 구워야 하는가에 대한 문제가 있었다.

 

의외로 금방 해결되었는데, 512px, 512px의 투명 이미지를 16등분 한 다음, 구웠다.

그리고 번들을 불러올 때마다 16등분 된 위치에, 원하는 이미지로부터 픽셀을 읽고 투명 이미지 위에 그렸더니, 해결.

 

- 3D 모델 최적화

이번 프로젝트에서는 수많은 3D 모델을 사용해야 했고, 그로 인해 생기는 소일거리의 양도 만만치 않았다.

요구 성능에 맞출 수 있는 모델 구하기, IDLE 애니메이션만 항상 재생하도록 수정하기, 가급적 Mobile 머티리얼 사용하기, 텍스쳐 압축하기 등의 일들을 100여개의 모델에 모두 적용하고 파일들을 정리하자니 꽤 걸렸다.

그래서 옵션을 설정하고 지정된 위치로 분류해주는 스크립트 및 모델 테스트 씬을 만들어 시간 비용을 줄였다.

 

- 에셋번들 적용

이전까지는 에셋번들을 사용해야 할 필요가 없는 프로젝트들만 작업했었는데, 이번에는 코어 데이터와 콘텐츠 데이터를 분리하기 위해 에셋번들을 적용해야 했다.

적용은 크게 어렵지는 않았고, 로드/언로드 과정에서 메모리 관리 이슈가 발생했었으나 프로파일러 및 코드 변경을 통해 잡았다. 

적용 초기에는 데이터 변경이 잦아, 에셋 번들의 빌드를 매번 수행하는 과정에서 시간 비용 손실이 있었다. 그리고 폴리싱 기간에 무수한 빌드의 요청까지 있어 개발 시간보다 빌드 시간이 더 길었던 것 같다. 다음 프로젝트에서는 빌드 자동화 환경을 구축해봐야 할 것 같다.

 

요약 및 결론

이번 프로젝트에서는 마감 기한을 맞추기 위해 크런치 모드로 일할 수밖에 없었다. 결국 어떻게든 해냈지만, 건강 관리와 수면에 대한 절실함을 느꼈다...

기술적인 문제보다는, 기획 변동이 잦아 재구현 및 소통에 대한 스트레스가 더 컸던 것 같다.

 

그리고 첫 회사부터 항상 네트워크를 제외한 개발을 혼자 진행하고 있는데, 이에 대한 불안도 크다. 클라이언트끼리 개발 협업을 진행해봐야 코드 품질 및 효율성 관리를 더 잘 할 수 있지 않을까. 더 좋은 개발 환경에 대한 욕구가 여전히 큰 요즘이다.

 

그래도 이번에 스스로 배우고 쌓은 지식이 많으니, 성장 측면에서는 만족스러운 것 같다.

반응형