256MB デバイスの使用可能メモリ量
256MB デバイス向け開発について以下に説明がありました。
http://msdn.microsoft.com/en-us/library/hh855081%28v=vs.92%29.aspx
説明にもある通り、256MB デバイスは既存のデバイスよりもアプリが使用できるメモリが少なくなっています。
画像等を大量に使用している場合、既存のデバイスでもメモリ不足でアプリが落ちる事がありますが、256MB デバイスではより少ない使用量でメモリ不足が発生すると思われます。
実際にメモリ不足になるような状況を作って、違いがあるか確認してみました。
以下のように、メディアライブラリに格納されている画像の BitmapImage を生成し続ける処理を実行してみます。
private void buttonRun_Click(object sender, RoutedEventArgs e) { int count = 0; try { var bmpList = new List<BitmapImage>(); var library = new MediaLibrary(); var pic = library.Pictures[0]; for (; ; ) { var bmp = new BitmapImage(); bmp.SetSource(pic.GetImage()); bmpList.Add(bmp); count++; Debug.WriteLine(count); } } catch (OutOfMemoryException ex) { Debug.WriteLine(ex.Message); } }
実行してみると 256MB のエミュレータでは56個、512MB のエミュレータでは95個 BitmapImage を作成する事ができました。この個数を超えると OutOfMemoryException が発生してアプリが落ちてしまいます。
画像サイズ等にも影響されると思われるため、この個数の比率はどんな時にもあてはまる値ではありませんが、256MB の方が少なくなるのは確実です。
なお、上記処理では一応 catch が書いてありますが、実際にメモリが不足した場合はキャッチできず、そのままアプリが落ちてしまいます。そのため、メモリ不足は絶対に発生させてはいけないという事になります。
256MB デバイス非対応
どうしてもメモリが不足して 256MB デバイスでは動作しない場合は、Application Manifest File に Capability として ID_REQ_MEMORY_90 を追加して、対応していない事を明示します。
この Capability が追加されている場合は、Marketplace でブロックされるそうです。追加しても Visual Studio での deploy はできてしまうので開発時に確認はできません。