Это упрощенное решение, которое вам нужно будет расширить. Это только помещает туда спрайтов, но не определяет, как они себя ведут. Извините, но это единственное решение, которое я нашел, и я считаю, что ваша проблема является серьезной ошибкой в SpriteKit.
аюсь создать простую 2d платформенную игру, используя Swift, SpriteKit и SKTileMaps. Но каждый раз, когда я переключаюсь между сценами, содержащими SKTileMaps, я вижу много утечек памяти в инструментах XCode.
Я воссоздал проблему настолько просто, насколько смог. Я использую файл .sks для создания сцены, и этот файл содержит только 1 tileMap, заполненный некоторыми плитками.
Код в контроллере представления для представления сцены:
if let view = self.view as! SKView? {
let scene = LoadingScene(size: CGSize(width: 2048, height: 1536))
scene.scaleMode = .aspectFill
view.presentScene(scene)
Код для сцены:
import SpriteKit
import GameplayKit
class GameScene: SKScene {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let scene = GameScene(fileNamed: "WorldScene") else{fatalError("Could not open world scene")}
view?.presentScene(scene)
}
}
Я выбираю GameScene в качестве пользовательского класса в файле сцены .sks.
Это приведет к множеству небольших утечек памяти каждый раз, когда я меняю сцену:
картина утечки памяти в инструментах
Это утечка только из одной смены сцены. Я делаю что-то не так или это ошибка SpriteKit?
Edit1
Утечки SKCTileMapNode :: _ sureChunkForTileIndex (unsigned int) происходят каждый раз, когда я загружаю карту тайлов, а остальные появляются только при смене сцены
Edit2
Изменен GameViewController, чтобы пропустить LoadingScene и перейти прямо к GameScene. Утечка памяти все еще существует:
if let view = self.view as! SKView? {
guard let scene = GameScene(fileNamed: "WorldScene") else{fatalError("Could not open world scene")}
scene.scaleMode = .aspectFill
view.presentScene(scene)
}