Я пытался сбросить GameScene, создав новый дубликат GameScene, который работает. Однако проблема заключается в том, что сцена не освобождает, что определенно является проблемой, так как я профилировал свое приложение с помощью Allocations и увидел, что память «забивается» и «накапливается». Это мой код для моего GameViewController и мой GameScene:Swift 3 (SpriteKit): Reseting GameScene не освобождает
import UIKit
import SpriteKit
import GameplayKit
var screenSize = CGSize()
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
// Load the SKScene from 'GameScene.sks'
if let scene = SKScene(fileNamed: "GameScene") {
// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFill
screenSize = scene.size
// Present the scene
view.presentScene(scene)
}
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
}
}
Тогда мой GameScene в основном:
import SpriteKit
import GameplayKit
class GameScene: SKScene, SKPhysicsContactDelegate {
//Declare and initialise variables and enumerations here
deinit{print("GameScene deinited")}
override func didMove(to view: SKView) {
//Setup scene and nodes
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//Do other things depending on when and where you touch
//When I want to reset the GameScene
let newScene = GameScene(size: self.size)
newScene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
newScene.scaleMode = self.scaleMode
let animation = SKTransition.fade(withDuration: 1.0)
self.view?.presentScene(newScene, transition: animation)
}
"GameScene не deinited" не печатается, так что сцена не освобождает.
ИЗМЕНИТЬ С НОВЫМ НОМЕРА: Я исправил проблему, где сцена не DEALLOCATE представляя нулевую сцену перед обновлением сцены со сценой я на самом деле хочу, чтобы показать. Однако теперь экран остается пустым, даже если я представляю свою новую сцену позже. Вот как выглядит мой код сейчас, когда я хочу сбросить GameScene:
self.view?.presentScene(nil)
let newScene = GameScene(size: self.size)
newScene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
newScene.scaleMode = self.scaleMode
let animation = SKTransition.fade(withDuration: 1.0)
self.view?.presentScene(newScene, transition: animation)
Кто-нибудь знает, как исправить эту проблему?
Спасибо за любые ответы и помощь.
Чтобы обнаружить, что причиной утечки, используя Инструменты, было бы довольно трудной задачей для вас, как для новичков. Итак, что вы можете сделать: 1) переопределить дезинтезирование ваших пользовательских классов, 2) искать и находить, используете ли вы себя внутри закрытий и видите ли это какой-либо сильный ссылочный цикл (например, сохранение сцены в блоке и блок сохраняя сцену из-за сильного самопотребления) и 3) удаляйте части кода до тех пор, пока не будет вызван деанит сцены. Кроме того, вполне вероятно, что у вас много утечек ... Это будет непростая задача, но именно так вы пойдете, чтобы решить эту проблему. – Whirlwind
Не поймите меня неправильно в отношении «новичка», но я бы сказал, что вы новичок в SpriteKit из-за вопроса, который вы опубликовали, поэтому я думаю, что методы, которые я предложил, были бы проще для вас, чтобы решить эту проблему. – Whirlwind
Да, вы правы; Я начинающий SpriteKit, как мне заменить мои экземпляры использования self, есть ли способ избежать этого? –