2015-06-17 5 views
10

मैंने स्प्राइटकिट के साथ एक साधारण गेम बनाया, हालांकि हर बार जब मैं गेम चलाता हूं, सिम्युलेटर में मेमोरी उपयोग लगभग 30 एमबी बढ़ता है, लेकिन गेम समाप्त होने पर कभी कम नहीं होता है।स्विफ्ट में, एसकेएससीन हटा दिए जाने के बाद मेमोरी को सामान्य कैसे प्राप्त करें?

जब मैं दस बार से अधिक खेल चलाता हूं तो सिम्युलेटर धीमा और धीमा हो जाता है और अंततः दुर्घटनाग्रस्त हो जाता है।

इस सरल खेल में मैं दो नियंत्रकों और एक gamescene है:

MainController एक बटन चालू होने

GameViewController में के माध्यम से GameViewController कहता है, gamescene इस तरह से initialised है:

class GameViewController: UIViewController 
{ 

    var skView:SKView! 

    var scene:GameScene! 

    override func viewDidLoad() { 

     super.viewDidLoad() 
     scene = GameScene(size: view.bounds.size) 
     skView = view as SKView 
     skView.ignoresSiblingOrder = true 
     scene.scaleMode = .ResizeFill 

     scene.viewController = self 
     skView.presentScene(scene) 

    } 

//with a prepareForSegue deinitialises the scene and skview: 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if segue.identifier == "GameFinished"{ 

     scene.removeAllActions() 
     scene.removeAllChildren() 
     scene.removeFromParent() 
     scene = nil 

     skView.presentScene(nil) 
     skView = nil 

     let target = segue.destinationViewController as MainController 
    } 
    } 
} 

में GameScene, viewController एक संपत्ति है

var viewController:GameViewController? = GameViewController() 

segue इस के साथ शुरू हो रहा है:

deinit{ 
    self.removeAllActions() 
    self.removeAllChildren() 
    } 

फिर भी

+0

उपकरण चलाएं और मेमोरी लीक की जांच करें। https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/InstrumentsQuickStart/InstrumentsQuickStart.html – sangony

+0

मेरे पास यह समस्या 30 मिनट पहले नहीं थी। यह पता चला कि मेरे पास मेमोरी रिसाव था इसलिए मैंने अपना दृश्य और दृश्य गुण कमजोर कर दिया, इसने रिसाव के मुद्दे को हटा दिया लेकिन मुझे यकीन नहीं है कि यह करने का सबसे अच्छा तरीका है या नहीं। –

उत्तर

7

आपका GameViewController कार्य नहीं करेगा एक मजबूत किया है:

मैं भी GameScene में deinit में तरीकों को दूर डालने की कोशिश की है आपके GameScene का संदर्भ। और आपके GameScene आपके GameViewController पर एक मजबूत संदर्भ था। इससे एक मजबूत संदर्भ चक्र होता है, जिसका अर्थ है कि न तो वस्तुओं को हटा दिया जाएगा।

आपको अपने GameScene में कमजोर के रूप में अपनी दृश्य नियंत्रक संपत्ति घोषित करने की आवश्यकता है।

weak var viewController:GameViewController? = GameViewController() 
+0

ठीक है, मैंने डिस्प्ले व्यू कंट्रोलर का उपयोग किया है, खेल के समाप्त होने के बाद प्रदर्शन करने के बाद एनीमेथविथइडिएंटिफायर हटाए बिना, सभी बच्चे और हटाए गए सभी क्रियाएं, ऐसा लगता है कि "काम किया" ... हर बार गेम लॉन्च होने पर स्मृति बहुत बढ़ जाती है ... यह कैसे हो सकता है ? –

+0

@ फ़ानज़हांग क्या आप समझा सकते हैं कि आपने यह कैसे किया?मुझे थोड़ी देर के लिए यह वही सटीक समस्या का सामना करना पड़ रहा है और मैं वास्तव में एक फिक्स की उम्मीद कर रहा हूं ... – DHShah01

+0

कुछ खास नहीं, गेमसेन में गेम व्यू कंट्रोलर को तुरंत चालू करें: कमजोर var view नियंत्रक: गेम व्यू कंट्रोलर? = GameViewController() , और स्वयं चलाएं .viewController ?dismissViewController एनीमेटेड (सत्य, समापन: शून्य) जब खेल समाप्त हो जाता है। –

0

स्विफ्ट 3, Xcode 8 और iOS से 10 का उपयोग करते हुए मजबूत संदर्भ, SKTextures की देखभाल, आदि स्मृति स्तर लिया बचने के बाद दृश्य नकारने और "मेनू" ViewController लौटने के बाद उबर नहीं पाया। मैं उपयोग कर रहा था:

override func sceneDidLoad() {...} 

यह आईओएस 10 पर उपलब्ध है, लेकिन मैं आईओएस चाहता था 8 & 9 संगतता है यही कारण है कि मैं पुराने करने के लिए बदल दिया है: पुराने आईओएस के साथ संगत हो रही के अलावा

override func didMove(to view: SKView) {...} 

संस्करण, यह पता चला है कि दृश्य को खारिज करने के बाद मेमोरी स्तर गिरता है। यह एक आश्चर्यचकित था। मुझे शायद कुछ रिसाव याद आ रही है लेकिन यह मेरे लिए काम कर रही है। मुझे आशा है कि यह किसी की मदद करेगी।

+0

क्या आप इस रिसाव को साबित करने के लिए न्यूनतम सत्यापन योग्य उदाहरण बना सकते हैं? – Whirlwind

+0

@Wirlwind क्षमा करें मैंने कोशिश की है, लेकिन मैं ऐसा करने में सक्षम नहीं हूं। लीक उपकरण "SKAction.animate" से संबंधित कुछ रिसाव दिखाता है जिन्हें मैंने अभी तक हल नहीं किया है। हालांकि यह समस्या थी, लेकिन अब, केवल "didMove" में बदलना स्मृति समस्या समाप्त हो गई है। – user2888102

संबंधित मुद्दे

 संबंधित मुद्दे