이거 안하면 게임 터짐, 메모리 관리

게임뉴스 | 서동용 기자 | 댓글: 1개 |



  • 주제 : 모바일 게임, 메모리 최적화도 안하면 어쩔티비
  • 강연자 : 오지현 - 유니티테크놀로지스코리아 에반젤리스트
  • 분야 : 게임엔진, 개발
  • 시간 : 2022.11.17(목) 17:00 ~ 17:50
  • 요약 : 유니티 오지현 에반젤리스트가 모바일 게임 메모리 최적화를 위해 크게 신경써야 할 부분을 설명하고, 최적화를 위한 강력한 툴인 유니티 메모리 프로파일러를 소개했다. 그리고 두 가지의 코딩 팁까지.


  • ■ 모바일 최적화가 왜 중요한가? - 게임이 터지니까




    오지현 에반젤리스트는 강연에 앞서 청중들에게 자신을 간단히 소개한 뒤, 모바일 게임을 개발하고 있거나 계획 중인 사람이 있으면 손을 들어 보라고 요청했다. 많은 사람들이 손을 들었다. 그는 PC도 메모리가 중요하긴 하나, 모바일이 특히 더 메모리 관리가 중요하다고 말했다. PC는 메모리를 확장할 수 있고, 하드 디스크나 SSD같은 저장장치 일부 공간을 활용할 수도 있고, 그래픽 카드에 전용 메모리도 있기 때문이라고 설명했다.

    "모바일은 전혀 얘기가 달라요. 모바일에도 가상 메모리 시스템이 있긴 한데 이런 하드 디스크가 백업해주거나 그런 시스템이 들어 있지 않습니다. 실제 메모리 크기를 벗어나서 사용을 하지 못하고 오히려 더 적어요. 제약이 더 큽니다. 게다가 스펙 상으로 메모리의 크기가 명확하지 않습니다. 안드로이드나 아이폰이나 다 마찬가지입니다. 저 게이지 보이시죠. 저 게이지가 뭐냐면 실시간으로 메모리를 얼마큼 쓰고 있는지 표시하는 겁니다. 녹색 영역 안은 안전한 영역이고요, 노란색은 좀 위험한 거예요. 빨간색은 그냥 무조건 터지는 거예요. 게임이 느려도 유저들이 악플은 남길지언정 플레이는 가능하잖아요? 근데, 메모리는 메모리를 잘못 써버리면 아예 게임이 죽어버립니다. 시스템이 느려진거랑 전혀 다른 문제에요. 그래서 특히 모바일에선 더 중요하다고 볼 수가 있을 거예요"








    "유니티에는 프로파일러 메모리 모듈이 있습니다. 전반적으로 어떤 부분에서 메모리를 사용하고 있는지 볼 수가 있습니다. 솔직히 이거 가지고는 많이 모자란 부분이 있고요, 그래서 제가 권장드리고 싶은 것은 메모리 프로파일러입니다. 이 메모리 프로파일러를 사용하게 되면 현재 게임을 돌리고 있을 때 메모리를 캡처해서 에셋별로 메모리를 얼마나 먹고 있는지 디테일하게 볼 수가 있습니다. 이 메모리 프로파일러 같은 경우는 출시된 지는 꽤 됐습니다."

    "그래픽 메모리는 얼마나 먹고 있고 네이티브는 얼마나 먹고 있고 매니지는 얼마나 먹고 있고 그런 것들을 다 전반적인 사용 상태를 보실 수가 있습니다. 더 디테일하게 보시려면 오브젝트 탭을 선택하면 실제 항목들은 디테일하게 볼 수가 있습니다. 플랫폼별, 디바이스별 비교도 가능합니다. 이런 프로파일 과정들을 통해 찾을 수 있는 메모리 관리적인 측면들을 설명드리겠습니다."



    ■ 메모리 관리를 위해서 - 중복, 오디오, 메시, 텍스쳐, 포맷








    "가장 많이 실수하시는 것 중 하나가 중복된 리소스를 올리는 거예요. 사실 그러기가 쉬운 게 여러 명이 같이 공동 작업을 하다 보면 중복되는 리소스를 서로 다른 폴더에 올리는 경우가 있어요. 예를 들면 폰트 하나로 UI 작업을 할 때 여러 사람이 하다, 한 화면에 동시에 띄워버리면 폰트가 중복되서 메모리에 올라갈 수가 있습니다. 유니티에는 이 같은 파일이 중복되는 것을 체크하는 그런 메커니즘이 없거든요. 메모리 프로파일러를 이용하면 당연히 그런 걸 다 잡아낼 수가 있지만, 에셋 번들을 이용하다 보면 이런 비슷한 일들이 비일비재하게 일어납니다. 에셋 디펜던시에 의해 중복 발생이 가능하기 때문입니다. 저는 웬만하면 어드레서블을 사용하는 걸 권장을 드려요. 어드레서블은 이런 디펜더시를 관리해주는 툴이 있습니다. 라이브 서비스 중인 게임 말고, 신규 개발하는 프로젝트일 경우에는 어드레서블을 권장 드립니다."

    "오디오도 메모리에 영향을 많이 미칩니다. 모노로 할지 스테레오로 할지 선택을 할 수가 있거든요. 그런데 일반적인 모바일 게임에서는 스테레오를 쓸 필요가 없잖아요, 그래서 모노로 선택하는 것을 권장을 드리고요. 압축해서 올리는지, 압축을 풀어서 올리는지도 선택할 수 있습니다. 1메가짜리 이하는 압축된 형태로 올리는 것을, 더 큰 용량이면 스트리밍을 권장합니다. 포맷은 안드로이드와 아이폰 둘 다 보비스를 권장합니다. 좀 의아해 하실 수도 있어요. 일반적으로 아이폰 개발을 할 때에는 mp3가 좋다고 알고 있거든요. 하드웨어의 가속을 받을 수 있기 때문에 mp3를 사용하는 게 일반적인 권장사항인데, 유니티는 그렇지 않습니다."

    "오디오 디코딩을 할 때 소프트웨어적으로 돌리기 때문에 하드웨어 가속을 사용하는 게 의미가 없습니다. 그래서 유니티에서는 안드로이드든 아이폰이든 보비스를 쓰는 것을 권장드립니다. 또 하나 알아두셔야 하는게 뮤트에요. 뮤트를 해서 소리는 안 들어가도 메모리에는 올라가 있는 상태거든요. 소리만 재생을 안 할 뿐이지, 들리지 않는 배경 음악이라고 생각하셔야 합니다. 주크박스 시스템 같은 것도 활성화 되어 있지 않은 음악 같은 경우는 아예 메모리에서 내리는 게 좋습니다. 그런 것들이 메모리에 영향을 미칠 수 있으니까요."

    "메시도 메모리에 영향을 많이 미칩니다. 근데, 조금 헷갈릴 수가 있는 게 메시 컴프레이션 같은 경우는 이건 패키지 용량과 관련된 문제지 메모리 사이즈하고는 상관이 없어요. 어차피 메시 컴퍼레이션 해도 메모리 올릴 때는 이걸 다시 좀 풀어서 올리고 그러거든요. 그것만 조금 헷갈릴 수 있으니까 그것만 생각하시면 될 것 같고요. 영향을 크게 미치는 게 리드, 라이트 이네블(Read/Write Enabled) 옵션입니다. 이걸 키게 되면 GPU 메모리도 올리고 CPU 메모리의 복제본도 올리거든요. 이걸 하게 되면 메모리가 2배로 뻥튀기 되는 거에요. 웬만한 경우에는 이걸 끄는 게 좋습니다."




    "그리고 사실 이 텍스처가 많이 먹어요. 사이즈는 당연히 상식적으로 가능한 작게 하는 게 좋죠.
    근데 무조건 작게 하면 또 이게 비주얼적인 디테일하고 상관이 있는 문제니까 비주얼 퀄리티랑 메모리 사이즈를 잘 따져보셔야 될 거고요. 그래도 가능한 작게 하시는 게 메모리에는 효율적이겠죠. 근데 사이즈보다도 더 중요한 게 메모리 압축 포맷입니다. 메모리 압축 포맷에는 여러 개가 있는데, 기기별로 텍스쳐 압축 포맷이 지원하는 게 다르거든요. 그걸 잘못 올려버리면은 압축을 다 풀어서 메모리에 올려버려요. 그래서 메모리가 터지는 경우가 발생하죠."




    "PVRTC 포맷은 아이폰에서 주로 사용하는 포맷이거든요. 안드로이드 중에서도 PVRTC를 지원하는 게 가끔 있긴 한데 대부분 지원을 하지 않아요. 그렇기 때문에 PVRTC를 안드로이드에, 아니면 그 반대로 ETC를 아이폰에 띄운다거나 하면 메모리가 터지는 경우가 발생합니다. 최근에는 저희가 주로 ASTC 포맷을 권장드립니다. 그러나 ASTC는 구형폰, 예를 들면 아이폰5 같은 데서는 지원을 하지 않아요. 그래서 타겟 디바이스에 맞는 적절한 포맷을 쓰시는 게 중요합니다. 조금 더 디테일하게 설명을 드려보도록 하겠습니다."

    "메모리를 남기려면 PNG가 나은지, JPG가 나은지, 이런 질문을 가끔 받는데 이런 질문은 압축 포맷에 대한 적절한 이해가 부족하기 때문에 하신 질문입니다. PNG냐 JPG냐는 디스크 용량에 관한 것들입니다. 메모리 효율적인 부분과 관계가 없습니다. 저장 용량을 아끼기 위한 것이지, 메모리를 아끼기 위해 JPG를 사용하는 것이 아닙니다. 보통 유니티에서는 ASTC를 권하는데, 플랫폼 대응하기도 편하고 퀄리티도 좋기 때문입니다. ASTC의 큰 강점이 뭐냐면 블록 사이즈를 지정할 수가 있습니다. 보통 하나의 텍스쳐를 여러 개의 블록들로 잘게 쪼개서 블록 단위로 압축하는데, 많이, 잘게 쪼갤 수록 퀄리티가 높아집니다. 블록을 듬성듬성 자르면 용량을 아낄 수가 있는 거고요. 표현할 디테일에 따라 블록을 조절할 수가 있는 포맷이라고 보시면 될 것 같습니다. 그래서 기존 PVRTC나 ETC, 원본을 비교해 보면 퀄리티 차이가 많이 납니다. 아이폰5 같은 구형 모바일에선 지원하지 않는 것이 문제이긴 합니다. ASTC를 지원하는 기계가 전 세계적으로 77% 정도 점유율인데, 타겟이 23%의 신흥국이라면 사용을 보수적으로 생각해봐야 합니다."






    ■ 코딩 팁 두 가지- 씬 전환과 가비지 컬렉션

    "그리고 코딩 팁 같은 것도 좀 몇 개 더 추가적으로 좀 드릴게요. 그러니까 아까 말씀드렸던 것처럼 이 메모리 프로파일을 사용하게 되면 셀을 어떻게 관리해야 될지 그런 것들을 다 디테일하게 까볼 수가 있거든요. 그런데 에셋뿐만이 아니고, 코딩 관련돼서도 메모리를 많이 먹는 부분이 있잖아요. 일반적으로 많이 메모리가 터지는 경우가 씬 로딩 할 때입니다. A씬에서 B씬으로 넘어갈 때 B씬이 로드 완료되야 A씬이 내리거든요, 그럼 순간적으로 A씬과 B씬이 공존하는 경우가 발생합니다. 둘 다 가벼우면 상관 없는데, 둘 다 무거우면 순간적으로 메모리가 터집니다. 그렇기 때문에 이런 경우를 방지하기 위해서 C라는 중간 씬을 권장합니다. C씬은 로딩이라든가, 간단한 장면으로 구성하는 겁니다. A씬에서 C씬을 로드하고, C씬이 로드가 끝나면 A씬을 내리고, B를 로드하는거죠. B씬과 C씬이 공존하는 건데, C씬은 가벼우니 메모리가 터지지 않습니다."




    "또 코딩하면서 메모리 쪽으로 많이 발생하는 이슈가 아마 가비지 컬렉터 쪽일 거예요. 이 가비지 컬렉터는 어떤 의미냐면 우리가 오브젝트를 새로 생성하고 나서 우리가 이걸 명시적으로 삭제 하진 않잖아요. 오브젝트를 생성했는데 오브젝트를 오랫동안 안 쓰인다. 또는 영구적으로 쓰이지 않는 상황이라면 메모리 매니지먼트 시스템에서 알아서 내려주는데, 그러는 과정에서 가비지라는 것이 발생을 합니다. 이걸 주기적으로 지워줘야 합니다. 중요한 건 메모리 파편화가 발생합니다. 총 메모리 사이즈는 아직 많이 있는데 그런 중간중간에 구멍이 많이 생겨가지고 메모리 효율적으로 뭔가 배치할 수 없는 상황이 발생한다거나, 매니지먼트 시스템이 이런 것들을 효율적으로 만들어주기 위해서 빈틈을 없애주는 메모리를 재정렬 하는 부분도 있고, 내부적으로 복잡한 과정을 거칩니다. 그래서 우리가 코딩을 할 때 이런 가비지가 발생을 하지 않도록 만들어주는 게 좋습니다."

    "최적화라는 게 워낙 광범위하다 보니까 50분 정도의 시간으로 다 말씀드릴 수는 없어요. 당연히 저희가 이런 가이드북을 굉장히 많이 만들어 놨습니다. 최적화 관련해서 가이드가 많으니까 이런 걸 참고해 보시면 더 많은 도움이 되실 거라고 생각을 합니다. 그래서 제가 준비한 내용은 여기까지입니다. 마지막으로 광고 하나만 할게요. 저희에게 개발자 좀 구해달라고 많이 요청하십니다. 근데, 제 코가 석자예요. 유니티도 많이 채용을 하고 있습니다. 프로그래머, 아티스트, 프로덕트 매니저 등 다양한 부분에서 구인을 하고 있습니다. 시니어 뿐만이 아니라 주니어 레벨도 구인하고, 많은 레벨을 구하고 있으니까 많은 관심 가져주시면 감사할 것 같습니다."

    댓글

    새로고침
    새로고침

    기사 목록

    1 2 3 4 5