2015-12-03 84 views
-1

我正在做一个精灵套件游戏。那么,我试图在加载屏幕停留在屏幕上时在后台加载精灵。我有以下的功能。它做我想要的,但“有时”它崩溃。相同的代码,它为什么会崩溃或不崩溃?我在iPhone 5,iPhone 6+和iPad 2上进行了测试。该功能在iPhone 5和6+上的崩溃并不多,但在iPad 2上崩溃了很多。预先感谢。这是功能;iOS调度异步崩溃

func loadingScreen() { 
    //Initialize loading sprite. 
    let loadBg = SKSpriteNode(imageNamed: "loadBg.png"); 
    loadBg.size = CGSize(width: self.size.width, height: self.size.height); 
    loadBg.position = CGPoint(x: self.size.width/2, y: self.size.height/2); 
    loadBg.zPosition = 10; 
    self.addChild(loadBg); 
    let loadBar = SKSpriteNode(imageNamed: "load1.png"); 
    loadBar.size = CGSize(width: self.size.width/3, height: (self.size.width/3)*0.20); 
    loadBar.position = CGPoint(x: self.size.width/2, y: self.size.height*0.1); 
    loadBar.zPosition = 11; 
    self.addChild(loadBar); 
    var loadAni:[SKTexture] = []; 
    for index in 1...17 { 
     loadAni.append(SKTexture(imageNamed: "load\(index).png")); 
    } 
    loadBar.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(loadAni, timePerFrame: 0.01))); 
    let qualityOfServiceClass = QOS_CLASS_BACKGROUND 
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) 
    dispatch_async(backgroundQueue, { 
     // Codes. 
     self.startGame() 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      // Codes after loading. 
      self.objectSlider.runAction(SKAction.repeatActionForever(SKAction.moveByX(-self.size.width/5.8, y: 0, duration: 0.5))) 
      self.printPlayer() 
      self.isGameOver = false; 
      loadBg.runAction(SKAction.sequence([SKAction.fadeOutWithDuration(0.2),SKAction.removeFromParent()])) 
      loadBar.runAction(SKAction.sequence([SKAction.fadeOutWithDuration(0.2),SKAction.removeFromParent()])) 
     }) 

    }) 
} 

回答

0

你需要非常小心,确切地知道你在用线程做什么。您的崩溃可能是线程安全问题,但根据您发布的内容无法知道。您需要重新开始,真正考虑您需要做什么以及线程的使用如何影响。从我所看到的情况来看,加载图像作为后台线程中的纹理加载图像数据将被取消,直到图像数据实际无论如何被访问,您都不会获得任何好处。崩溃最可能的原因是从后台线程调用startGame(),但实际上无法从您发布的内容中分辨出来。说到线程,如果你做了一些疯狂的事情并且崩溃了,那就不要这么做。

+0

那么基本上,如何在主线程中运行加载动画时在后台运行函数?那么如何在后台的功能完成后删除加载动画? – white5tone

+0

你不能。至少不喜欢你正在尝试这样做。加载PNG图像意味着压缩数据被解码到内存中。这是巨大的数据通胀,并占用大量的内存。您不能只是“在后台加载它”,因为设备没有足够的内存来缓存内存中的所有图像数据。你有一个基本的概念问题。例如,要查看与加载OpenGL纹理有关的相同问题的解决方案,请参阅此示例:http://www.modejong.com/blog/post7_load_opengl_textures_with_alpha_channel_on_ios/index.html – MoDJ

+0

哦,我想我明白了。你能否以另一种方式为我的游戏制作加载屏幕? – white5tone