首页 > 解决方案 > 使用存储在应用程序包中的数据的纹理图集时,SpriteKit 绘制调用未批处理

问题描述

似乎 SpriteKit 不会批量处理同一纹理图集中的纹理的绘制调用。根据SKTextureAtlas初始化的方式,有两种不同的行为:

  1. SKTextureAtlas(named:)当使用(从存储在应用程序包中的数据加载纹理图集)初始化纹理图集时,不会对绘制调用进行批处理。

  2. 但是当使用动态创建纹理图集时,绘图调用似乎是批处理的SKTextureAtlas(dictionary:)

下图显示了资产目录中的两种不同行为和 SpriteAtlas。

1. 未批量绘制调用:

未使用 SpriteAtlas 批量绘制调用

2. 批量绘制调用:

使用 SpriteAtlas 批量绘制调用

精灵图集:

资产目录中的 SpriteAtlas

我创建了一个示例 Xcode 13 项目来显示不同的行为:https ://github.com/clns/spritekit-atlas-batching 。
我已经在 macOS Big Sur 11.6.1 上的 iOS 15 模拟器上尝试过这个。

重现的代码非常简单:

import SpriteKit

class GameScene: SKScene {
    
    override func didMove(to view: SKView) {
        let atlas = SKTextureAtlas(named: "Sprites")
//        let atlas = SKTextureAtlas(dictionary: ["costume": UIImage(named: "costume")!, "tank": UIImage(named: "tank")!])
        
        let costume = SKSpriteNode(texture: atlas.textureNamed("costume"))
        costume.setScale(0.3)
        costume.position = CGPoint(x: 200, y: 650)
        
        let tank = SKSpriteNode(texture: atlas.textureNamed("tank"))
        tank.setScale(0.3)
        tank.position = CGPoint(x: 500, y: 650)
        
        addChild(costume)
        addChild(tank)
    }
}

标签: iossprite-kitskspritenodebatchingtexture-atlas

解决方案


推荐阅读