2012年01月19日

Silverlight5の3D機能を試そうと思ったがイマイチだった

Silverlight5 Tools 日本語版も公開され、やっと日本語開発環境でもSilverlight5の3Dグラフィック機能が試せそうなので、ちょっといじってみました。

Silverlight5の3Dグラフィック機能は、XNA Frameworkのサブセットになっていて、だいたい同じ感じのインターフェースですが、本家と比べるといくつか機能が削られています。例えばモデルデータを扱うModelクラスがSilverlight5にはありません。

ただし、Modelクラス等はSilverlight5 Toolkitで用意されていて、こちらを利用することでContentManager、Model、SpriteFont、SpriteBatchなどが使えるようになります。

VWDではSilverlight 3D Applicationテンプレートが使えない!?

Silverlight5 Toolkitをインストールすると、XNAを使ったプロジェクトの雛形を作ってくれる、Silverlight 3D Applicationというテンプレートがインストールされるはずですが、このテンプレートはVWDでは使えないようです。

無料のExpress系開発環境ではプロジェクト構成に制限がありますが、Silverlight 3D Applicationでは特殊なプロジェクト設定を使用しているので、VWDでは駄目なようです。サンプルのプロジェクトもVWDでは読み込めません。

ただし、このテンプレートに関しては、VS2010の評価版を入れてみてもインストールされませんでした。同じようにテンプレートがインストールされないという報告は何件かあるので、現在のバージョンではインストーラに不備があるかもしれません。

ContentManagerはSilverlightには合わないと思う

XNA Frameworkでは、プログラムコード以外のコンテンツ(テクスチャやモデルデータ等)を、ContentManagerを経由して読み込むようになっています。このContentManagerは、コンテンツファイルの解析などをコンパイル時に済ませてしまって、実行時には最小の手順で読み込めるようにネイティブに近い形式に変換しておきます。

コンテンツが高速なローカルディスクに格納されている場合はそれでいいと思いますが、ブラウザ上で実行されるSilverlightでは事情が違います。Silverlightではコンテンツは低速なネット上からダウンロードしないといけないので、最小化しないといけないのは読み込み処理量ではなくダウンロードサイズです。

例えばBloomというサンプルでは、コンテンツとしてsunser.jpgという画像が使われていますが、これが元は79KBしかないのに、コンテンツインポーターによって変換されたsunser.xnbでは1.5MBものサイズになっています。また、これらのコンテンツが全てxapファイルに含まれていて、Bloom.xapが4.8MBもあります。

ブラウザゲーム等は、一般的に最初に読み込むプログラムサイズは小さくしておき、開始ボタンが押された時点で時間のかかるダウンロード処理を始めますが、xapに全て入れられてしまうと最初の読み込みに時間がかかってしまいます。コンテンツファイルをxapから分離できるかは試していないので分かりませんが(ContentManager.OpenStreamを置き換えれば可能?)、分離できてもxnbファイルが大きいのでイマイチです。

他のXNA環境とクロスプラットフォームな開発をする場合はContentManagerはいいと思いますが、Silverlight専用で3Dを扱いたいだけだと使いにくい仕様です。

ContentManagerを使わなくても3D機能は使えますが、JPEGをデコードする機能などがビルトインで用意されていないので面倒です。(Image ControlからWriteableBitmapに変換すると画素データへのアクセスが拒否されて使えない)

タグ:Silverlight
2012年01月19日 【プログラミング】 | コメント(0) |
2011年12月14日

Silverlight5クラスライブラリ変更点のまとめ

Silverlight4と5のドキュメントを見比べて、.NET Framework Class Library for Silverlightに追加された要素をまとめてみました。

一段目がNamespace、二段目がClassです。Namespaceそのものが新設された部分はClassは省略。

  • Microsoft.Xna.Framework
  • Microsoft.Xna.Framework.Audio
  • Microsoft.Xna.Framework.Graphics
  • Microsoft.Xna.Framework.Graphics.PackedVector
  • Microsoft.Internal.Pivot.Controls
  • Microsoft.Internal.Pivot.Interactivity
  • Microsoft.Internal.Pivot.Utilities
  • Microsoft.Internal.Pivot.Views
  • Microsoft.Phone.Data.Linq
  • Microsoft.Phone.Data.Linq.Mapping
  • System
    • AggregateException
    • OperationCanceledException
  • System.ComponentModel.DataAnnotations.Schema
  • System.Configuration.Assemblies
  • System.Data.Linq
  • System.Data.Linq.Mapping
  • System.Data.Linq.SqlClient
  • System.Diagnostics
    • Stopwatch
  • System.Globalization
    • PersianCalendar
  • System.Security
    • AllowPartiallyTrustedCallersAttribute
  • System.Security.Cryptography
    • AsymmetricAlgorithm
    • AsymmetricKeyExchangeDeformatter
    • AsymmetricKeyExchangeFormatter
    • AsymmetricSignatureDeformatter
    • AsymmetricSignatureFormatter
    • CspKeyContainerInfo
    • CspParameters
    • MaskGenerationMethod
    • PKCS1MaskGenerationMethod
    • ProtectedData
    • RSA
    • RSACryptoServiceProvider
    • RSAOAEPKeyExchangeDeformatter
    • RSAOAEPKeyExchangeFormatter
    • RSAPKCS1KeyExchangeDeformatter
    • RSAPKCS1KeyExchangeFormatter
    • RSAPKCS1SignatureDeformatter
    • RSAPKCS1SignatureFormatter
  • System.Threading
    • CancellationTokenSource
    • Mutex
  • System.Threading.Tasks
  • System.Windows
    • InBrowserSettings
    • MediaFailedRoutedEventArgs
    • WindowCollection
  • System.Windows.Automation.Peers
    • RichTextBlockAutomationPeer
    • RichTextBlockOverflowAutomationPeer
  • System.Windows.Controls
    • DrawEventArgs
    • DrawingSurface
    • RichTextBlock
    • RichTextBlockOverflow
    • SubImageRoutedEventArgs
    • TextSearch
  • System.Windows.Controls.Pivot
  • System.Windows.Data.Debugging
  • System.Windows.Graphics
  • System.Windows.Input
    • GestureEventArgs
  • System.Windows.Markup
    • MarkupExtension
  • System.Windows.Media
    • DrmSetupDecryptorCompletedEventArgs
    • FileSink
    • MediaCommandEventArgs
    • RateChangedRoutedEventArgs
  • System.Windows.Printing
    • PrinterFallbackSettings
  • System.Xaml

Classesだけの比較で、Structures、Interfaces、Delegates、Enumerations等はチェックしていません。ドキュメントから手作業での抽出なので、抜けがあるかもしれません。

タグ:Silverlight
2011年12月14日 【プログラミング】 | コメント(0) |
2011年12月10日

Silverlight5出ました

やっとSilverlight5が正式リリースされました。まだ開発ツールは英語版だけですが、近日中に日本語版も配布されると思います。

Silverligh5での新要素

ざっとドキュメントを読んだ中で、私が「これは!」と思った変更点を挙げておきます。

  • 3Dグラフィックスのサポート

XNA Frameworkのグラフィックス周りがSilverlightにも組み込まれました。私はXNAには触れたことがなかったので、かつてのDirect3D RMのような高レベルで小回りの利かないAPIを想像していたのですが、素のDirect3Dに近いかなり低レベルなAPIです。

モデルデータを扱うクラスがSilverlightでは省かれていますが、Silverlight Toolkitの方に用意されているようです。詳細は日本語版の開発ツールが配布されてから確認します。

他の制限は、シェーダモデルは2.0、マルチプルレンダーターゲット使用不可、テクスチャサイズは2048まで、インデックスバッファは16bitといったところです。

  • サウンドエフェクト

XNAからサウンド関係も組み込まれました。MediaElementは結構遅延がありましたが、こちらはゲーム用を想定しているので低遅延なようです。

待望のループ機能やピッチ変更もあります。

  • In-Browser Trusted Applications

以前はブラウザ外実行でしか使えなかった信頼されたアプリケーションが、ブラウザ内実行でも使えるようになりました。ただし、デフォルト状態では使用不可で、レジストリを変更しないと使えません。また、アプリケーションに署名が必要なようです。

  • Call Windows APIs

Silverlight4では信頼されたアプリケーションからCOM呼び出しだけが可能でしたが、5ではネイティブAPIが呼べるようになりました。ネイティブAPIが使えると何でもできてしまうので、いろいろ心配なところです。まぁ、COMが使える時点でスクリプト系のCOMインターフェースを経由すればほとんど何でも可能でしたが。

  • ベクトル画像の印刷対応

Silverlight4ではプリンター出力はビットマップ画像に限られていましたが、5ではベクトル画像の印刷も可能になりました。Googleマップ等のオンライン地図サービスはどこも印刷機能がビットマップ画像で解像度がかなり落ちてしまうので、ベクトル画像で地図を出力するサービスができたら助かります。

  • ダブルクリック対応

今更ですがダブルクリックのための機能が追加されました。

以前はアプリケーション側でクリック間隔を確認してダブルクリックの判定をする必要がありましたが、OSのマウス設定に基づいて一定時間内の連続クリックをカウントしてくれるようになりました。

  • H.264動画のハードウェア再生支援対応

これは、とっくに対応してると思っていました。

  • その他

文字間のスペース調節、行間のスペース調節、リモコン対応、ローカルファイルへのアクセス、64bitブラウザ対応、マルチウインドウなどがあります。

私は元々Silverlightはゲームプラットフォームに向いていると思っていたので、3Dとサウンドエフェクト対応でさらにゲーム向きになったと思います。ブラウザ外実行ならばネイティブAPIを使ってジョイスティックも使えそうなので、インストールの手間等を考えると素のXNAよりも手軽でいいかもしれません。

タグ:Silverlight
2011年12月10日 【プログラミング】 | コメント(0) |
2011年10月19日

Anarchy Golfにハマり中

Twitterのタイムライン上でFibBuzzBuzzFibが流行っていたのをきっかけに、私もAnarchy Golfにハマってしまいました。

Anarchy Golfは、いわゆるCode Golfという競技で、与えられたお題に対するプログラムをできるだけ短いコードで記述するという遊びです。現時点で83種類ものプログラミング言語が使用できますが、私は主にPythonで参加しています。

コードを1バイトでも短くするために色々なアルゴリズムを考えたり、同じ処理を短く書くために様々なパターンを試行錯誤するのは、数独に似た感覚を覚えます。

最適解が何バイトになるのか分からないゴールの見えない戦いで、すでに限界まで絞り込んだコードから更に縮む可能性を模索するのは、色々な方向から考える必要があって、かなり頭を使います。

上位勢が同じバイト数で並んでいて「これが理論上限界だろう」と検討を終了した問題が、しばらく経ってから1位の記録が更新されたときは、悔しさと同時に「まだ削れるか!」という喜びも感じます。そしてまた苦悩の日々を過ごすことに…

Code Golfでは短く書くことが正義なので、きちんと問題を解かずに答えそのものをコード内に埋め込んでしまうことも多いです。答えを埋め込む方が短くなるというのは、問題としては残念ですが、いかに少ない文字数で答えを埋め込むかという戦いも面白かったりします。さすがに、外部プログラムを呼び出したり、ソースをzlibで圧縮して実行時に展開するようなのは、逸脱してる感じがして私は好きではないですが。

Anarchy Golfでは制限時間付きの問題と無期限の問題があり、制限時間付きの問題は時間切れ後にソースコードを見ることができます。最初のうちは、開示されたコードを見てノウハウを勉強していくといいでしょう。Pythonのコードは、Code Golfでも読みやすい傾向にあります。逆にPerlは、書いた本人でもよく分からない難解なものになるので、パズル的な要素ではPerlの方が面白いかもしれません。

続きを読む
2011年10月19日 【プログラミング】 | コメント(0) |
2011年09月18日

GAE/PでのBackendsの使い方

Google App Engineには、ユーザーリクエストに応答するためのFrontend Instanceとは別に、裏で黙々と作業するためのBackend Instanceというものがあります。

Frontend Instanceは、リクエストに対する応答という形で処理をし、1回の処理時間もユーザーリクエストに対しては30秒、CronやTask Queueに対しては10分までという制限があります。

しかし、これでは時間のかかる処理をしにくいので、Backendsという機能が追加されました。Backend Instanceには制限時間がなく、いくらでも処理を続けることができます。(サーバの都合で終了する場合もある)

Backendsは、本来はそのような時間のかかる処理のための機能ですが、Backend Instanceの無料枠はFrontend Instanceとは別に9インスタンス時間分あるので、新料金体系で少しでも料金を節約したい場合にも使えます。(FrontendとBackendを合わせれば無料でも33 37インスタンス時間使える)

Backendsの日本語の解説もまだあまりないので、料金節約のためのBackends利用という視点で、簡単に説明しておきます。

続きを読む
2011年09月18日 【プログラミング】 | コメント(0) |