【问题标题】:Sprite-kit optimized batching and texture sharingSprite-kit 优化的批处理和纹理共享
【发布时间】:2017-06-11 05:55:19
【问题描述】:

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

谁能解释一下我是怎么做到的?

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

22:22 在演示文稿中。

可能需要从 20:00 到 23:00 观看才能获得完整的画面。

如何在 1 次绘制通道中绘制这些直升机?

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

【问题讨论】:

  • 感谢您再次提出这个问题,因为它对我也有帮助。在我之前的回答 (stackoverflow.com/questions/44479805/…) 中,我没有创建 SKTextureAtlas。我只是假设在 .atlas 文件夹中有图像就足够了。几天后将在我的 spritekit 游戏上对其进行测试,我相信我的 draw call 也会减少。
  • 很高兴它有帮助......所有关于帮助社区的一切!​​

标签: ios swift xcode sprite-kit assets


【解决方案1】:

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

  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

【讨论】:

  • 谢谢你的代码,我没有想过这个方法,但它工作得很好。如果您可以看一下,我编辑了我的问题。没有代码这可能吗?只是将精灵添加到 sks 文件中?因为那是我遇到问题的地方......
  • 使用您的方法,我可以在 sks 文件中创建精灵,但我必须将纹理留空,然后在代码中为精灵分配纹理。它可以工作,但充其量只是hacky,因为我必须从代​​码中按名称引用所有精灵,而我的 sks 文件看起来很糟糕,因为它们只是红色方块而不是实际纹理。应该可以在没有代码的情况下执行相同的方法,但我无法弄清楚如何让它工作。
  • 如果我要从代码中生成新的精灵,我认为你的回答很好,但我更愿意利用 sks 文件以可视化方式构建我的关卡,并且仍然可以获得额外的好处更少的draw call。无论哪种方式,我都感谢您的帮助,因为我将来肯定需要使用这种方法。
  • 您可以在场景编辑器中通过添加三个精灵节点来构建直升机,每个部分一个,并为图集中的图像设置texture属性并为每个分配适当的zPosition精灵。如果您在编辑器中构建多架直升机,只要纹理在同一个图集中,它们就会一次渲染。
  • 在场景编辑器中,它会一次渲染每个纹理。所以它会拉导弹,然后是机身,然后是旋翼;共3次平局。现在我可以创建 10 架直升机,它会通过 3 次绘制来绘制全部 10 架,所以批处理正在工作......但是使用 atlas 文件,我希望看到它在 1 次绘制过程中完成,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多