2014-12-04 5 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

내 경험상 일반적인 원인은 완료 핸들러가 호출 될 때까지 기다리지 않는 경우입니다. 이 같은 일을 예를 들어 여기서 "이미지"오류의 가능한 원천이 될 것입니다 사전로드되는 이미지 중 하나입니다 : 당신은 단지 loadTexture 방법에 괜찮을 스프라이트 노드와 텍스처를 만들 경우 물론

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

. 다른 백그라운드 작업을 수행하거나 백그라운드에서 loadTextureWithNames 선택기를 실행하지 않는 한 (개별 스레드).

+0

안녕하세요, 텍스처를 미리로드 할 때 현재 내가하는 것처럼 참조를 저장하는 데 오버 헤드가 있습니까? 나는. 간단히 텍스처를로드 한 다음 [SKSpriteNode spriteNodeWithImageNamed : @ "image"]를 호출하는 것이 좋습니다. 모든 이미지가 미리로드 될 때까지는 텍스처를 사용하지 않지만 호출을 완전히 분리하여 문제가 아닌지 두 번 확인합니다. –

+1

일단 loadTexturesWithNames : 메서드가 반환되고 배열이 loadTexture로 전달되지 않으면 textureArray가 해제됩니다. Sprite Kit에서 텍스처 캐싱이 구현되는 방식에 따라 실제로 미리로드가 null이거나 무효화 될 수 있습니다. – LearnCocos2D

+0

머리에 못을 박았을 것으로 생각합니다. 전반적으로 유지 된 배열에 저장 했으므로 이제는 제대로로드 된 것 같습니다. 도와 주셔서 감사합니다. –