###前提・実現したいこと
macOSアプリ開発です。NSImageViewクラスのimageプロパティに入れるNSImageインスタンスを素早く切り替えることで、アニメーションのようなものを実装しようとしています。見た目は正常にアニメーションできるのですが、アニメーション時にメモリを激しく消費します。メモリの消費を抑えてアニメーション処理したいです。
###該当のソースコード
SpriteKitと併用しています。省略していますが構造は同じです。
Swift
1class GameScene: SKScene { 2 let imageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 300, height: 300)) 3 let imageArray = [NSImage?](count: 1000, repeatedValue: nil) 4 5 override func didMoveToView(view: SKView) { 6 view.addSubview(imageView) 7 for i in 0..<1000 { 8 let image = NSImage(contentsOfFile: filePath) // 任意のパス 9 imageArray[i] 10 } 11 } 12 13 override func update(currentTime: CFTimeInterval) { 14 ・・・ 15 imageView.image = imageArray[index] // 任意のindex 16 } 17}
###試したこと
0. Instruments>Leaksでアプリ追跡
→NSImageやNSImageViewに関するメモリリークはなかった
0. imageView.image = imageArray[index]
の後にimageView.image = nil
を追加
→メモリは消費されないが画像も表示されない
0. imageView.image = imageArray[index]
の直前にimageView.image = nil
を追加
→追加しない時と同じ挙動
0. update()
の最初にimageView.image = nil
を追加
(いくつかの処理をしたのちimageView.image = imageArray[index]
が実行される)
→点滅したようなアニメーションになる。メモリの消費は追加しない時と同じ
0. imageView.image
に同一インスタンスを代入し続けてみる
→メモリが数MB使われるがそれ以上は増加しない
0. 切り替える画像の数を変えてみる
→切り替える画像の種類が多いほどメモリが使われている...ように思える
0. 同じ画像から複数のNSImageインスタンスを生成し、imageView.image
に順番に入れる
→メモリが数MB使われるがそれ以上は増加しない(5.と同じ?)
0. 画像を読み込む処理をautoreleasepool{}
ではさむ
→変化なし
0. view.addSubview(imageView)
をはずす
→メモリは消費されないが画像も表示されない
おそらく「新しい画像データをレンダリングするとメモリを消費する」のだと思いますが推測の域を出ません。そうだとしても解決策が思い浮かばずお手上げ状態です。
###補足情報(言語/FW/ツール等のバージョンなど)
Swift 2.2
Xcode 7.3.1
OSX 10.11.5
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。