認知的プログラミング − Silverlight プログラミング

卒論の実験のために、Silverlight プログラミングを始めました。多数の人に気軽に実験に参加して欲しかったので、Web ベースのアプリケーションを利用して実験を行おうと、FlashSilverlight か悩んだのですが、Flash はアニメーション時のインターバルタイマーの精度があまり良くないと感じたことがあったので、Silverlight で制作することにしました(実際は、Silverlight も、フレーム更新のインターバルタイマー精度は良くなかったのですが)。

また、ActionScript は、2.0 から以降ご無沙汰だったのと、.NET/C#/VB.NET は仕事で常用していたのも Silverlight を選択した理由の一つです。

卒論のテーマ

テーマは「落下する物体のイメージと人間の予測する加速度の差異」なのですが、簡単に言えば、人間が予測する落下する物体の加速度と見た目によるバイアスを調べようというものです。

地球上では、空気抵抗を無視すれば質量の違いによる重力加速度の差はほぼありませんが、実際のところ、重い物体の方が何となく速く落下しそうな気がするという人は少なくないでしょう。実験のための仮説としては、人間は落下する物体の質量によって、キャッチしたり避けたりするアクションのための準備行動に差があるため、質量が重いほど速く準備を始めなければならず、その影響で重いものほど速く落下すると感じるのではないかというものです。

今回の困りごと

実験では、画面上に円形や矩形のオブジェクトを表示してから、被験者のアクションによってオブジェクトを下方向へ落下アニメーションさせ、一定の場所で止めてもらおうと考えました。

このとき、Storyboard と Doubleanimation を利用してアニメーションさせるのはお決まりの手続きなのですが、実際にアニメーションをさせてみると、ちらついてとても使い物になりません。

GDI や DirectX でこの手の処理をする場合には、ダブルバッファリングをするのが定番なのですが、調べてみた限り Silverlight では既にダブルバッファリングは行われているとのこと。

背景の再描画を止めれば良いのだろうかとか、描画オブジェクトをトランスペアレントにすれば良いのかなどと考えても見ましたが、今時の PC でこの程度の処理が重いはずもなく悩んでいたら、気になる記事を発見。

http://stackoverflow.com/questions/3951250/silverlight-image-flickering-how-to-avoid-it

私は、VisualStudio 2010 で開発を行っているのですが、もしかして、この EnableGPUAcceleration なのかなぁと思い調べてみたら、Silverlight デバッガでデバッグを行った場合に自動生成される xap ファイルをホストする HTML には、GPU Acceleration の設定がないではありませんか!

結果、HTML の自動生成を止めて、の一行を HTML に追加したら、ちらつきはピタッとなくなりました。

うーむ、先が思いやられる。


今回のキーワード(本件で困っている人用):
Silverlight アニメーション animation ちらつき ちらつく フリッカー flicker flickering