XNA Game Studio 4.0 Refreshに更新しよう

XNA Game Studio 4.0 Refreshに更新しよう 去年の10月にXNA Game Studio 4.0 Refreshが公開されました。これは、Windows Phone SDK 7.1の中に含まれる形でリリースされ、内容もWindows Phone 7.1の新機能追加が主だったので私もツイッターの方でつぶやく程度で済ませてました。 ですが、Windows Phone向けの新機能以外にもVisual Basic対応やバグフィクスが含まれているので、WindowsやXbox 360で開発している人でも更新する価値は十分にあると思うのでここでも紹介します。 まず、新機能としてVisual Basicに正式に対応したこと、これはWindows Phoneはもちろん、Xbox 360やWindowsでもXNA Game StudioをVisual Basicを使って開発できるようになりました。 そして、バグフィクスの中で比較的重要だと思われるのが「固定更新時、速いPCやフレーム内の処理量が少ない時に更新時間計算の誤差が大きくなり、見かけのフレームレートが下がってしまう」という問題が修正されていることです。 また、Refreshという名前の通り、既存APIからの変更は無くバイナリ互換となっているので3.1から4.0へ更新の時とは違って既存のプロジェクトやコードはそのままコンパイル、実行することができるので現在4.0で開発中の人でも安心して更新することができます。   XNA Game Studio 4.0 Refreshへ更新する 幾つかのケースがあると思うので、それぞれのケースでXNA Game Studio 4.0 Refreshをインストールする方法を紹介します。   Windows Phone SDK 7.1をインストールしている なにもする必要はありません。前述のようにXNA Game Studio 4.0 RefreshはWindows Phone SDK 7.1に含まれています。 Windows Phone Developer…

0

動的テクスチャとその注意点

パーティクルシステムなどで動的に頂点データを変更する場合、GPUとCPUが競合しないように、DynamicVertexBuffer(動的頂点バッファ)、そしてNoOverwriteとDiscardオプションを使う方法を以前紹介しました。 では、テクスチャを動的頂点バッファのように扱うにはどうしたら良いでしょうか?そもそもDynamicTexture2Dというクラスもないし、Texture2D.SetDataにSetDataOptionsを受け取るメソッドもない……。 その答えは XNA Game Studio 4.0でのTexture.SetDataメソッドはSetDataOptions.Discardを指定した時と同じ振る舞いをする(但し注意点あり) となります。 振る舞い的にはTexture2D/Texture3D/TextureCube、それぞれDiscardオプションを指定した時と同じように、指定したテクスチャがGPUで使われていた場合、内部で自動的に同じサイズ、フォーマットのテクスチャを生成し、その新しいテクスチャへデータを書き込むようになっています。 但し、この時にSetDataに渡されるパラメーターがテクスチャの一部分を書き換える設定になっていると、以前のテクスチャからデータを新しいテクスチャへコピーするようになっています。コピーだけならそれ程時間が掛からないのですが、このコピーする際に以前のテクスチャをGPUが使い終わるまで待ってからコピーするようになっているので、結局はDiscardオプションをつけていない時と同じ状態になってしまいます。 私のところでテストしたところ、256x256のテクスチャの一部分を書き換えた時、以下のような結果になりました。 方法 SetDataに掛かった時間 同じテクスチャでSetData 6.8ミリ秒 テクスチャを切り替えてSetData 0.3ミリ秒   まとめると、 テクスチャ全体を書き換える場合は、パフォーマンス問題は発生しない テクスチャの一部分を書き換える場合、複数のテクスチャを切り替えながら書き込むようにしないと遅くなる となります。 テクスチャを切り替えながらSetDataを呼ぶ方法としては「頂点テクスチャでスキンアニメーション」の記事のサンプルコード内にあるFlipTexture2D.csが参考になるでしょう。

0

続・真・簡単(かもしれない)日本語表示

問題報告をツイッターでつぶやくと…… 以前紹介したWPFフォントプロセッサーを使ってくれている人からツイッターの方で不具合報告がありました。 不具合報告は太いアウトライン描画をすると下図のような状態になるというものでした。 これはWPFのアウトライン描画時の使用するペンに線を繋げる時の方法を指定するPenLineJointというプロパティがあり、それがMiterになっていることが原因でした。これをBevel、もしくはRoundにすると問題は解決します。 また、アウトラインを描画するとフォントの上にラインを描画するので、小さなサイズのフォントでは1、2ピクセルの太さのアウトライン描画をすると下図のようにアウトラインが文字に覆いかぶさった状態になってしまいます。 今回、不具合を報告してくれた方がしていた方法として、アウトライン描画をした後にもう一度アウトライン無しで文字を描画することで、小さい文字でも綺麗に見えるようにしていました。同じ方法はAdobe After Effectのテキスト描画の時にアウトラインを先に描画するのか、後に描画するかを指定できるようになっています。     WPFフォントプロセッサーが更新される この二つの機能は便利なので早速WPFフォントプロセッサーに取り入れることにしました。今回追加したのは以下の二つのプロセッサーパラメーターです。 アウトライン形状 アウトライン描画方法 アウトライン形状には、Miter(鋭角)、Bevel(ベベル)、そしてRound(円形)のいずれかを設定できるようになっています。それぞの違いは下図の、特に「W」の文字で違いが分かると思います。 そして、アウトライン描画方法には以下の3つの方法を指定することができます。 StrokeOverFill 文字本体描画の後にアウトラインを描画する FillOverStroke アウトラインを描画した後に文字本体描画する StrokeOnly アウトラインのみを描画する   WPFフォントプロセッサー サンプル いつものように、今回もサンプルプログラムとWPFフォントプロセッサーのソースコードを公開します。 サンプルプログラムはWindows, Xbox 360,そしてWindows Phone 7 (7.1)のプロジェクトが用意されています。このサンプルプログラムでは複数のフォントを使った文字描画をしています。Xbox 360コントローラーのスティック、キーボードの上下キー、マウスのホイールスクロール、そしてタッチとフリック操作で文字をスクロールさせることができます。 サンプルは以下のURLからダウンロードできます。 http://higeneko.net/hinikeni/sample/xna40/WpfFont20120604.zip XNA 4.0で用のWpfFontPiepline.dllは以下のURLからダウンロードできます。 http://higeneko.net/hinikeni/sample/xna40/WpfFontPipeline20120604.zip

5