Epic Byte Epic Byte - 1 year ago 153
iOS Question

Major Bug, Sprite Atlas created in XCAssets Folder does not support batch rendering

I started using the new Sprite Atlas in the XCAssets folder instead of having my atlases in the project folder. However I noticed that when I did this my nodes were no longer being batch rendered which resulted in a large number of inefficient draw calls. This completely defeats the purpose of using an atlas!

To be clear this is the code I used to get the atlas.

let atlas = SKTextureAtlas(named: "Sprites")

"Sprites" is a Sprite Atlas created in the XCAssets Folder.

Does anyone have a workaround or am I stuck making Sprite Kit Atlases in the project folder.

I'm using Xcode 7.2 beta.

The reason why I want to use the new Sprite Kit Atlases is because of this issue.

Answer Source

I found one workaround as I was typing the question. You can create a SKTextureAtlas programmatically from images inside the XCAssets folder like so:

let atlas = SKTextureAtlas(dictionary: ["Head":UIImage(named: "Head")!, "Body":UIImage(named: "Body")!])

This is obviously just a workaround. Hopefully Apple fixes this in later versions of Sprite Kit. This is a pretty serious performance bug that all developers should be aware of. Even Apple's sample project uses the new Sprite Atlases so you think they would have batch rendering working.

Update 1 Response from Apple:

Thanks for letting us know about this issue. We are currently investigating the cause, and will be incorporating a fix in future iOS updates. In the mean time, there are two workarounds you can apply: 1. Create and use texture atlas in a .atlas folder. 2. Continuing using texture atlas in the asset catalog, but with deployment target set to iOS 8.0.

Update 2 Apple said may have been fixed in iOS 10. Going to investigate.