ページ

2012年10月22日月曜日

[WinRT] ページの内容の保存は自分でやるべきなの?

Windows ストアアプリでページの内容を保存するのに NavigationCacheMode プロパティを使うと簡単という記事を結構見かけるんですがそれはまずい(場合もある)んじゃないかと思ってるんですがどうなんでしょう? @IT の 画面遷移する前の状態を保持するには?[Win 8] とか。

NavigationCacheMode は Page のインスタンスをメモリに取っておいて、次回同じ Page の場合はそれを使いまわすってだけです。なので、アプリが終了すれば当然キャッシュは無くなってしまいます。
で、Windows ストアアプリの大きな特徴として、バックグラウンドに回ってるアプリはいつの間にか終了させられることがあるってのがあります。
Windows ストアアプリのライフサイクルについては アプリに対する “常に動作している” 感覚を重視したアプリ ライフサイクルの管理 とか アプリケーションのライフサイクル (Metro スタイル アプリ) とか。前者の記事には 「ただし、Windows がシステム リソースを解放するためにアプリを終了する場合に備えて、このデータは保存しておく必要があります」 とあります。中断したときにいつ終了してもいいようにデータは保存しとけってことです。
けど、Metro スタイル アプリからメモリを回収する にあるようにメモリ不足になってもワーキングセットをスワップアウトすることによって可能な限り終了しないようになっているそうです。
ここまで OS 側でがんばってくれてるなら、横着して NavigationCacheMode を使うだけでもいいのかなぁという気もしないでもない感じです。もちろん、電源が切られたときはメモリ上の情報は無くなってしまいますから、そういった場合でもデータを残しておいたほうがいいアプリはきちんとファイルに保存しておく必要があるでしょう。結局、ケースバイケースでうまいことやるってことになるんだと思います。
ガイドライン的には中断したときに終了に備えてちゃんとデータを保存しとけってことになっていますので、やっぱりそれが一番いいんでしょう。アプリの中断と再開のガイドライン (Metro スタイル アプリ)

ちなみに、ページの内容を保存するのは SuspensionManager を使うのが簡単だと思います。これについても @IT に解説記事があります。起動時に以前の画面を復元するには?[Win 8]

2012年10月16日火曜日

[勉強会] 先月に続きメトロスタイルアプリ エキスパート塾++2 に行ってきた

書くのがちょっと遅くなりましたが 9月26日(水) 19時~21時に開催されたメトロスタイルエキスパート塾の第2回に行ってきました。

MetroStyleDeveloper (プチ) #06 大阪 ~メトロスタイルアプリ エキスパート塾++2~

各自開発環境の入った Windows 8 を持ってきてその場で実際にコードを書いてみようというハンズオン形式の勉強会。
場所は 1回目と同じく梅田のフェンリルさんの会議室をお借りして。

今回は私がスピーカー役で 「SharpDX を動かしてみる」 というテーマのハンズオンです。
SharpDX というのは DirectX をマネージドで使えるようにラップしたオープンソースのライブラリです。Windows ストアーアプリ(以前の MetroStyle アプリ)にも対応しています。なので、これを使えば Windows ストアーアプリでも C# で DirectX が使えます。
私自身が興味があったのでこのテーマを選びました。

が、正直、ちょっと無茶だったかなぁ。
DirectX といってもいろいろな機能がありますが、今回は SharpDX 経由で Direct3D を使って簡単な図形(三角形の面を一つだけ) を表示してみるっていうハンズオンにしたんですが、あらためてやってみるとこれだけでも

  • SharpDX はマネージドで書けるといっても、コード的にはほぼ C++ で DirectX を使うときとほとんど同じなのでどうしてもコード量が多くなる。Direct3D デバイスの初期化やら、ポリゴンの用意やら、レンダリングのためのコードやら、最低限動くようにするだけでもそれなりのコードが必要。
  • 三角形の面を一つだけといってもポリゴンを描画するのには変わりないので、きちんとやるならワールド - ビュー – プロジェクションといった座標変換が必要になる。コード自体はたいした行数ではないけど、その意味を説明するには行列演算のこととかを説明しなくちゃいけない。今回は 「ポリゴンを見える位置に持ってくるためにちょっとした計算をしてやります」 程度の簡単な説明だけで済ませた。
  • 今の Direct3D をやろうとするとシェーダーランゲージ(HLSL)が必須になる。今回は 「GPU での計算のために別の言語が必要になります」 だけにして、シェーダー自体は .cso ファイルをコピーしてもらってそれを使うようにしてもらった。
  • コード量を減らすためにレンダーターゲットのキャッシュとか全然してないのでパフォーマンス悪い。あと、Dispose() とかも省略しちゃってるところもあるのでメモリやリソースが枯渇して死んじゃうこともあるかも、というあんまりよろしくないコードになってる可能性あり。

といった感じで 85分間程度のハンズオンでやるのはちょっと無理があったなぁ、と。
そもそも、これって SharpDX == DirectX のハンズオンであって、Windows ストアーアプリとかほとんど関係なくね?という感じになっちゃいました(苦笑)
そんな内容ではありますが、一応 PowerPoint の資料を下に貼り付けておきます。ハンズオン用の資料なので説明もほとんどありませんし、上記のようにあくまで最低限なコードですが。

10/22 追記
サンプルプロジェクト(Visual Studio 2012 のプロジェクト)を SkyDrive にあげておきました。
SurfaceImageSourceSample.zip
ハンズオンで使用したものよりちょっとだけコメント増やしたり、単なる三角形を三角錐にしたり、隠面処理されるようにステンシルバッファ(深度バッファ)も使うようにしたりしてありますが、基本的にはハンズオンで使用したコードとだいたい同じです。(なので、パフォーマンスがイマイチ出てないとか、本当なら Dispose() しなくちゃいけないのにしていないとかもそのままなので注意)
ここまで追記

終了後は何人かでカレー屋に遅めの夕食を食べに行き解散。(カツカレーが話題になっていた日でしたのでw)

次回の開催もすでに募集が始まっていますので興味のある方はぜひ。
MetroStyleDeveloper (プチ) #07 大阪 ~メトロスタイルアプリ エキスパート塾++3~