質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Swift

    7241questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4098questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    3997questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • SpriteKit

    112questions

    SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

[Swift3/SpriteKit]コンソールにmemory issueエラーメッセージが出る

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,131

tossymotion

score 1

前提・実現したいこと

xcode8 と swift3を使っています。
現在SwiftのSpriteKitを使って簡単な2Dグラフィック横スクロールゲームを作成しています。
ボールのプレイヤー、壁を配置し加速度センサーを使用して
壁に当たらないようにプレイヤーをスタートからゴールへとコントロールする
ゲーム内容です。
ステージは今の所1から4まで作成しました。
ステージ4をクリアしたらゲーム終了です。

問題

ゲームを進めていきステージ1〜3までは問題なくシーンが推移表示されるのですが
ステージ3から4へシーンを推移する時だけコンソールに下記のエラーメッセージが出てアプリがクラッシュしてしまいます。

Message from debugger: Terminated due to memory issue

メモリーに関するエラーのようなのですが具体的にどうすればいいのか
分からず困っています。
どのような原因が考えられますでしょうか。
どうぞよろしくお願いいたします。

試したこと

GameViewController.swiftの一番初めに表示するSceneを
ステージ1からではなくステージ4からにすると問題なく表示されました。
しかしステージ1から進めていくとやはりステージ3から4の間でエラーが出ます。
ちなみにremoveallchildrenをコード内に入れてません。
(追記)
その後MemoryのモニタリングをしていたところSceneを描画するたびに
Memoryの数値が上がっていきステージ4を描画する頃には600MBを超えており
その拍子にアプリがクラッシュしてしまうようです。
そこまでは分かったのですがどうすれば解決できるのかが分かりません。
コード内にremoveallchildrenを入れましたが変わらず。
根本的に何かが間違っているのでしょうか。
ご教授いただければ大変助かります。よろしくお願いいたします。

import SpriteKit
import CoreMotion

class Stage1Scene: SKScene, SKPhysicsContactDelegate {

    //衝突判定用のカテゴリー設定
    struct ColliderType {
        static let player_cat: UInt32 = ( 1 << 0)
        static let pipe_cat: UInt32 = ( 1 << 1)
        static let goal_cat: UInt32 = ( 1 << 2)
    }

    //motionManager生成
    var motionManager: CMMotionManager!

    //プレイヤー変数宣言
    var player = SKSpriteNode(imageNamed: "metal")
    var playerXposition: Double = 0
    var playerYposition: Double = 0

    //カメラノード宣言
    var cameraNode: SKCameraNode!

//起動時処理
    override func didMove(to view: SKView) {
        self.physicsWorld.gravity = CGVector.zero
        self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        self.physicsWorld.contactDelegate = self

        motionManager = CMMotionManager()
        motionManager.accelerometerUpdateInterval = 0.1
        motionManager.startAccelerometerUpdates(to: OperationQueue.main,withHandler: {(accelerometerData:CMAccelerometerData?, error:Error?) -> Void in


            self.playerXposition = accelerometerData!.acceleration.y * 20
            self.playerYposition = accelerometerData!.acceleration.x * -20
        })

        cameraNode = childNode(withName: "cameraNode") as? SKCameraNode
        let zoomIn = SKAction.scale(to: 0.2, duration: 0)
        cameraNode.run(zoomIn)
}

    //タッチ開始時
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: AnyObject in touches {
            let location = touch.location(in: self)
            let touchedNode = self.atPoint(location)

            if (touchedNode == nextSprite) {

            self.isPaused = false
            label.text = ""

            self.removeAllChildren()
            //ステージ2へのシーンの推移
            let scene = Stage2Scene(fileNamed: "Stage2Scene")
            let transition = SKTransition.fade(with: UIColor.white, duration: 2.0)
            scene?.scaleMode = SKSceneScaleMode.aspectFill
            self.view?.presentScene(scene!, transition: transition)

            //全てのスプライトを削除
            self.removeAllChildren()
            self.removeAllActions()

        }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tossymotion

    2017/03/27 00:32

    今回使用しているイラスト素材のファイルサイズはステージ1〜4まで全て合わせて50MBでした。特に大きいファイルサイズのイラスト素材は使用しておりません。

    キャンセル

  • tossymotion

    2017/04/02 02:58 編集

    ステージ2〜4についても繰り返し遷移するテストを行ってみましたがMemoryの表示が増えていくことはありませんでした。メモリが何に確保されているかの確認はどう調べればいいのかが分かりません。あとdeinit{}でコンソールにprint出力の表示を確認しました。

    キャンセル

  • fuzzball

    2017/04/03 08:54 編集

    同じステージを繰り返すテストのときもpresentScene()を使っていますか?これに限らず、テスト時と通常時の違いを探して下さい。

    キャンセル

回答 3

checkベストアンサー

+1

80%くらい妄想です。

Sceneに紐付いているものはpresentScene()ときに解放されていると思うのですが、それ以外のものは解放されていないような気がします。例えば質問のコードで言うと、CMMotionManagerです。

まずは、CMMotionManagerを生成しないようにしてテストしてみて下さい。
それでエラーが出ないようであれば、CMMotionManagerの管理を上の階層(ViewController?)で行うように修正して下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/06 17:08

    ご回答ありがとうございます。
    ご指摘いただいた通りSceneに紐づいているもの以外が解放されていないのかもしれません。
    一度試してみます。
    勉強不足なのに丁寧にご回答していただき本当にありがとうございます。

    キャンセル

  • 2017/08/04 15:11 編集

    すみませんコメントが遅れましたが、その後確認したところご指摘の通りCMMotionManagerが
    原因であることが判明しました。
    Scene毎にCMMotionManagerのインスタンスが生成されていることが原因でした。
    Sceneが遷移するタイミングでmotionaManger停止の命令を入れたところメモリーリークは
    改善されました。Sceneが遷移するときに解放されるものだとばかり思いこんでおりました。
    本当にありがとうございました。

    キャンセル

+1

描画するたびにということであれば、その時にメモリリークをするようなコードになっているということでしょうね。

静的アナライザを利用したり、動的に解析されるのがよろしいかと。
https://developer.apple.com/jp/documentation/ToolsLanguages/Conceptual/Xcode_Overview/WritingCode/AnalyzingYourCode.html

https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/CommonMemoryProblems.html
https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/FindingLeakedMemory.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/24 00:48 編集

    お返事ありがとうございます。
    InstrumentsのLeak Checksで調べたところやはりSceneから新しいSceneを遷移読み込むタイミングにメモリリークが起きているようです。
    6 new leaks→Leaked ObjectはCGPathと出ております。

    キャンセル

0

Scene毎にCMMotionManagerのインスタンスが生成されていることが原因でした。
Sceneが遷移するタイミングでmotionaManger停止の命令を入れたところメモリーリークは
改善されました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    swiftで分割した画像をSKShapeNodeに貼り付けたい

    お世話になります。 swiftで一枚の画像を3x3の画像に分割して、9つ(3x3)のSKShapeNode(四角形)のTextureに設定したいです。 以下のサイトで実

  • 解決済

    Swift2, SpriteKitのSKActionについて質問です

    問題を出題して、違う答えをタップしたら ×と表示させて、その後消える。 と言った動きをしたいのですが、上手くいきません。 最初の一回目は上手くできるのですが、2回目以降が上手く

  • 解決済

    SKActionが終わった後に何か動作をさせたい時

    SKActionが実行され、そのアクションが終わった時に呼ばれる関数というものは存在しますか?

  • 解決済

    [SpriteKit]マルチタップの設定の仕方

    スプライトキットでマルチタップの設定の仕方がわかりません。 試行錯誤して、以下をやってみたのですが、うまくいきません。 ❶ GameViewController.swift

  • 解決済

    xcodeでシミュレータに表示されない

    連投になってしまって申し訳御座いません。前回の質問がまだ解決していないのにベストアンサーをつけてしまい解決済みになってしまいました。本格的に使うのは初めてでして何分ご容赦を。

  • 解決済

    swiftのエラー

    以下のコードの場所ででSelectBTNとxTranslationが定義されてない的なエラーが発生します。また、expected ')' in expression listという

  • 解決済

    SpriteKitによる画像のドラッグ

    swift SpriteKit で画像を横にスライドした分だけx軸方向にスライドさせるプログラムを組みたいです。画像は表示されるのですが画像をドラッグすることができません。何が足り

  • 解決済

    Swift 3.1 touchsMovedメソッドでエラー

    前提・実現したいこと xcode8 swift3 spritekitを使用して かんたんなアプリを作成しており、 画面タップによって反応するtouches関連のメソッドの中に

同じタグがついた質問を見る

  • Swift

    7241questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4098questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    3997questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • SpriteKit

    112questions

    SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。