dispatch_once NSObjectを使用してデータ ポインターを作成します。そのため、すべてのゲーム アセット ポインターは、メイン ビューコントローラーが表示されるときに作成されます。ゲームをプレイするために、ユーザーはUIViewControllerの特定のレベルに対応するUIButtonをタップします。これを LevelSelectionController と呼びましょう。ゲームが終了すると、ユーザーはラベル ( SKLabel ) をタップします。すべてのアクションとノードが削除されます。
[self removeAllActions];
[self removeAllChildren];
[self removeFromParent];
さらに、特定のレベルのSKSceneサブクラスは、次のように、ユーザーを LevelSelectionController に戻すタスクを、ゲームSKViewを提示するビュー コントローラーに委任します。
- (void)closeScene {
SKView *spriteView = [[SKView alloc] init];
[spriteView presentScene:nil];
[self.navigationController popViewControllerAnimated:YES];
}
私が持っている唯一の問題は、ユーザーがゲーム シーン (SKScene) を離れてもメモリが高いままであることです。ゲームには多くのアセットが必要です。そのため、ゲームを開始すると、メモリ使用量が 200 MB に跳ね上がります。ユーザーが元のレベル選択ビュー コントローラーに戻ったとき、アクティビティ モニターによると、ゲーム シミュレーターはまだ 200 MB を消費しています。ユーザーが別のレベルに入ると、メモリ使用量がさらに 10 MB 跳ね上がります。では、ユーザーが SKScene を離れたら、最後のゲームのメモリを解放するにはどうすればよいでしょうか?
ARCを使用しています。Xcode のバージョンは 5.1 です。開発対象はiOS 7.1です。
ご協力ありがとうございました。
-- 編集 1 --
私はばかだ。私は問題が何であるかを知っています。シーンを閉じると、新しい SKView が作成され、それを nil に設定して現在のシーンから抜け出します。できます。しかし、それはそれを行う方法であってはなりません。代わりに、現在の SKView を表示する前に変数に設定する必要があります。シーンを閉じるときに、その変数を nil に設定する必要があります。うーん...私は考えていませんでした。
-- 編集 2 -- 現在のシーンが nil で表示されている場合、ほとんど変化はありません。removeFromSuperview から削除しても、あまり効果はありません。