2009/9/17 にレッドモンド (MSCC) で開催された Silverlight 3 FireStarter のビデオが公開されました。
http://www.msdnevents.com/firestarter/
当日のセッションスケジュール
Silverlight-3 FireStarter…
あと、セッションで使われた PPT がこちらにあります。
Silverlight-3 FireStarter Slides…
2009/9/17 にレッドモンド (MSCC) で開催された Silverlight 3 FireStarter のビデオが公開されました。
http://www.msdnevents.com/firestarter/
当日のセッションスケジュール
Silverlight-3 FireStarter…
あと、セッションで使われた PPT がこちらにあります。
Silverlight-3 FireStarter Slides…
Microsoft Delivers Rich User Experiences and Windows 7 Connectivity With New Windows Embedded CE Release より。
2000/9/22 付けのプレスリリースですが、Windows Embedded CE 6.0 R3 が RTM したそうです。
そしてこいつには Silverlight for Windows Embedded が入ってるそうです。
というか、「革新的な Silverlight for Windows Embedded ユーザインターフェース (UI) フレームワークを通して Silverlight のリッチなアプリケーションエクスペリエンスを提供する」 なんてあるので UI 部分の中核を Silverlight が担っているかのような印象を受けます。(Windows Embedded のことをよく知らないので大ウソの可能性ありw)
この Silverlight for Windows Embedded というのは out-of-browser で Microsoft Silverlight テクノロジのネイティブコード実装だそうです。
Windows 自体も普通の Windows とはいろいろと違うでしょうし、初めから out-of-browser 前提だったりと、きっと Silverlight for Windows Embedded は普通の Silverlight とはいろいろと違うんでしょうね。
けど、どうやら開発環境は Visual Studio や Expression Blend ということみたいなので、マネージドコード自体は同じということになるのかな?
(MonoTouch みたいにネイティブコードにコンパイルしてから動かすということは無いんじゃないかと思ってるんですがどうなんでしょ)
ちなみに、この Windows Embedded がどんなところに使われるかですが、記事にはスマートフォンや Windows ベースの小型ノートブックなどが例にあげられています。
まぁ、私は 「Windows Embedded と Windows Mobile ってどう違うの?」 というレベルなのでイマイチよくわかってないんですが。
先日、「[.NET][Internet] Wiki-OS ... すげぇ!!」 で紹介した Wiki-OS がバージョンアップしたそうです。
https://www.wiki-os.org/
さらにすげぇ!
「Wiki-OS completely rewritten in Silverlight! Cross-platform, categories, ability to embed applications, and more」 によると、今回 Silverlight 3 で完全に書き直したそうです。
元は WPF (xbap) だったため .NET Framework 3.0 以上がインストールされた Windows 上でしか動きませんでしたが、Silverlight になったため Windows、Mac OS で動くようになったそうです。(Linux はもうすぐとのこと)
さっそくアクセスしてみたところ、あちこちがアニメーションするようになっていたり、デザインが変わっていたり、いろいろと変わっているようです。ただ、XAML・C# をエディットするアプリがえらく簡素なものになっていたりと 「あれ?」 と思うところもあります。まぁ、developer preview と書いてありますし、まぁ、そういうことでしょう。
ちなみに、アプリケーションの作り方 (クラスライブラリとか) なんかも Silverlight に合わせて変わっているみたいです。
あと、今までアプリケーションへのリンクがありましたが、アプリケーションを embed する機能が追加されています。
これはちょっとおもしろいかも。
Wiki-OS 上に Silverlight アプリを作って、それを自分のブログに貼り付けたりできるわけです。
まぁ、今の Wiki-OS だといつの間にか他の人に改造されちゃったりするわけですがw (けど、それはそれでおもしろいかも)
この embed は <object> タグを埋め込むことになりますので、一応 enableHtmlAccess を true にはしない方がいいんじゃないかと思います。(これを true にすると Silverlight アプリから HTML DOM にアクセスできるようになる)
もちろん、Wiki-OS が表示する埋め込み用 HTML には enableHtmlAccess の指定はありません。(なのでデフォルトの false になります)
参考 MSDN ライブラリ:「HTML ブリッジのセキュリティ設定」
というわけで、以下、試しに Calculator を貼り付けてみるテスト(うまくいくかな)
https://www.wiki-os.org/
これはすごいな。
どうやら .NET Framework 3.0、WPF で作られているようなので実行にはそれらが必要です。
(ブラウザ上で動きますが、本体は xbap みたいです)
アカウントが無くても左下の “Applications” から Calculator (電卓) とか Cube 3D (四角形がグリグリするデモ) とかいろいろと実行できます。
と、これだけだと普通の 「ブラウザ上に作ったデスクトップ環境」 ですが、すごいのはこれらのアプリが編集できちゃうってとこ。
ただ、編集するにはアカウントが必要なようです。
左上の “Create an Account (free)” でアカウントを作成できます。
(メールアドレスなんかを入力して OK するとアクティベーションコードが書かれたメールが送られてくるのでそいつを入れてやります)
左下の “Applications” の “Create New Project...” で新規にアプリを作成できます。
アプリは XAML と C# コードで作ります。
編集画面も Visual Studio 風なので WPF とか Silverlight とかをやったことのある人ならだいたいわかるんじゃないかと思います。
また、各アプリのタイトルバーにある “edit” をクリックすればそのアプリを変更することができます。
そう、既存のアプリを自由に変更できるんです。(ただし、Accounts Manager などクリティカルなアプリは一般ユーザでは変更できないようになっています)
もちろん、アプリの変更はすべての人に影響します。
誰かが電卓に機能追加してくれればそれをみんなが使うことができるわけです。
”Applications” の “View All...” に他の人が作ったものも含めてすべてのアプリが載っています。
誰がいつどんな変更をしたのかはタイトルバーの “menu” の “View History of Changes...” を見ればわかりますし、”Applications” にある History アプリを使えばすべての変更履歴を見ることができます。
また、この History ウインドウの “Undo Selected” を使えば変更を元に戻すことができます。
いやぁ、この発想はすごいなぁ。
確かに Wiki OS だわ。
こんな発想、どっから思いつくんだろう。
最初に見たのは CNET Japan の 「マイクロソフト、「Silverlight 4」の詳細を明らかに」 というニュース。
Silverlight 4 の詳細が明らかになったんだったらぜひ知りたいところだけど、Silverlight 4 に関係ありそうなのは 「オフラインコンテンツ向けにも「PlayReady」デジタル著作権保護(DRM)技術のサポート機能を拡大する」 という部分だけって感じでイマイチよくわからない。
ブラウザ上で動く Silverlight がどうオフラインコンテンツと関係するのかもよくわからないし。
原文の方の 「Microsoft offers some Silverlight 4 details」 を見ても書いてあることはほとんど同じみたい。
で、おぎわらさんのところ で元ネタが Microsoft PressPass (Microsoft からのプレスリリース) の 「Microsoft Raises the Bar for Delivery of Live HD Online Video Using HTTP」 だと知った。
ん~、CNET の記事とはずいぶんイメージが違うな。
このプレスリリースって Live Smooth Streaming に関することが主で、その関連で Silverlight とか Silverlight 4 の話が出てきてるだけですね。
どうやら、今まで IIS Smooth Streaming と呼ばれていたものは Live Smooth Streaming と呼ばれるようになったみたいです。
そして、Live Smooth Streaming を実現するためのサーバ (IIS のアドオン) が IIS Media Services 3.0 というもので、これは 30日以内くらいにリリースされる予定とのこと。
また、9/11~15 にアムステルダムで開催される International Broadcasting Conference (IBC) で Silverlight 4 で作られた最新のメディア機能をプレビューするそうです。
この Silverlight 4 には、ネイティブなマルチキャストサポートや Microsoft PlayReady テクノロジによるオフラインなデジタル著作権管理 (DRM)サポートなどが含まれているとのこと。
加えて、IIS Smooth Streaming Transport Protocol と Protected Interoperable File Format (PIFF) 仕様を Microsoft Community Promise の元でリリースするとのことです。
一応書いておくと IIS Media Services 3.0 による Live Smooth Streaming のクライアントは Silverlight 3 です。
Silverlight 4 ではさらに進化するのかも知れませんが、Silverlight 4 までお預けということではありません。
後半に Silverlight 4 についてもうちょっとだけ書かれています。
IBC では Silverlight 4 のメディア機能の早期プレビュー版のデモをするようですが、これはオフライン PlayReady DRM の拡張と out of browser によって次世代のムービー視聴体験ができるようになることを示すそうです。
これらの機能によって、デジタルコピーやインターネット経由での配信であっても、消費者が DVD やブルーレイで得ていたのと同じようなリッチでインタラクティブなエクスペリエンスをムービー製作業者や小売業者が提供することが可能になるそうです。また、ムービー製作業者がネットワーク経由での更新や特典、生のイベントを提供したり、過去にムービーを購入した消費者との関連を強化したりできるようになるそうです。(この辺の英文はあまり自信がありません)
ちなみに、CNET のニュースでは 「offline content」 となっていますが、プレスリリースにはそういう言い回しは無く、あるのは 「offline DRM」 もしくは 「offline PlayReady DRM」 です。
特に後者はそのあとに 「and out of browser capabilities.」 と続いています。
普通に考えて 「オフラインコンテンツ向け」 じゃなく 「オフラインでも動作可能な DRM」 という意味なんじゃないかと。
特に out of browser と組み合わせればオフラインであっても DRM が働いたうえで Silverlight でムービーが視聴できるということなんじゃないかと。
あと、IIS Media Services 3.0 のリリースと同時にデベロッパ向けに Smooth Streaming player 開発キットのベータ版が提供されるそうです。
この開発キットではテンプレートを使ってカスタムプレイヤーを簡単に作ることができるとのこと。
Silverlight feature suggestions より。
どうやら Silverlight 4 にどんな機能を盛り込むか意見募集中ということみたいです。
Tim Heuer 氏からは “Do you have a need to convert Flash applications?"、"How do you prefer to learn Silverlight?"、"Are you using the provided Silverlight Toolkit themes in your applications?" という 3つの問いが載っています。(1番目と 3番目は投票できるようになっています。2番目のはブログにコメントして欲しいとのこと)
あと、Silverlight Feedback Forum なんてものもあります。
見ればわかるとおりフォーラムというよりは投票所で、一人 10票まで投票できます。
以前に 「[.NET] All-In-One Code Framework ってなんぞ?」 で紹介した All-In-One Code Framework が 2009/08/26 にアップデートしたそうです。
交信内容は
http://cfx.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=32006
にあります。
Windows 7 のサンプルなどいくつかのサンプルが追加されています。
って言うか、今まで全然気づいてなかったんですが、2009/07/30 には Silverlight 3 だとかいろいろ追加されてますし、結構頻繁にアップデートされてたんですね。
「Silverlight minor update released today」 によると Silverlight 3 が GDR 2 (3.0.40818.0) にマイナーアップデートしたそうです。
更新履歴が http://www.microsoft.com/silverlight/resources/technical-resources/ の “Deployment/IT Administration" をクリックして、"Release History" にあります。
これによると
だそうです。
Tim Heuer 氏の記事の感じでは GB18030 がらみが主なのかな?
ちなみに、Silverlight Tools には更新は無いけど、Silverlight SDK はアップデートされてるようです。
また、development runtime も更新されています。
...と、あるんですが、日本語版も同時に更新されるんだろうか?
あれ?
http://msdn.microsoft.com/ja-jp/silverlight/
の 「Silverlight 3 ソフトウエア開発キット(SDK)」 のリンクをクリックすると ページが見つかりません になっちゃうな。更新中?
2009年 8月 24日をもって終了してしまった Popfly ですが、その一部のソースコードが CodePlex にて公開されたそうです。
http://popflygameengine.codeplex.com/
「Popfly Parting Present」 によると、Microsoft 内の Web サービスと密に結びついていたり、他のプロダクトからのコードを含んでいたり、MS データセンター無しでは使いようが無かったり、といろいろな理由で Popfly の大部分のソースコードは公開することが不可能とのことです。
公開された Popfly Game Engine はゲームデータファイルを読み込んで実行する部分とのこと。
クリエータ (ゲームデータファイルを作る機能) は含んでませんが、データファイルを作るのに参考となる情報は十分に含まれているそうです。
また、サーバと通信するような機能 (ハイスコアやバッジといったものをサーバに保存するような機能) に関する部分も含まれていないとのこと。
しかし、Silverlight, C# でシンプルなゲームエンジンを作る方法を示したコードとしておもしろいものであると思っているとのことです。
昨日の 「[Silverlight][HTML5] HTML 5 の <canvas> を Silverlight で実装してみたって。。。その発想は無かった」 にコメントを頂きました。
nitoyon さんより
日本でも同じようなことを試してるかたがいらっしゃいます!
http://d.hatena.ne.jp/uupaa/20081114/1226596120
こりゃすごい。
この記事にある 「Silverlight による HTML5::Canvas の実装」 は uuCanvas.js として↓にまとめられています。
http://uupaa-js-spinoff.googlecode.com/svn/trunk/uuCanvas.js/README.htm
uuCanvas.js は HTML 5 の <canvas> をサポートするための JavaScript ライブラリなんですが、Chrome、Safari、Opera、Firefox ではそれぞれのブラウザが持つ <canvas> を、IE では Silverlight で <canvas> 相当の機能を実現するようになっています。(IE で Silverlight が入っていない場合は VML を使うようになってるそうです)
なので、ちょっとしたお約束を守っておけば同じ HTML で IE でもそれ以外でも <canvas> を使うことができます。
詳しいことは uuCanvas.js のサイトを。
また、いろいろなデモもあります。
昨日紹介した記事にも “Aside: Yes, I know I'm not the first person to add <canvas> support to IE. :)” なんてありましたから、いろんな人がいろんな方法で <canvas> を実装したりしてるんでしょうね。
私は、昨日の記事を書くときに 「へぇ、<canvas> ってこういう機能なのかぁ」 と初めて <canvas> のことを知った (それまでは名前しか知らなかった) ような人なのでまったく知りませんでした。
Using one platform to build another [HTML 5's canvas tag implemented using Silverlight!] より。
Microsoft の Silverlight と WPF のデベロッパの方のブログですが、HTML 5 の <canvas> を Silverlight で実装してみたそうです。
いやぁ、すごい。
つか、その発想は無かったな。
記事にはいろいろと <canvas> を表示させてみたスクリーンキャプチャが貼り付けられています。
ただ、さすがにネット上のページを自由に表示できるというわけではなく、自分で HTML を画いてる必要があります。
まずは、<head> の中あたりにでも
<script type="text/javascript" src="Html5Canvas.js"></script>
と追加してやります。
そして、たとえば、
<canvas id="canvas1" width="150" height="150"></canvas>
<script type="text/javascript">
function draw() {
var canvas = document.getElementById('canvas1');
:
}
</script>
という風に <canvas> が使われていた場合は、<canvas>~</canvas> を
<script type="text/javascript">
InsertCanvasObject("canvas1", 150, 150, draw);
</script>
と置き換えてやります。
<canvas> を操作するための JavaScript たち (上記の draw() 関数など) はそのままで OK です。
これで InsertCanvasObject のところに Silverlight アプリが作られて、その中から draw() 関数が呼び出されます。
また、<canvas> の仕様をすべて実装したというわけではないそうです。
Mozilla のサンプルページの最初の 5ページを動かすのに十分な分だけサポートされているそうです。(たぶん Mozilla Developer Center's Canvas tutorial のことだと思う)
また、記事の最初の方に
というリストがありますが、これのイタリックになっているものは何も実装していないそうです。
ソースコードは記事の下の方にある "[Please click here to download the complete source code to Html5Canvas and the sample application shown above.]” というリンクからダウンロードできます。
Html5Canvas.Web プロジェクトを 「スタートアッププロジェクトに設定」 して、TestPage.html を 「スタートページに設定」 して実行すればサンプルページが開きます。
ちなみにソースは Ms-PL とのこと。
ちょこっとだけソースを見てみました。
CanvasRenderingContext2D.cs が処理のほとんどを行ってるんですが、思った以上にシンプルです。
というか、<canvas> の fillRect は XAML の Rectangle に、drawImage は Image に、Path は PathGeometry に、というようにほぼ単に XAML に置き換えてるだけなんですね。
記事にも <canvas> のことを調べてたら Silverlight でネイティブにサポートされているのと同じものが多いと思ったというようなことが書いてありますが、ほんとにそうなんですね。
Silverlight 3 のサンプルを Parallel で最適化してみたという例がなかなかおもしろかったので紹介。
もともとは 「Flirting With Silverlight」 にある Silverlight 3 のサンプルです。
(「ActionScript に比べてどうよ?」 みたいなところから始まっているようですが、そのあたりはここでは割愛)
”Example” が Silverlight 3 アプリへのリンクになってます。
見てもらえばそのままですが、これは WriteableBitmap にパーティクル(点々)を描いてみるというサンプルです。
マウスを乗っけるとグリグリと動きます。
このサンプルを Parallel を使って並列化してみたというのが 「Adding Concurrency Optimization in Silverlight 3」 です。
並列化と言ってもそんなに難しいことはしていません。
まず、.NET Framework 4.0 に追加される予定の Parallel.For をまねて ParallelFor メソッドを作ります。
この ParallelFor メソッドは記事に丸ままコードが載っています。
次に、OnStoryboardCompleted メソッドの中の 2ヶ所のループをこの ParallelFor を使うように変更します。
変更結果も記事に載ってますので、ここでは要点だけ。
まずは、
while (--index > -1)
bitmap.Pixels[index] = 0x000000;
というループ。
これは WriteableBitmap の全ピクセルを 0x0 で埋める、すなわち、真っ黒に塗りつぶすためのコードです。
これを単に ParallelFor を使ったループに変更します。
もうひとつは
while (null != particle)
{
x = particle.X;
y = particle.Y;
z = particle.Z;
:
}
というループ。
こちらは ParallelFor できるように以下の修正を加えたそうです。
コードを見比べてもらえばわかりますが、並列化できるようにしたって言うだけでそんなに大した変更ではありません。
さて、結果です。OnStoryboardCompleted メソッドは 1フレーム描画するたびに呼ばれるようですから、この 2ヶ所を並列化しただけでもそれなりに効果があります。
記事前半にある “Silverlight Version, optimized to leverage Concurrency” が Silverlight アプリへのリンクになってます。
このアプリではスライダでいくつのスレッドで並列化するのか指定することができるようになってます。
私の環境だとスレッド数 1 だと 34fps くらい、スレッド数 8 だと 89fps くらいでした。
Core i7 で論理コア数 8 なんですが、スレッド数を 8 にした状態でタスクマネージャで見ていると、きちんとすべてのコアが動いてます。
けど、スレッド数をそれ以上に増やすとなぜか fps も下がって、しかも寝ているコアが出てきます。
うーん、なんかコアをうまく使えてないような。
ということで、スレッド数を多くした時の挙動はアレですが、論理コア数と同じスレッド数にしているときにはかなりのパフォーマンス向上が見込めそうです。
もちろん、論理コアがもともと 1しかないような場合にはオーバーヘッドの分だけパフォーマンス低下があるかもしれませんが。
ちなみに、ソースコードは記事の最後の方にある “Strange Attractor Project” というリンクからダウンロードできます。
大元の記事のコードでは StoryBoard で OnStoryboardCompleted を呼び出すというやり方でしたが、OnStoryboardCompleted メソッドが HandleRendering と改名され、CompositionTarget.Rendering イベントで HandleRendering を呼び出すというように変更されています。
StoryBoard だと最大 fps で動かせないでしょうからね。
Customizing the Visual Studio 2010 Start screen より。
Visual Studio 2010 のスタートスクリーンをカスタマイズする方法が紹介されています。
スタートスクリーンも XAML で書かれているそうです。
(一部のみ抜粋して翻訳)
試すには、まず 「Documents\Visual Studio 10」 フォルダの下にでも 「StartPages」 フォルダを作る。
そして、「Microsoft Visual Studio 10.0\Common7\IDE\StartPages」 フォルダの内容をコピーする。
VS2010 でプロジェクトを開いて、後は自由に編集!スタートスクリーンのルートは 3つの行の Grid になっている。最初の行は Visual Studio のロゴを、3つ目の行は RSS フィードコントロールを含んでいる。すべてのアクションは真ん中の行にある。注意:真ん中の行はカスタムの VS コントロールを含んでいる。これは次のベータでまたカスタマイズされて置き換えられるだろう。
で、Border の Background を変えて背景色を変えたり、リンクを追加してみたりといった変更例が載っています。
あれ?変更した後にどうすればいいのか書いてないんですが、単に 「Microsoft Visual Studio 10.0\Common7\IDE\StartPages」 フォルダに XAML ファイルを放り込んでやればいいのかな?
# あいかわらず VS2010 を見たこともないので自分では確認できないです
さぁ、これで、きっと誰かがスタートスクリーンを痛IDE化してくれるはずw
Microsoft Research にあった Spec# が CodePlex に登場してました。
http://specsharp.codeplex.com/
と言っても、チュートリアル は 「もうすぐ」 と書いてあるだけですし、ドキュメントは Microsoft Research の方を見てくれ、とかそんな感じなんですが。
Spec# というのは C# に契約指向? (contract oriented) な機能を追加したものです。
Eiffel に 「表明」 と呼ばれる機能がありますが、あんなやつです。
Generics みたいに Microsoft Research で生まれて、その後本家 .NET Framework に取り込まれたものもありますが、Spec# が今後どうなっていくのかはわかりません。
F# も Microsoft Research 生まれですね。
以下、Spec# のわかりやすいところを紹介してみます。
■ NonNull
public Method(object! o) { ... }
こんな風に引数の型名に ! を付けると 「null であってはならない」 ことを表明できます。
■ PreConditions
public void Method(int a) requires a > 0; { ... }
こんな風に requires でメソッド開始前の必要条件を指定できます。
「requires ValidString(s)」 みたいにチェック用メソッドを自分で定義してチェックさせることもできるようです。
で、条件を満たさない場合は RequiresException が発生する、のかな?(PPT にそう書いてありました)
■ PostConditions
public int Method(int x, int y) ensures result == x + y; { return x + y; }
こんな風に ensures でメソッド完了後の必要条件を指定できます。
上記の例では result キーワードを使って戻り値をチェックしてますが、他にもプロパティの値をチェックしたりといったことも書けるようです。
というか、requires と ensures には boolean を返す式をなんでも書けるんじゃないかと思います。
■ その他
Program Verification Using the Spec# Programming System [PPT] なんかを見ると他にもいろんな機能があるようです。
上記の例はいずれもメソッド単位のチェックですが、もっと細かくループ単位でのチェックだとか、反対にクラスのインスタンス単位でのチェックなんかもできるみたいです。
Fluid Dynamics in Silverlight より。
まだ、記事読んでないんだけど、すごくきれいだったのでとりあえず紹介。
MSDN: Silverlight 3.0 の日本語ドキュメント より。
Silverlight 3 の日本語ドキュメントがリリースされたそうです。
Web: http://msdn.microsoft.com/ja-jp/library/cc838158(VS.95).aspx
chm のダウンロード: http://www.microsoft.com/downloads/details.aspx?FamilyID=0a9773a7-c854-41fa-b73d-535abfb73baf&displaylang=ja
ちなみに、機械翻訳ではなくちゃんと人力翻訳です。
Silverlight 3 WriteableBitmap Performance Follow-Up より。
Silverlight 3 の WriteableBitmap のパフォーマンスが比較されています。
WriteableBitmap っていうのは、結局のところビットマップをバイト配列としてごにょごにょするわけですが、同じようなことができるようになっているクラスライブラリがいくつか公開されています。
それらのパフォーマンス比較です。
比較されているのは、
です。
記事に比較した結果も載ってますが、比較するための Silverlight アプリも貼りつけてありますので、実際に実行して自分の環境でどういう結果になるか試してみることもできます。
ちなみに、ソースもあります。
で、結果です。
1~5 では WriteableBitmap がもっとも速いそうです。
まぁ、ランタイムに組み込まれてるんですから当然という気はしますね。
5 の Quakelight は WriteableBitmap に近い速度が出るそうですが、これは 256色カラーのみに限定しているのでそもそも扱ってるデータ量が違いますからね。
そして、特筆すべきは 6 のピクセルシェーダーです。WriteableBitmap の 10倍の速度が出ています。
ピクセルシェーダーと言うと、既存の画像を加工するものというイメージがありましたが、今回のように計算によって描画できるものであればピクセルシェーダーだけで絵を描いてしまうこともできるわけですね。
記事にはこうあります。
「ピクセルシェーダーは GPU で実行されているわけではないけれども、他のものと比較するとかなり速い。プロシージャルな画像 (計算によって描ける画像) ならばピクセルシェーダーを使うのがお勧め。ただし、Silverlight 3 では制限付きのシェーダーモデル 2 がサポートされているのみということは忘れないように。あと、Silverlight 3 のピクセルシェーダーはマルチコア CPU だと自動的に並列実行されることに気付いた。デュアルコアのマシンだとシングルコアのマシンの 2倍くらいのフレームレートが出ていた。Silverlight でのソフトウエアシェーダーの実装が並列化されているのはまったく正しいし、特別なことではない。シェーダーは GPU 上では並列に実行されるようにデザインされている。」
Silverlight 3 のピクセルシェーダーは GPU で動いているわけではないっていう話だったのになぜ速いんだろうと不思議だったんですが、この自動的に並列化されているっていうのがミソなのかな?
もともとシェーダーランゲージは GPU の中で並列実行されるのが前提ですし。
もしかしたら、WriteableBitmap へのアクセスをうまく並列化してやればピクセルシェーダーを超えるパフォーマンスを出せるかもしれませんね。
さっきの記事 「[Silverlight] Re: Smooth:ハードウェア・アクセラレーターの動作確認」 をポストしたあとに RenderAtScale なんていうすばらしいものがあることに気付きました。
さっきの記事でも参考にさせてもらった András Velvárt さんの 「Discovering Silverlight 3 ? Deep Dive into GPU Acceleration」 の後半の “Render At Scale” より。
ざっと訳してみます。
「Silverlight はベクタベースのグラフィックだけど、ビットマップキャッシングはビットマップベース。ビットマップとベクタグラフィックの主な違いは、ベクタグラフィックは品質を落とさずにほとんど無限に拡大できるってところ。一方、ビットマップは大きく拡大するとカクカクになっちゃう。こういったとき、GPU はバイリニアフィルタリングを適用してくれる。[訳注: ジャギーを減らすためにアンチエイリアスしてくれるってことですね]
カクカクがイヤな場合、BitmapCache の RenderAtScale をセットすることができる。
(コードで書く場合)
var bmc = new BitmapCache();
bmc.RenderAtScale = 4;
lion1.CacheMode = bmc;
(XAML で書く場合)
<Canvas>
<Canvas.CacheMode>
<BitmapCache RenderAtScale="4" />
</Canvas.CacheMode>
</Canvas>
上のコードは Silverlight にライオンのベクタを 4倍のサイズでレンダリングするように指示している。ただし、これは 16倍の GPU メモリを要求することになり、キャッシュされたビットマップをレンダリングするのも遅くなる。RenderAtScale の効果は、サンプルの “GPU Acceleration” チェックボックスをオンにしておいて、”High Res Bitmap” をオンにすれば見ることができるよ。」
どうでしょ?
効果のほどはサンプルを見ると一目瞭然だと思います。
András Velvárt さんの 「Discovering Silverlight 3 ? Deep Dive into GPU Acceleration」 の下の方にデモへのリンクがあります。
最初は GPU アクセラレーションを使っていない状態。
これだと、ベクタグラフィックなので拡大されてもライオンちゃんはスムースです。
”GPU Acceleration” をオンにすれば GPU アクセラレーションが有効になった状態になります。
この状態だと、ライオンちゃんが拡大されているときはジャギジャギになります。
これは XAML に書かれたサイズのまま GPU によってビットマップキャッシュされて、それが拡大縮小表示されているためです。
ここで “High res bitmap” をオン。
すると拡大されているライオンちゃんもスムースになります。
同時にフレームレートのところに表示されている 2番目の GPU メモリの消費量が増えているはずです。
これが RenderAtScale=”4” の状態です。
すなわち、XAML に書かれたサイズの 4倍 (面積で 16倍) の大きさでビットマップキャッシュされて、それが拡大縮小表示されているわけです。
GPU アクセラレーションを使い、拡大表示も行うときは、RenderAtScale は重要なパラメータになりそうですね。
シーラカンスさんの 「Smooth:ハードウェア・アクセラレーターの動作確認」 を見て私も初めて知ったこと。
まず、フレームレートを表示する
<param name="enableFramerateCounter" value="True" />
について。
これを True にしておくと左上に数字が 4つ表示されます。
「Discovering Silverlight 3 ? Deep Dive into GPU Acceleration」 によると、左から
だそうです。
そして、次に
<param name="EnableCacheVisualization" value="True" />
について。
これを True にしておくと GPU アクセラレートされているところは普通の色で、されていないところは赤色で表示されます。
さらに加えて緑色で表示されるところもあります。
この緑色が何かなんですが、こちらも 「Discovering Silverlight 3 ? Deep Dive into GPU Acceleration」 によると、
Cache visualization shows cached objects in their natural color, and non-cached ones in red. Note that the control panel is above the lions. Therefore it also has to be cached on the GPU otherwise the GPU would not be able to blend it over the lions, and therefore the entire scene could not take advantage of GPU acceleration. We have not marked the control panel to be
BitmapCached, so Silverlight has done this for us automatically. The control panel is thus an implicit surface, and displayed in green on the Cache Visualization.
(ざっとした訳)
Cache Visualization はキャッシュされているオブジェクトは普通の色で、キャッシュされていないものは赤で表示される。ライオンの上のコントロールパネルに注目。これも GPU でキャッシュされている。でないと、GPU はライオンの上にこれをブレンドできない。そうすると、シーン全体の GPU アクセラレーションのアドバンテージが無くなってしまう。コントロールパネルの部分には BitmapCache を指定していないけれども、Silverlight は自動的に BitmapCache を指定されていることにしてくれる。と言うわけで、コントロールパネルの部分は暗黙的なサーフェスということになり、Cache Visualization では緑色で表示される。
ということだそうです。
へぇ、良くできてるなぁ。
そして、enableFramerateCounter で表示される 4番目の数字がこの 「暗黙的に GPU アクセラレートされているサーフェスの数」 ということになるわけですね。
シーラカンスさんの記事 「11.ハードウエア・アクセラレーションの効果を見てみる」 のサンプルでも緑色になっているところがあります。
ただ、これらは BitmapCache が指定されているサーフェスと重なっているというわけではありません。
まったく試してもいないあてずっぽうな推測ですが、Button の方は BlurEffect が指定されているために自動的に GPU アクセラレートされているのかもしれません。
けど、Rectangle の方はどういう理由なのかよくわかりませんね。
暗黙的に GPU アクセラレートされる条件ってどっかに公開されてるのかな?
昨日の 「[Silverlight] seadragon.com」 に Kei1 さんからコメントをもらいました。(ありがとうございます)
なかなかおもしろかったので記事にしてみました。
Kei1 さんに教えてもらった
Seadragon.com release!
によると、seadragon.com は Silverlight がインストールされていない場合は Seadragon Ajax が、Silverlight がインストールされている場合は Silverlight が使われるようになっているそうです。
もちろん、Silverlight がサポートされていないブラウザ / OS の場合も Seadragon Ajax が使われます。
Seadragon には iPhone 用の Seadragon Mobile もありますが、それについては何も書かれてませんね。
さっそく IE の 「アドオンの管理」 で 「Microsoft Silverlight」 を無効にしてアクセスしてみました。
Silverlight に比べるとカクつきますがそれなりにきちんと表示されます。
直リンクだけではなく、貼り付けてある場合もきちんと Silverlight の有無を判断してくれます。
Porting XNA starter kit "Platformer” to Silverlight (SilverSprite) より。
最初は XNA も SilverSprite もほとんどやったことなかったそうですが、XNA Game Studio 3.1 をインストールしてちょっとしたゲームを作ったりして試した後、XNA のスターターキットに入っている “Platformer” というサンプルゲームを SilverSprite を使って Silverlight で動くようにしてみたそうです。
そしたら、4時間くらいでできちゃったとのこと。
記事には実際に Silverlight 3 で動く Platformer へのリンクもあります。
(XNA 版と同じ構成なので 9Mバイトあるそうです。そのため読み込みにはちょっと時間がかかります)
また、ソースコードも置いてあります。
変更したところは “laumania” で検索すればわかるようになってるそうです。
あいかわらず、Visual Studio 2010 をダウンロードすらしていない私ですが、、、
C# 4.0 : Co-variance and Contra-variance より。
こんなことできるようになるのか。
というか、できなかったんだっけ?
C# 2.0 で delegate の covariance と contravariance はサポートされたけど、ジェネリックな delegate の場合は厳密に型付けされちゃうんだっけ?
それが out, in の記法によって covariance、contravariance を明示的に指定できるようになるってこと?
なんか、もう、どのバージョンで何ができて何ができなかったのか良くわからなくなってきてるな(笑)
http://seadragon.com/ がオープンしたそうです。
と言いつつ、Seadragon ってなんだっけ?w
Seadragon の本拠地は http://livelabs.com/seadragon/ だと思うけど、DeepZoom がテクノロジーの名称で、Seadragon がアプリケーションの名称ってことなのかな?
DeepZoom を iPhone で表示するアプリの名前も Seadragon だったし。
で、今回の seadragon.com は DeepZoom な画像をホストしてくれるサイトってこと?
探したらあった。
Seadragon - Deep Zoom on Demand
「Microsoft LiveLabs は Seadragon.com のリリースをアナウンスした。これは Azure ベースのサービスで、DeepZoom 画像のホストをオンデマンドで作成することができ、超ハイレゾ画像のクイックリンクをものすごく簡単に作ることができる」
とあるので、どうやらそういうことみたい。
というわけで、やってみた。
http://seadragon.com/ で画像の URL を入れて Create ボタンを押すだけ。
試しに http://seadragon.com/create/ に例として載ってる画像で Create してみた。
すると、その画像の DeepZoom 版へのリンク、貼り付け用のタグ、Delicious・Digg・Facebook・Twitter へのポスト用のリンクが出てくる。
貼り付け用のタグを貼りつけてみたのが↓
ちなみに、画像の URL が同じ場合は毎回同じ結果になるようです。
Silverlight 3 Multi-touch: The Basics より。
Silverlight 3 はマルチタッチに対応してます。
と言うか、Windows の WM_TOUCH メッセージに対応していると言った方がいいのかも。
ちなみに、リファレンスを見るとわかるとおり WM_TOUCH メッセージは Windows 7 と Windows Server 2008 R2 以降となっています。なので、Silverlight 3 だからと言って、XP や Vista でマルチタッチできるようになるわけではありません。
さらに Silverlight はブラウザの上で動くわけですからブラウザにも依存するのかもしれません。
MSDN Library の Multitouch Input には IE8 が必要そうなことが書いてあります。Windows 7 なので IE7 という選択肢はそもそも無いのかも知れませんが、Firefox とかがどうなるのかはよくわかりません。
Silverlight 上での実装方法ですが、単に System.Windows.Input.Touch クラス の FrameReported イベント を受け取るようにするだけです。
FrameReported イベントに渡される TourchFrameEventArgs の GetTouchPoints() メソッドなどでタッチされている座標などがわかりますので、あとは好きなように実装すれば OK です。
Silverlight 3 Multi-touch: The Basics にはデモ動画やサンプルコードもありますので、興味のある人は見てみては。
Silverlight Version Compatibility より。
ある一つのページ上に Silverlight 2 アプリと 3 アプリの両方が混在して存在した場合どうなるか、という話です。
Silverlight 3 プラグインがインストールされていれば、Silverlight 2 アプリも 3 アプリも Silverlight 3 プラグインの上で動くことになります。
そして、2 アプリは v2 “quirks mode” な AppDomain で、3 アプリは v3 “quirks mode” な AppDomain で動きます。
quirks mode について、Silverlight のプログラムマネージャである Tim Heuer 氏のブログに簡単にですが書いてありました。
Check your Silverlight 2 apps for compatibility with Silverlight 3 の “A word on quirks mode” のところ。
要するに Silverlight 3 の中には Silverlight 2 互換モードがあって、AppManifest.xml の RuntimeVersion が 2.0.31005.0 (Silverlight 2 のときのバージョンナンバー) であれば自動的にこの Silverlight 2 互換モードで動くようになっているということみたいです。
これら 2つの記事の内容をあわせると、Silverlight アプリごとに AppDomain が作られ、また、quirks mode は AppDomain ごととなっている、ということになりますから、一つのページに 2 アプリと 3 アプリが混在していても問題は発生しないようになっている、ということになるわけですね。