gpt4 book ai didi

ios - 预加载后 SpriteKit 场景转换滞后和帧率下降

转载 作者:行者123 更新时间:2023-11-28 08:30:41 35 4
gpt4 key购买 nike

我正在用 SpriteKit 构建游戏,最近遇到了问题,我的帧速率仅在 GameScene 中从 60 持续下降到 50-45,并且在打开 时有几秒钟的延迟来 self 的 StartScene 的 GameScene。我尝试了很多不同的东西,我相信我的一个主要问题与动画一个 SKSpriteNode 子类有关,该子类生成非常频繁,当我停止动画它们并使用单个纹理时,帧速率保持在 60。我以前 posted关于将纹理预加载到 SpriteKit 中,并收到了很棒的答案,但我可能还没有完全理解。此时,我将所有 GameScene 纹理都放在一个 Atlas 中,我通过在我的 GameScene 之前为每个右侧创建常量来加载它们:

//Preload textures of GameScene before running it
let alienTexture1 = SKTextureAtlas(named:"Sprites").textureNamed("alienTexture1")
let alienTexture2 = SKTextureAtlas(named:"Sprites").textureNamed("alienTexture2")
...

class GameScene: SKScene, SKPhysicsContactDelegate {

我知道我应该使用:

SKTextureAtlas(named: "YourTextureAtlasName").preloadWithCompletionHandler { 
// Now everything you put into the texture atlas has been loaded in memory
}

预加载纹理,但我不确定括号之间的内容以及何时像 let alienTexture1 = SKTextureAtlas(named:"Sprites").textureNamed("alienTexture1") 这样的行应该被称为。然后在我拥有的一些 Alien SKSpriteNode 子类的 init 中调用这些纹理。我不理解某些事情,因为预加载显然无法正常工作。我也不确定如何处理切换到 GameScene 时的延迟,但我想这也与我在开始时使用所有这些 let 加载纹理的方式有关 语句。任何建议都会很棒。

我已经查看了有关此主题的其他问题,并认为这足够具体,不会重复。

最佳答案

我对此也感到困惑,我绝不是专家,但本质上预加载纹理只是意味着您将它们存储在一个不会被释放的数组/属性中。

我并没有真正使用 SKTextureAtlas("").preloadWithCompletionHandler 方法。我相信这个想法基本上是一样的。

例如你可以创建一个静态纹理加载类

 class Textures {

static var alien1 = [SKTexture]() // array off all alien 1 textures


static func preloadAll() {
loadAlien1()
...
}

// Alien 1
static func loadAlien1() {

// Get atlas
let alien1AtlasName = "Your atlas name"
let alien1Atlas = SKTextureAtlas(named: alien1AtlasName)

// Loop through images in atlas and append to alienTexture property
// In this case there is 2 images in the atlas)
// Images should be appended by _1 , _2 etc
for image in 1...2 {
let textureName = "\(alien1AtlasName)_\(image)"
let texture = alien1Atlas.textureNamed(textureName)
alien1.append(texture)
}
}
}

当您的应用在 appDelegate 或 GameViewController 中启动时预加载纹理

 Textures.preloadAll()

如果你有很多纹理并且你想保持低内存使用率,只需预加载你最初需要的纹理,然后加载其他级别的其他纹理。

  Texture.loadAlien1()

然后你可以像这样在你的子类或 SKScene 的外星人 1 角色上运行动画

let textureAnimation = SKAction.animateWithTextures(Textures.alien1, timePerFrame: 0.3)
alien1Sprite.runAction(SKAction.repeatActionForever(textureAnimation), withKey: "Alien1AnimationKey")

如果您需要清理纹理,以防您不再需要它们,或者如果您的应用收到内存不足警告,您只需清空数组即可。

 Textures.alien1.removeAll()

关于性能,您还应该将图集存储在 xCode asset catalogue 中,这是 xCode 7 中的一项新功能,而不是项目中的文件夹。

希望对你有帮助

关于ios - 预加载后 SpriteKit 场景转换滞后和帧率下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38934807/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com