2014-12-04 56 views
2

我目前有SpriteKit和SKTexture預加載一個奇怪的間歇性問題。我有圖像的多個陣列,這是我在預裝以下格式:SpriteKit有時無法加載SKTexture

- (NSDictionary *)loadTexturesWithNames:(NSArray *)aNames 
{ 
    NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
    NSMutableArray *textureArray = [NSMutableArray array]; 

    for (NSString *textureName in aNames) 
    { 
     SKTexture *texture = [SKTexture textureWithImageNamed:textureName]; 
     if (texture) 
     { 
      [textureArray addObject:texture]; 
      [dict setObject:texture forKey:textureName]; 
     } 
    } 

    [SKTexture preloadTextures:textureArray withCompletionHandler:^{ 
     _iCounter++; 
     [self loadTextures]; 
    }]; 

    return dict; 
} 

這工作的時間細90%,但偶爾我得到以下錯誤:

SKTexture: Error loading image resource:

這不會發生上任何特定的圖像集,只是隨機。所以有時玩家會加載罰款,其他人不會。這可能是一個記憶問題嗎?我使用_iCounter分割加載的紋理,確保在開始下一個圖像之前加載前一組圖像,以嘗試並停止太多的併發加載。這加快了這個過程,但我仍然看到這個間歇性問題。

有沒有人看過這個,或者有什麼想法可能會導致這種情況?

回答

2

根據我的經驗,一個常見原因是當您不等待完成處理程序被調用時。比如做這樣的事情,其中​​「圖像」是被預裝會出錯的可能來源的一個圖像:

[self loadTexturesWithNames:names]; 
SKSpriteNode* sprite = [SKSpriteNode spriteNodeWithImageNamed:@"image"]; 

如果你創建的精靈節點和紋理只在loadTexture方法應該沒事當然。除非您執行其他後臺任務,或者您在後臺運行loadTextureWithNames選擇器(單獨的線程)。

+0

嗨,當預加載紋理是有開銷存儲引用他們像我目前這樣做?即簡單地加載紋理然後像你一樣調用[SKSpriteNode spriteNodeWithImageNamed:@「image」]會更好嗎?我不使用任何紋理,直到所有的圖像已經預先加載完畢,但是通過完全分離這個調用來檢查這不是問題。 – 2014-12-04 13:26:05

+1

當loadTexturesWithNames:方法返回時,你的textureArray會被釋放,而數組也不會被傳遞到loadTexture中。這可能實際上使預加載無效,取決於Sprite Kit中如何實現紋理緩存。 – LearnCocos2D 2014-12-04 13:29:19

+0

我認爲你可能已經擊中了頭部,我把它存儲在一個整體保留的數組中,現在它似乎正常加載。謝謝您的幫助。 – 2014-12-05 11:26:47