-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()]))
})
})
}
那么基本上,如何在主线程中运行加载动画时在后台运行函数?那么如何在后台的功能完成后删除加载动画? – white5tone
你不能。至少不喜欢你正在尝试这样做。加载PNG图像意味着压缩数据被解码到内存中。这是巨大的数据通胀,并占用大量的内存。您不能只是“在后台加载它”,因为设备没有足够的内存来缓存内存中的所有图像数据。你有一个基本的概念问题。例如,要查看与加载OpenGL纹理有关的相同问题的解决方案,请参阅此示例:http://www.modejong.com/blog/post7_load_opengl_textures_with_alpha_channel_on_ios/index.html – MoDJ
哦,我想我明白了。你能否以另一种方式为我的游戏制作加载屏幕? – white5tone