ios - Sprite-kit 优化了批处理和纹理共享

标签 ios swift xcode sprite-kit assets

Apple 关于 SpriteKit 最佳实践的视频之一介绍了使用批处理来限制绘制调用。然后它引用了使用纹理图集的方式,以便您可以同时绘制多个不同的纹理。

有人可以解释一下我是如何实现这一目标的吗?

观看视频:https://developer.apple.com/videos/play/wwdc2014/608/

22:22 演示中。

可能需要在 20:00 - 23:00 期间观看才能了解完整情况。

如何才能在 1 次绘制过程中绘制这些直升机?

附加问题。我如何在没有代码的情况下获得同样的效果?在 sks 文件中添加直升机 Sprite 并分配纹理?

最佳答案

首先,创建纹理图集并将其添加到您的项目中

  1. 在项目目录中创建一个扩展名为 .atlas 的文件夹
  2. 将直升机零件图像添加到文件夹
  3. 将文件夹添加到您的项目中(通过右键单击 Xcode 的文件导航器并选择“将文件添加到“[您的项目]...”选项)

通过将以下内容添加到 didMove(to view:SKView) 来加载纹理图集:

let atlas = SKTextureAtlas(named: "helicopter")

然后为每个部分创建纹理

let body = atlas.textureNamed("body.png")
let rotor = atlas.textureNamed("rotor.png")
let missiles = atlas.textureNamed("missiles.png")

最后,用零件组装直升机。每个部分的 zPosition 决定了它们的绘制顺序。

    let startX:CGFloat = -200

    for i in 0...10 {
        let helicopterBody = SKSpriteNode(texture: body)
        helicopterBody.zPosition = 100
        helicopterBody.position = CGPoint(x: startX + CGFloat(i*40), y: 0)

        let helicopterRotor = SKSpriteNode(texture: rotor)
        helicopterRotor.position = CGPoint(x: startX + CGFloat(i*40), y: 0)
        helicopterRotor.zPosition = 200

        let helicopterMissiles = SKSpriteNode(texture: missiles)
        helicopterMissiles.position = CGPoint(x: startX + CGFloat(i*40), y: 0)
        helicopterMissiles.zPosition = 0

        addChild(helicopterBody)
        addChild(helicopterRotor)
        addChild(helicopterMissiles)
    }

通过将以下内容添加到 GameViewController 来显示绘制计数:

view.showsDrawCount = true

关于ios - Sprite-kit 优化了批处理和纹理共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480812/

相关文章:

ios滚动后保持UITableViewCell布局

swift - 如何使用 Swift 打开本地保存的 PDF 文件

ios - 在El Capitan上安装Xcode 6.4,同时安装Xcode 7

ios - 文件系统路径字符串的正确编码是什么?

c# - 对于 "actionSheetAlert", (action) 之后是什么 =>

ios - 如何获取 View 的底部边缘?

ios - 同步排队比异步排队时代码运行得更快。不应该相反吗?

ios - 单击按钮时如何打开手机设置?

ios - 在 "#"的 UITextField 中显示 "bullets"而不是 "Secure Text Entry"

ios - 获取存储在应用程序文档文件夹中的文件内容