iDev/Cocos2D

CCSpriteBatchNode 성능 테스트

KraZYeom 2012. 11. 6. 08:00
반응형

게임에서는 이미지들이 다시 사용되는 경우가 많다. 이미지들을 많이 사용하지 않으면 모르겠지만, 자주 재 사용 경우에 GPU, RAM 등등 시스템의 전반적인 성능에 영향을 미친다. 

그래서 아래 소스코드와 같이 무식하게 간단한 테스트를 해보았다.  Cocos2D Sprite-Batch Performance Test 참조 

동일한 스프라이트 시트를 사용해서 동일한 스프라이트를 하나는 배치노드를 사용해서, 나머지는 그냥 스프라이트를 사용해서 500번 램덤하게 위치 시켜 보았다. 이미지를 다양하게 사용했을 경우 등 다른 환경은 테스트를 하지 않고 그냥 단순하게 했다.


iPhone 4S에서 성능 테스트를 했으며, iPhone Simulator에서는 사용하는 openGL의 종류가 다르기 때문에 제대로된 측정이 불가하다. iPhone 3GS에서 테스트를 했을때는 훨씬 좋지 않는 성능이 나오긴 했으나, iPhone 4S에서와 마찬가지로 배치노드를 사용했을 때가 월등히 좋은 결과가 나왔다.


- (void)addTestSprite{

    NSString *spriteName = @"test";

    NSString *plist = [NSString stringWithFormat:@"%@.plist",spriteName];

    NSString *textureFileName = [NSString stringWithFormat:@"%@.png",spriteName];

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:plist textureFilename:textureFileName];


    CGSize size = [[CCDirector sharedDirector] winSize];

    for (int i = 0; i < kMaxSprite; i++) {

    CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:@"icontest.png"];

    sprite.position = ccp(CCRANDOM_0_1() * size.width , CCRANDOM_0_1() * size.height );

        [self addChild:sprite];

    }

}


- (void)addTestSpriteByBatchNode{

    NSString *spriteName = @"test";

    NSString *plist = [NSString stringWithFormat:@"%@.plist",spriteName];

    NSString *textureFileName = [NSString stringWithFormat:@"%@.png",spriteName];

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:plist textureFilename:textureFileName];

    CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithFile:textureFileName];

    [self addChild:batchNode];


    CGSize size = [[CCDirector sharedDirector] winSize];

    for (int i = 0; i < kMaxSprite; i++) {

        CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:@"icontest.png"];

        sprite.position = ccp(CCRANDOM_0_1() * size.width , CCRANDOM_0_1() * size.height );

        [batchNode addChild:sprite];

    }

}



CCSpriteBatchNode 를 사용했을 때, 60FPS가 나온다.


CCSpriteBatchNode를 사용하지 않았을때, 30FPS 미만이 나온다.

이런 결과가 나오는 이유는, 위의 화면캡쳐의 왼쪽 하단을 노드 갯수 보면 알수 있다. 배치노드를 사용하면 동일한 스프라이트를 메모리에서 재사용해서 사용하는데, 사용하지 않으면 다시 생성해서 쓰는 것 같다. 1초에 화면을 반복해서 다시 그리기 때문에 노드의 갯수가 많아지면 많아질수록 성능의 차이가 난다. 



각 아이폰 시리즈 마다 텍스쳐 싸이즈의 최대값이 달라지고 메모리가 다르기 때문에 최적의 스프라이트 구성이 중요할 거 같다.



반응형