Это упрощенное решение, которое вам нужно будет расширить. Это только помещает туда спрайтов, но не определяет, как они себя ведут. Извините, но это единственное решение, которое я нашел, и я считаю, что ваша проблема является серьезной ошибкой в ​​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)
}

Ответы на вопрос(1)

Ваш ответ на вопрос