반응형

게임 개발시 1개의 이미지 파일을 여러번 사용해야 하는 일이 종종 발생합니다.

예를들어 상점 같은 팝업에 아이템 배경이라던가 또는 버튼의 배경이미지 같은 경우

동일한 이미지를 사용하는데 여러번 파일을 로드해야 합니다.



1) 이미지 파일 로드하여 사용

기본적으로 아래와 같은 방식으로 사용하죠.

1
2
    auto sprite1 = Sprite::create("btn_bg.png");
    this->addChild(sprite1);
cs

위와같이 사용할 경우 여러번 호출 시 파일 입출력이 많이 일어나게 되어 속도영향을 줄 수 있습니다.


2) 이미지 파일 메모리에 로드하여 사용

파일I/O를 줄이기 위해 많이 사용되는 파일들은 아래와 같이 메모리에 로드하여 사용 합니다.

1
2
3
    SpriteFrameCache::getInstance()->addSpriteFrame(Sprite::create("btn_bg.png")->getDisplayFrame(), "btn_bg");
    auto sprite1 = Sprite::createWithSpriteFrameName("btn_bg");
    this->addChild(sprite1);
cs

가장 좋은 방법이긴 하지만 메모리에 이미지를 로드하기 때문에 많은 파일을 로드시 메모리가 많이 늘어 납니다.


그래서  사용이 끝나고 나면 아래와 같이 제거해 주는것이 좋습니다.

1
SpriteFrameCache::getInstance()->removeSpriteFrameByName("btn_bg");
cs

하지만 간혹 빼먹을 수도 있고 귀찮아서 하지 않는 경우도 있습니다.( 머 요즘 하드웨어 성능이 좋으니..허허..)


[ 여기서 잠깐 ]

잠시 안드로이드 앱 마켓 시장에 대해 얘기해보겠습니다. (주관적인 제생각으로)  

안드로이드 시장이 급격하게 변화되고 있습니다.

안드로이드 버전이 벌써 API 23(마시멜로 6.0)까지 출시가 되었습니다.

그러나 구글 통계에 따르면 안드로이드 API레벨 9 ~ 11 (버전 2.3 ~ 3.0)를 사용하는 사용자가 아직도

게임 전체에서 16%나 사용한다는 점입니다.

(4.x 버전사용자가 50%이상으로 가장 많다고 합니다.)


Facebook SDK 4.x 버전을 사용하려면 안드로이드 API 11 이상 필요합니다. (API 10이하는 Crash 발생)

많은 분들이 높은 Facebook SDK버전을 사용하기 위해 안드로이드 2.x 를 버려야 하나 생각하지만... 

결국 페북 3.x버전을 사용 중이 더군요.


그만큼 2.x수요가 높다는걸 알 수 있습니다.

2.x 버전을 사용하는 스마트폰의 성능은 갤럭시2 ~ 갤럭시노트1 정도 수준이하라는 점이죠.

모바일 게임에서 최적화 작업이 리소스를 줄여 50M이하로 용량을 줄이는 작업도 있지만 

속도 개선 및 메모리 관리도 아직은 중요한 것 같습니다. 

[ /여기서 잠깐 ]


3) 이미지파일 로드 한번으로 복사하여 사용하기

파일로드 한번으로 여러개를 복제하여 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    auto sprite1 = Sprite::create("btn_bg.png");
    this->addChild(sprite1);
    
    auto sprite2 = Sprite::createWithSpriteFrame(sprite1->getSpriteFrame());
    this->addChild(sprite2);
 
    auto sprite3 = Sprite::createWithSpriteFrame(sprite1->getSpriteFrame());
    this->addChild(sprite3);
    
    Sprite* sprite[10];
    for (int i = 0; i < 10++i) {
        sprite[i] = Sprite::createWithSpriteFrame(sprite1->getSpriteFrame());
        this->addChild(sprite[i]);
    }
 
    // 원본제거
    sprite1->removeFromParent();
cs

Frame을 복사했기 때문에 sprite1이 소멸되어도 나머지 sprite는 영향을 받지 않습니다.

그리고 가장 편한 점은 모든 Node들은 autorelease() 되기 때문에 추가로 Frame을 제거해야 하는 일도 없습니다.



단 1회 사용하는 이미지는 1번사용해도 무관합니다.

계속 메모리에 상주하며 사용해야 하는 이미지들은 2번째 방법을 사용하면되고

팝업이나 특정부분에서만 사용하는 이미지들은 3번째 방법을 사용하면 좋을 것 같습니다.




반응형

+ Recent posts