묻고 답하기

|  question and answer

제작중인 RMMV 게임을 모바일로 테스트 하고 있는데,


플레이시 Garbage Collector가 제 기능을 안 하는 건지, 플레이 시간 10분이 넘어가면 해당 게임이 차지한 메모리가 500MB를 넘어가네요.


결국은 메모리 부족으로 튕기고 말았습니다.


(당연히 모바일 버전은 pc버전과 다르게 최대한 가볍게 만들었습니다. 때문에 플레이할 땐 억수로 부드럽게 실행됩니다.)


 해결책으로 여러가지 방법을 찾아보았습니다만, 메모리 관리 플러그인은 전부 소용이 없었네요.


아마 1.3.1버전인가에서 메모리 누수문제는 해결되었기 때문에 그 이전에 나온 플러그인은 의미가 없었던 것 같네요.



그래서 rpg_core와 rpg_managers.js 파일을 열고 메모리 관련 부분을 살펴보았는데,


메모리 초기화 관련 부분이 보이더군요.


ImageManager.clear()

ImageManager.clearRequest()

ImageCache.prototype.initialize()


하지만 ImageManager.clear()와 clearRequest()는 전혀 소용이 없더군요.

게임 중간 중간 스크립트를 넣어봤는데, 넣기 전과 넣은 후가 딱히 차이가 없었습니다

결국 플레이 도중 램문제로 10분정도 지나면 똑같은건 마찬가지였습니다.


때문에 며칠을 모바일 메모리 문제로 싸매고 있는데 모바일 램 최적화를 위한 다른 방법이 없는지 조언을 구하고 싶습니다...! ㅜ





아래는 제작 환경과 앱 정보입니다.




APK 용량은 약 20MB  


대화씬이 조금 잦아서 스탠딩 CG 교체가 자주 이루어지고 텍스트 분량도 적지는 않음.




사용된 플러그인은 MBS_MobileDirPad (모바일 패드)와 


러닝은빛님의 RS_OnlyOgg (ogg우선재생 플러그인) 2개 뿐이고,


RPG maker MV 버전은 1.6.0

 

Parallex 이미지는 모바일 최적화를 위해 사용하지 않음.

 

해상도는 약 700x400 사이즈, 각 이미지 파일은 10KB +- 10 정도로 작은 파들 뿐.


BGM도 대략 500KB SE도 10KB.


오브젝트 갯수는 많아봐야 20개,


맵 크기 30x30~40x40.


병행 처리 이벤트도 5개를 넘지 않음.


APK 포팅 환경은 안드로이드 스튜디오.



:: 대략 오브젝트 개수와 맵 크기는 아래와 같음 ::

 

캡처 2.PNG


:: 대부분의 이벤트는 아래처럼 모바일 최적화를 거쳐 최대한 단순하게 구현했음 ::


캡처.PNG




기타 성능


FPS는 모든 구간에서 기본 30 이상.

렉없이 부드럽게 실행됨.

 


 

■ 질문전 필독!
  • 질문할 내용이 이 게시판이나 강좌에 이미 있는지 확인합니다.
  • 하나의 게시물에는 하나의 질문만 합니다.
  • 제목은 질문의 핵심 내용으로 작성합니다.
  • 질문 내용은 답변자가 쉽게 이해할 수 있도록 최대한 상세하게 작성합니다.
  • 스크립트의 전문이 필요할 경우 txt 파일 등으로 첨부해 주시기 바랍니다.
  • 답변받은 게시물은 삭제하지 않습니다.
  • 답변이 완료된 경우 해당 답변해주신 분들께 감사의 댓글을 달아줍니다.
    • 처음 오신 분들은 공지 게시물을 반드시 읽어주세요!

※ 미준수시 사전경고 없이 게시물을 삭제합니다.

Who's 케이디

profile
홈페이지 : 
http://keidy.tistory.com/
유튜브 채널 : 
https://www.youtube.com/channel/UC9w-j0OqNzdtOqiYj4lDHmg/

Unity 
패러독스 이식중

RPG MAKER MV
이상 세계 (理想 : 異常)



RPG MAKER VX ACE
패러독스 (PARADOXX)
챕터1

(챕터2 제작중)


단간론파 X : 절망 계획의 시작
챕터1, 챕터2, 챕터3
(챕터4 제작중)





Comment '7'
  • profile
    러닝은빛 2018.04.15 23:48

    가비지 컬렉션이 실행되지 않았다하셨으므로, 의심 가는 부분을 처리해봤습니다.

    https://github.com/biud436/MV/raw/master/RS_PictureTool.js

    WebGL 모드라면 Graphics.callGC(); 도 한 번 수동으로 호출해보시기 바랍니다.


    Graphics._renderer.textureManager._managedTextures.length


    를 호출하면, 저장되어있는 텍스처 갯수를 확인할 수 있습니다.

  • profile
    케이디 2018.04.16 13:46
    WebGL 모드로 바꿔보고 말씀하신 callGC() 스크립트를 수동으로 호출해볼게요!

    아, 그리고 스크립트는 러닝은빛님의 OnlyOGG만 사용하고 있었습니다. PictureTool은 처음보는 스크립트입니다만
    혹시 PictureTool 스크립트를 넣어보라는 말씀이신지...?
  • profile
    러닝은빛 2018.04.16 15:15
    모바일로 돌리실 때 WebGL 모드가 아니었다면 이것과는 다른 문제이고, 어디가 문제인지 저는 알 수가 없습니다.

    하지만 WebGL 모드라면 어느 정도 의심가는 부분이 있습니다. 이전 댓글에서는 내용이 길어져 생략했었는데요.

    1.  Graphics.callGC() 란?
    Graphics.callGC()는 TextureManager에 쌓이게 되는 Texture를 삭제하는 명령으로 WebGL 모드에만 있는 개념입니다. 

    TextureManager나 Texture는 처음 보실 수도 있는데 PIXI 라이브러리에서 WebGL 모드에서 사용하는 객체들입니다.

    1프레임을 렌더링할 때 textureGC.update가 호출되고, 프레임 수를 세기 시작합니다. 600 프레임 이상이 렌더링되면, Graphics.callGC()가 자동으로 호출됩니다.

    그러면 필요 없게 된(렌더링이 되지 않는) Texture를 제거합니다.

    필요 없는 텍스처의 기준 : 원래는 3600 프레임 이상, 렌더링되지 않는 텍스처였는데. 알만툴 코드에선 1 프레임으로 수정됨.

    2. 그림의 삭제에 대해
    원래 PIXI에서는 addChild와 removeChild를 사용하여 스프라이트를 만들고 제거합니다. MV에서는 맵이 생성될 때 addChild되고, 다른 맵이나 메뉴를 열 때 removeChild 됩니다. 

    ** 그림은 removeChild를 맵 전환 전까지 호출하지 않는다.
    그림(Sprite_Picture)의 경우, 그림의 삭제를 한다고 해서 removeChild를 임의로 호출하지 않습니다. 

    비트맵을 새로 만드는 개념입니다. 비트맵에선 PIXI에서 사용하는 BaseTexture 객체를 만듭니다. 

    그러면 기존에 있던 BaseTexture 객체가 그대로 남게 되고, 바로 삭제되지는 않는 듯 합니다.
    (Graphics._renderer.textureManager._managedTextures.length를 호출해보면 알 수 있습니다)

    맵 생성 시 미리 그림의 최대치까지 만들어놓고 게임이 끝나기 전까지 해당 객체를 제거하지 않는 방식입니다. 

    하지만 PIXI 개발자에 의하면, 메모리를 정리하려면 removeChild를 호출하라고 합니다.

    removeChild 호출 후 몇 분 기다리면 바로 되지만, 직접 제어하고자 한다면 destroy까지 호출하라고 합니다.

    원래 기존의 그림의 삭제는 removeChild를 호출하지 않고, 비트맵만 계속 새로 생성합니다.

    비트맵이 새로 만들어지면, BaseTexture가 계속 생성되겠죠.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
      $.deletePicture = function (picId) {
        var container;
        if(!$.isMap()) return false;
        container = SceneManager._scene._spriteset._pictureContainer;
        if(!container) return false;
        var picSprite = $.findPicture(picId);
        var sprite = new Sprite_Picture(picId);
        container.addChild(sprite);
        container.swapChildren(picSprite, sprite);
        container.removeChild(picSprite);
        picSprite.destroy({children:true, texture:true, baseTexture:true});
      };
     
      Game_Screen.prototype.erasePicture = function(pictureId) {
        var realPictureId = this.realPictureId(pictureId);
        this._pictures[realPictureId] = null;
        $.deletePicture(realPictureId);
      };
     
    cs


    그래서 PictureTool에서는 위 코드와 같이 그림을 삭제 할 때, Texture도 삭제되게 destroy 명령도 호출합니다.


    기존 그림이 있던 자리에는 비어있는 걸 새로 만들어놓으면 감쪽같죠.


    테스트 후 별 효과가 없었다면 다른 문제입니다.

  • profile
    케이디 2018.04.18 12:55
    러닝은빛님의 플러그인과 CallGC();를 해보았지만 결국 해결을 못 봤습니다 ㅠ
    다만 메모리가 쌓이는 문제의 직접적인 원인을 알아낸 것 같습니다.
    픽쳐나 사운드가 아니라 '맵칩셋'의 문제더군요.
    맵을 이동할 때마다 메모리가 작게는 몇 MB에서 수십 MB씩 누적되는 것을 확인했습니다.
    그래서 게임 도중 약 2~30번의 맵 이동 마다 메모리 부족으로 튕기는 현상이 있더군요.
    특히 퍼즐을 풀다가 막혔을 경우, 다시 리셋시키는 기능이 있는데,
    이 기능이 다른 맵으로 이동했다가 다시 본래 맵으로 이동시켜서 리셋시키는 원리입니다.
    그 기능을 연속으로 열 번 넘게 쓰면 그대로 튕기더라구요.

    아무래도 사용된 맵타일셋을 제거하는 기능이 제대로 작동하지 않은 것 같습니다. ㅜ
    rpg maker mv로 괜히 넘어온 기분이 드네요 헣....
    모바일 최적화에 이렇게 힘이 들 줄이야. vx ace는 Cache.clear()만 있으면 거의 해결이었는데...
  • profile
    러닝은빛 2018.04.22 17:48

    파일의 용량을 줄이는 것은 메모리에서 소용 없습니다. 이미지 메모리 할당은 파일 내에서 이미지의 가로 크기 * 세로 크기 * 채널 수를 읽어서 판단합니다.

    타일맵에서는 가로 2048픽셀, 세로 2048픽셀 이미지 4개로 만들어서, 여기에 모든 타일셋 이미지를 넣습니다..

    해당 2K 이미지는 압축하지 않은 상태에서 16MB나 차지합니다. 하지만 그게 4개이므로 64MB입니다.

    그래서 64MB나 차지합니다.

    해결 방법은 성능은 좀 낮지만 캔버스 모드로 돌리는 방법(커뮤니티 베이직 플러그인에서 auto 말고 canvas로 설정)도 있고,

    다른 엔진처럼 해당 플랫폼에 맞는 압축 텍스처를 사용하는 방법이 있는데요.

    안드로이드에서는 제대로 되지 않습니다.

    안드로이드 WebGL 기준 사양인 OpenGLES 2.0에서는 etc1 같은 압축 텍스처를 지원한다고 되어있는데,

    헤더가 iOS의 PVR 텍스처 기준이라 안드로이드의 ETC1은 헤더 조차 읽지 못하고 있습니다.(파일의 매직 넘버가 PKM인데, iOS의 PVR로 되어있어서 못 읽습니다)

    iOS에서는 PVR 텍스처를 지원합니다. (PVRTexTool로 압축 가능)

    그래서 소스를 받아서 PKM ETC1에 대한 부분을 나름 추가해보고 테스트 해봤지만, 


    (압축은 이걸로 https://developer.arm.com/products/software-development-tools/graphics-development-tools/mali-texture-compression-tool )

    헤더하고 이미지 가로, 세로 등 전부 잘 읽혔는데, 이미지가 검정색으로만 렌더링되는 렌더링 문제가 있습니다.

    안타깝지만, 이건 제 스킬상 당장 해결은 못할 것 같습니다. 


    그리고 원래 시간이 좀 지나면 메모리가 해제되어야 하는데, 계속 쌓이는 것도 좀 오리무중이네요.


    원래 메모리가 좀 기다려야 해제되는데, 연속으로 10번 이상 메뉴를 열었다 닫았다, 맵을 왔다갔다 하면 메모리가 불어나면서 튕길 수는 있습니다.

  • profile
    러닝은빛 2018.04.22 18:06

    추가로, 리셋 기능을 맵 이동 말고, 이벤트 위치를 스크립트 함수를 이용하여 따로 초기화하는 식으로 하는 게 좋을 것 같기도 합니다.

  • profile
    케이디 2018.04.25 19:42
    혹~시나 해서 저도 위 PKM ETC1을 이용한 방법을 시도해봤지만 역시나... ㅜㅜㅜ ㅋㅋㅋ

    아무래도 원활하게 모바일로 돌리기 위해선 처음부터 유니티를 선택하는 것이 답인 것 같습니다.

    쯔꾸르 MV로 모바일 최적화하려니, 메모리 관리가 워낙 힘들어서 유니티가 더 편한 것 같네요.

묻고 답하기

question and answer

List of Articles
분류 제목 글쓴이 날짜 조회 수
공지 묻고 답하기 가이드 습작 2014.06.14 10259
RMMV 모게코 게임처럼 시작하는 동시에 이미지만 나올 수 있는 방법이 있나요? 1 에러는내친구 2018.04.26 63
RM2k3 추격 이벤트를 만들 때 1 인큐버스 2018.04.26 38
RMVXA RPG VX ACE 해상도 높이는 방법 아시나요?! 뉴리키 2018.04.26 61
RMMV 자료실에 있는 플러그인 호환문제입니다. 4 killcoro 2018.04.25 56
RMMV rpg maker MV 모바일 메모리 누수!? 7 file 케이디 2018.04.14 161
RMVXA 질문이 좀 많아요 ㅠㅠ (맵 만들기) 4 file 시니쓰 2018.04.24 74
RMVX 사람들과 주인공이 오브젝트를 뚫고다니지 못하게 하는 법 2 닉네임이없어요 2018.04.24 53
RMMV 이런 Ui는 구현이 불가능할까요? 4 file 몽롱하다 2018.04.20 144
RMMV MOG Battle Hud 질문 드립니다. saury 2018.04.22 42
RMMV 케릭터 얼굴을 넣으려 하는데 2 Banwall087 2018.04.21 75
RMVXA npc를 이벤트상에서 이동하게 하는중에 질문드립니다. 1 killcoro 2018.04.21 50
RMVXA rpg vx ace를 어떻게 실행하는지를 모르겠습니다. 2 file 바가베가 2018.04.19 64
RMMV 사이드 뷰 배틀의 케릭터 위치를 바뀌고 싶습니다. 1 만죠메군 2018.04.18 50
RMMV 사이드뷰 전투 질문 1 한글화마스터 2018.04.15 60
RMMV rpg maker mv 소프트웨어에서 gif를 사용하는 방법이 궁금합니다. 3 이달수 2018.04.12 109
RMMV 세이브하고 다시 불러오기로 했을 때, 원래 있던 이벤트 말고 다른 방향으로 갈아타게 하고 싶습니다. 7 파란소리 2018.04.07 111
RMMV HP,MP,TP,LV 이것들은 삭제 했는데 이것은 어디서 삭제 하나요??? 5 file 해킹당한해커 2018.03.30 100
RMVX 한글 또는 영어 비밀번호를 쓰는 탈출 게임을 만들고 싶습니다 1 아야누 2018.04.16 62
RMVX 알만툴 VX 플레이어 시작위치 변경 1 MCHDF 2018.04.16 52
RMMV 스크립트에서 왜 영상이 출력되지 않는지, 반복 재생(루프)이 되지 않는지 궁금합니다...(반복재생 되도록 수정 부탁드려요 8ㅅ8) 2 file 이달수 2018.04.14 45
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 434 Next
/ 434