2015-01-20 3 views
2

У меня есть анимация .png в моем проекте с 700 фотографиями и размером 150 пикселей x 150 пикселей..png анимация медленная производительность в spritekit

он работает нормально, но каждый раз, начинается анимация, вся игра замерзает около 0,1 секунды. как и его загрузка, но я реализовал массив .png в initWithSize. например:

SKTextureAtlas *barrierUfoAtlas = [SKTextureAtlas atlasNamed:@"BarrierUfoAnimation"]; 
NSArray *barrierUfoAtlasNames = [barrierUfoAtlas textureNames]; 
NSArray *sortetBarrierUfoAtlasNames = [barrierUfoAtlasNames sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
NSMutableArray *barrierUfoTextures = [NSMutableArray array]; 

for (NSString *filename in sortetBarrierUfoAtlasNames) { 
    SKTexture *texture = [barrierUfoAtlas textureNamed:filename]; 
    [barrierUfoTextures addObject:texture]; 
} 
self.barrierUfoAnimation = [SKAction animateWithTextures:barrierUfoTextures timePerFrame:0.024]; 

а затем во время игры примерно через 1-2 мин. начинается анимация. В этот момент ничего не нужно загружать, просто запустите анимацию. есть ли способ его улучшить?

+1

Вы можете иметь сообщение «загрузки», а все ваши игровые активы загружаются и начать свою игру играть когда-то сделали. – sangony

+0

ok спасибо, но когда я реализую массив с файлами .png, они еще не загружены? не могли бы вы более подробно рассказать о своей идее? как это устроить? – NeoGER89

+1

Знаете ли вы, что 150x150 раз 700 равно примерно 60 мб памяти? Возможно, вы просто не можете вместить все это в память в одно и то же время, в зависимости от другого использования памяти и устройства. – LearnCocos2D

ответ

4

Это один из многих способов для предварительной загрузки:

@implementation GameScene { 
SKTextureAtlas *myAtlas1; 
BOOL loadingComplete; 
} 

-(id)initWithSize:(CGSize)size { 
    if (self = [super initWithSize:size]) { 

    // the usual stuff... 

    loadingComplete = false; 
    [self loadMyAtlas1]; 
    } 

    return self; 
} 

-(void)loadMyAtlas1 { 
    myAtlas1 = [SKTextureAtlas atlasNamed:@"MyAtlasName"]; 
    [SKTextureAtlas preloadTextureAtlases:[NSArray arrayWithObject:myAtlas1] withCompletionHandler:^{ 
    [self finishedLoading]; 
    }]; 
} 

-(void)finishedLoading { 
    // other stuff you might do here 
    loadingComplete = true; 
} 

-(void)update:(CFTimeInterval)currentTime { 
    if(loadingComplete) { 
     // run game code 
    } else { 
     // wait for the water to boil 
    } 
} 
+0

спасибо, что работает для меня. не знал об этом методе предварительной загрузки. – NeoGER89

+1

Предварительная загрузка - это ответ. Даже при том, что я заполняю массив при начале анимации сцены, в первый раз отставал. Preload решит это. Благодарю. – mkeremkeskin

+0

спасибо, что работает отлично! – StackBuddy

Смежные вопросы