<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ひにけにXNA : ゲーム開発</title><link>http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx</link><description>Tags: ゲーム開発</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>アバターを使おう その4:カスタムアニメーション</title><link>http://blogs.msdn.com/ito/archive/2009/07/21/avatar-4.aspx</link><pubDate>Wed, 22 Jul 2009 04:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9844163</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ito/comments/9844163.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9844163</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://creators.xna.com/en-US" target=_blank mce_href="http://creators.xna.com/en-US"&gt;Creators Club Onlineサイト&lt;/A&gt;でアバターの&lt;A href="http://creators.xna.com/en-US/news/customavataranimations" target=_blank mce_href="http://creators.xna.com/en-US/news/customavataranimations"&gt;カスタムアニメーション関連のサンプル等が公開&lt;/A&gt;されました。内容的には以下の三つになります。いずれもプレミアムコンテントになっているので、ダウンロードするにはCCO会員になっている必要があります。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://creators.xna.com/en-US/sample/customavataranimation" target=_blank mce_href="http://creators.xna.com/en-US/sample/customavataranimation"&gt;Custom Avatar Animation Sample(カスタムアニメーションサンプル)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://creators.xna.com/en-US/utility/avataranimationrig" target=_blank mce_href="http://creators.xna.com/en-US/utility/avataranimationrig"&gt;Avatar Animation Rig(アバターアニメーション生成用のリグ)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://creators.xna.com/en-US/utility/avataranimationpack" target=_blank mce_href="http://creators.xna.com/en-US/utility/avataranimationpack"&gt;Avatar Animation Pack(アバターアニメーションパック)&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;H3&gt;Custom Avatar Animation Sample&lt;/H3&gt;
&lt;P&gt;このサンプルではアバターを自分のゲーム内で自由にアニメーションさせるための有用な情報が提供されています。3Dモデリングツール上でアニメーションリグを使って作ったアニメーションデータを作り、カスタムコンテントプロセッサーを介してFbxファイルから読み込み、CustomAvatarAnimationPlayerを使って任意のアニメーションをゲーム内で再生するという流れになっています。&lt;/P&gt;
&lt;H3&gt;&lt;/H3&gt;
&lt;H3&gt;Avatar Animation Rig&lt;/H3&gt;
&lt;P&gt;キャラクターアニメーションを作るときにひとつひとつのボーンをアニメーションさせるのは非常に面倒で時間の掛かる作業なので、その作業時間を軽減するためにリグ(Rig)と言われるものを使います。ここでは&lt;A href="http://usa.autodesk.com/adsk/servlet/index?id=7635018&amp;amp;siteID=123112" target=_blank mce_href="http://usa.autodesk.com/adsk/servlet/index?id=7635018&amp;amp;siteID=123112"&gt;Maya&lt;/A&gt;と&lt;A href="http://www.softimage.com/products/modtool/" target=_blank mce_href="http://www.softimage.com/products/modtool/"&gt;Softimage Mod Tool&lt;/A&gt;用のアニメーションリグをダウンロードすることができます。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig02_2.png" target=_blank mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig02_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=avatar-rig02 border=0 alt=avatar-rig02 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig02_thumb.png" width=643 height=484 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig02_thumb.png"&gt;&lt;/A&gt; &lt;BR&gt;Softimage Mod Toolの画面&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig_2.png" target=_blank mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=avatar-rig border=0 alt=avatar-rig src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig_thumb.png" width=581 height=484 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/avatar4_10552/avatar-rig_thumb.png"&gt;&lt;/A&gt;&amp;nbsp; &lt;BR&gt;Maya 2008上での画面&lt;/P&gt;
&lt;H3&gt;Avatar Animation Pack&lt;/H3&gt;
&lt;P&gt;これはゲームなどでよく使われるアニメーションデータをダウンロードすることができます。アニメーションデータはFbxファイル、Maya、そしてSoftimage Mod Tool用の三種類のファイル形式が用意されています。&lt;/P&gt;
&lt;P&gt;アニメーションは21種類あり、歩く、走る、ジャンプといった基本的な移動アニメーションの他にも座る、倒れる、泳ぐといったものがあるので、アニメーションを作るときに参考にしたり、ゲームの雛形を作るときに仮データとして使えます。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9844163" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_397DCB4E_/default.aspx">紹介</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/Xbox360/default.aspx">Xbox360</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B030E930D530A330AF30B930_/default.aspx">グラフィクス</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.1/default.aspx">XNA 3.1</category></item><item><title>アバターを使おう その2:基本アニメーション</title><link>http://blogs.msdn.com/ito/archive/2009/06/25/avatar-02.aspx</link><pubDate>Fri, 26 Jun 2009 04:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9804574</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ito/comments/9804574.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9804574</wfw:commentRss><description>&lt;H3&gt;アバターの基本アニメーション&lt;/H3&gt;
&lt;P&gt;AvatarAnimationを生成するときに指定する&lt;STRONG&gt;AvatarAnimationPreset&lt;/STRONG&gt;列挙型には31種類の基本アニメーションが宣言されています。内訳として、11種類の男女共通のアニメーションと、性別毎に違うアニメーションが10種類となっています。&lt;/P&gt;
&lt;P&gt;男性アバター向けのアニメーションはMaleで始まり、女性アバター向けのアニメーションはFemaleで始まるようになっています。通常はAvatarDescription.BodyTypeによって性別ごとにアニメーションを切り替えて使用しますが、アニメーションは性別に関係なく使えるので、意図的に男性アバターに女性アバターのアニメーションを再生させるということもできます。&lt;/P&gt;
&lt;H3&gt;男女共通のアニメーション&lt;/H3&gt;
&lt;P&gt;以下は男女共通アニメーション名と、その説明です。 &lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=677&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;
&lt;P align=center&gt;アニメーション名&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;
&lt;P align=center&gt;説明&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Stand0&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;基本姿勢アニメーション、身体的アニメーションは殆どなく、瞬きする程度。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Stand1&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;基本姿勢アニメーションに加えて、数秒間軽く上を見上げる動作。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Stand2&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;基本姿勢アニメーションに加えて、左、上方向に顔を向ける動作。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Stand3&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;基本姿勢アニメーションに加えて、左右を見渡した後に軽く首をかしげる動作。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Stand4&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;軽く右足を上げて、つま先を見つめる。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Stand5&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;両手を広げて、前後に振る。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Stand6&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;足元を見回す動作。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Stand7&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;頭を左右に傾けた後に、首を回す動作。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Clap&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;笑顔で拍手する。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Wave&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;笑顔で手を振る。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=103&gt;Celebrate&lt;/TD&gt;
&lt;TD vAlign=top width=572&gt;喜びの動作。アバター生成画面でアバターを選択したときにするアニメーションと同じもの。&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;H3&gt;性別によって違うアニメーション&lt;/H3&gt;
&lt;P&gt;以下は性別によって異なるアニメーションをまとめた表です。殆どのアニメーションはMaleLaugh、FemaleLaughといった感じで同じタイプのアニメーションが用意されています。例外としてはMaleIdleCheckHand,FemaleIdleCheckNails,MaleIdleStretch,FemaleIdelFixShoeの四つのアニメーションがあります。&lt;/P&gt;
&lt;P&gt;同じタイプのアニメーションでも、例えば笑うアニメーションの場合、男性はひざを叩いて笑う動作をするのに対して、女性は手を前にかざして笑うといった違いがあります。 &lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=679&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;
&lt;P align=center&gt;男性用アニメーション名&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;
&lt;P align=center&gt;女性用アニメーション名&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;
&lt;P align=center&gt;説明&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;MaleIdleCheckHand&lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;FemaleIdleCheckNails &lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;男性は肩を軽くまわした後に自分の手を見つめる動作。 &lt;BR&gt;女性は爪を見つめる動作。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;MaleIdleLookAround &lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;FemaleIdleLookAround &lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;あたりを見回す動作。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;FemaleIdleShiftWeight &lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;MaleIdleShiftWeight &lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;重心を左右の足に移動する動作。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;MaleIdleStretch &lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;FemaleIdleFixShoe&lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;男性はストレッチ動作、女性は靴の様子を見る動作。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;MaleAngry &lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;FemaleAngry &lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;怒る。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;MaleConfused &lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;FemaleConfused &lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;困惑。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;MaleLaugh &lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;FemaleLaugh &lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;大笑い。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;MaleCry &lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;FemaleCry &lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;泣く。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;MaleSurprised &lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;FemaleShocked &lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;驚き。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=141&gt;MaleYawn &lt;/TD&gt;
&lt;TD vAlign=top width=156&gt;FemaleYawn &lt;/TD&gt;
&lt;TD vAlign=top width=380&gt;あくび。男性は手を口に当ててあくび。女性は手を広げてあくび。&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;百聞は一動画にしかずということで、全ての基本アニメーションを再生した動画を作ってみました。男性、女性アバターを並べて、それぞれのアニメーションを二回再生するようになっています。 &lt;/P&gt;
&lt;DIV align=center&gt;
&lt;OBJECT width=560 height=340&gt;&lt;PARAM NAME="movie" VALUE="http://www.youtube.com/v/gguyGGX_ls0&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;PARAM NAME="allowFullScreen" VALUE="true"&gt;&lt;PARAM NAME="allowscriptaccess" VALUE="always"&gt;
&lt;embed src="http://www.youtube.com/v/gguyGGX_ls0&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" mce_src="http://www.youtube.com/v/gguyGGX_ls0&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/OBJECT&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9804574" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/Xbox360/default.aspx">Xbox360</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B030E930D530A330AF30B930_/default.aspx">グラフィクス</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.1/default.aspx">XNA 3.1</category></item><item><title>AppWeek</title><link>http://blogs.msdn.com/ito/archive/2009/06/15/appweek.aspx</link><pubDate>Tue, 16 Jun 2009 04:12:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9757359</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/9757359.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9757359</wfw:commentRss><description>&lt;p&gt; XNAプラットフォーム＆ツールチームの主な作業はXNA Game Studioを作ることですが、リリースの直前には、実際に作ったものに問題がないか、また使いやすいかを確認するために開発中のフレームワークを使って実際にゲームを作ってみるAppWeekというものがあります。&lt;/p&gt;  &lt;p&gt;XNA GSE 1.0の頃に作られた物の中には&lt;a href="http://creators.xna.com/en-US/minigame/catapult" target="_blank"&gt;Catapult&lt;/a&gt;、&lt;a href="http://creators.xna.com/en-US/minigame/minjie" target="_blank"&gt;Minji&lt;/a&gt;といったサンプルとして公開されているものもあります。XNA GS 3.0の時は忙しすぎてAppWeekをする暇がなかったのですが、今回のXNA GS 3.1ではAppWeekがありました。&lt;/p&gt;  &lt;p&gt;今回のAppWeekは４日間という短期間でしたが15個のゲームが作られました。特に3.1で追加された機能のテストを兼ねているので今回はアバターとビデオを使ったゲームが殆どでした。&lt;/p&gt;  &lt;p&gt;Shawn Hargreaves氏は&lt;a href="http://creators.xna.com/en-US" target="_blank"&gt;Creators Club Onlineサイト&lt;/a&gt;にあるサンプルコードを組み合わせて作った&lt;a href="http://blogs.msdn.com/shawnhar/archive/2009/06/12/appweek.aspx" target="_blank"&gt;「Super Avatar Sample Smashup EXTREME! ‘Capture the Cat’ edition」&lt;/a&gt;を作りました。このゲームではフィールド内の相手陣地のねこを自陣までつれてくるのが勝利の条件で、一匹のねこをめぐって宇宙船やら、戦車を使った争奪戦を繰り広げるネットワーク対応のゲームでした。&lt;/p&gt;  &lt;p&gt;Brandon Bloom氏の作った&lt;a href="http://blog.brandonbloom.name/2009/06/appweek.html" target="_blank"&gt;「Avatar Boxing」&lt;/a&gt;は、アバターを使ったボクシングゲームでした。アバターの各ボーンを自由に変更することで任意のアニメーションを設定で機能を使ったものでした。ちなみにこのゲームを作るときには&lt;strong&gt;BoundingSphere.Transform&lt;/strong&gt;がサポートするのは平行移動のみの行列でしたが、それでは不便ということで3.1では平行移動、回転、スケールの行列もサポートするようになりました。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;私も３日間だけ時間が取れたので、アバターを使ったゲームを作ってみました。タイトルは「Columns Flash」、落ちものパズルゲームにアバターを組み合わせたものです。今回は贅沢にすべてのブロックを3Dにしてみました。&lt;/p&gt;  &lt;p&gt;ブロックを消すと、下のスクリーンショットのようにアバターが拍手するアニメーションしたり、&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-71_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="itoxe1-71" border="0" alt="itoxe1-71" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-71_thumb.png" width="644" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;コンボゲージが溜まったときにYボタンを押すと、下のスクリーンショットのようにコンボアタックを発動して対戦相手に対していじわる攻撃を繰り出すことができます。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-69_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="itoxe1-69" border="0" alt="itoxe1-69" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-69_thumb.png" width="644" height="364" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;こちらはLv1コンボアタックの「ゆさぶり」で、相手のボード全体がふらふらと揺れてプレイししづらくなります。もちろん、アバターも困った顔をしています。3Dで描画しているので、コンボアタックも3Dならではの攻撃になっています。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-70_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="itoxe1-70" border="0" alt="itoxe1-70" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-70_thumb.png" width="644" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;こちらは、Lv2コンボアタックの「ちぢこまり」です。ボードが小さくなるだけなのですが、この攻撃をされた対戦相手は画面が良く見えなくなるので、モニタの前に張り付く姿が笑えます。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-73_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="itoxe1-73" border="0" alt="itoxe1-73" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-73_thumb.png" width="644" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;で、こちらはLv3コンボアタックの「ひっくりがえし」です。ボードが180度回転して、ブロックの上下が逆さまになります。この手のゲームでは連鎖のタネをばら撒くのが勝つコツですが、そういった計画を文字通りひっくりがえしてしまう攻撃です。アバターも驚いた表情をします。 &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-76_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="itoxe1-76" border="0" alt="itoxe1-76" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-76_thumb.png" width="644" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;対戦が白熱してくると、やられたらやり返すという場面が増えてくるので、二人同時にコンボアタック発動して下のように派手な画面になることもしばしばあります。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-74_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="itoxe1-74" border="0" alt="itoxe1-74" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-74_thumb.png" width="644" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;そして、ゲームオーバーになると、下の画面のように負けたほうのブロックが飛び散り、勝ったプレイヤーのアバターは喜びのアニメーション、負けた方はうなだれたアニメーションをするようになっています。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-75_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="itoxe1-75" border="0" alt="itoxe1-75" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/appweek_DC24/itoxe1-75_thumb.png" width="644" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;このゲームではアバターの基本描画と、基本アニメーションセットしか使っていませんが、それでも自分のアバターがそのままゲーム内でさまざまなリアクションをするというのは楽しいものでした。また、今回のゲームは絵も含めてフルスクラッチ(背景の写真はハイキングへ行ったときに撮った写真)で制作しましたが、３日間という短期間でここまでのゲームを作ることができるという、C#を使った開発効率の高さにはいまだに感心させられます。&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9757359" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_397DCB4E_/default.aspx">紹介</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category></item><item><title>デバッグコマンド</title><link>http://blogs.msdn.com/ito/archive/2009/01/22/debugcommand.aspx</link><pubDate>Fri, 23 Jan 2009 10:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9372299</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/9372299.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9372299</wfw:commentRss><description>&lt;P&gt;注:今回紹介するコンポーネントは&lt;A href="http://blogs.msdn.com/ito/archive/2008/12/27/debug-components-sample.aspx" mce_href="http://blogs.msdn.com/ito/archive/2008/12/27/debug-components-sample.aspx"&gt;デバッグサンプル&lt;/A&gt;に入っています。&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=debugcmd src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/DebugCommand_568/debugcmd_3.png" width=438 height=373 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/DebugCommand_568/debugcmd_3.png"&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;開発中にいろんなものを実行したい&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ゲーム開発中には様々な情報が欲しくなる場面が沢山あります。シンプルな情報であればブレークポイントを設定して変数を調べたりすることができますが、３Ｄゲームで画面に表示されている数十体もある敵のうちからひとつの敵の情報をデバッガを使って得るのは大変です。また、スタンドアローン実行している状態、例えばVisual StudioからCtrl+F5で実行した時や、友達の家でテストプレイしているときにバグが発生したときにも、ある程度の情報を知りたい場面があります。それ以外にも開発中に実行したいことはパッと思いつくだけでも以下のものがあります。 &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;シーン全体のポリゴン数 &lt;/LI&gt;
&lt;LI&gt;指定したシェーダーのみの表示 &lt;/LI&gt;
&lt;LI&gt;カメラの視錐体表示してビューカリングのチェック &lt;/LI&gt;
&lt;LI&gt;シーン内を自由に移動できるデバッグ用カメラへの切り替え &lt;/LI&gt;
&lt;LI&gt;敵の数の表示 &lt;/LI&gt;
&lt;LI&gt;シーン内のコリジョン情報の表示 &lt;/LI&gt;
&lt;LI&gt;イベントトリガー等の表示 &lt;/LI&gt;
&lt;LI&gt;AIテスト用に任意の敵を出現させる &lt;/LI&gt;
&lt;LI&gt;任意の敵を即死させる &lt;/LI&gt;
&lt;LI&gt;AIステートの表示 &lt;/LI&gt;
&lt;LI&gt;指定した武器を出現させる &lt;/LI&gt;
&lt;LI&gt;指定したステージへの移動 &lt;/LI&gt;
&lt;LI&gt;プレイヤーのHP設定 &lt;/LI&gt;
&lt;LI&gt;Godモード (無敵モード)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;これだけの機能を実現するシステムとして、以下の方法が考えられます。 &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;欲しい機能ごとにソースコードを変更してコンパイルする &lt;/LI&gt;
&lt;LI&gt;コントローラーのボタンに割り当てる &lt;/LI&gt;
&lt;LI&gt;簡単なデバッグメニューを作る &lt;/LI&gt;
&lt;LI&gt;WindowsみたいなUIを表示させるAPIを作る &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;１は単純な方法ですが、いちいちソースコードをコンパイルするというのは面倒だし、スタンドアローン実行時には使えません。２は表示、非表示といったことには使えますが、数に限りがあり管理するのも大変です。３も表示のコントロールなどには使えますが、任意の敵を指定した場所に出現させるといったことには不向きです。４については、Windowsの場合は既存のUIを使えば良いのですが、Xbox 360上では自作する必要があるし、仮にそういったAPIがあったとしても機能ごとのGUIを作るのに手間が掛かります。また、GUIの弱点としてはバッチ処理をするのが難しいという面もあります。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;デバッグコマンド&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;こういった要求を満たすためにゲーム開発現場で昔から使われているのがデバッグコマンドです。本来は開発時のみの機能で商品化されたゲームで見かけることは少ないのですが、PCゲームではDOOM時代からあるものなので知っている人も居ると思います。&lt;/P&gt;
&lt;P&gt;デバッグコマンドの利点は文字列を入力実行し、出力するというシンプルさにあります。ゲーム中にコマンドを入力して実行するのはもちろん、ネットワークを介して文字列を転送して実行することができます。このことを利用して開発PCとXbox 360間をNetworkSessionで繋ぎ、Windows上ではGUIを使い、その情報を文字列にしてXbox 360に転送するという使い方もできます。この手法はPC上で作ったマップエディターから実機上への通信にも利用されています。特にPC画面上と開発機から出力された画面では色が違うのでBrute Force開発時にはライティングの最終調整などで使っていました。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;デバッグコマンドを使う&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;サンプルでは&lt;STRONG&gt;DebugCommandUI&lt;/STRONG&gt;コンポーネントを使用します。DebugCommandUIコンポーネントはDebugManagerにあるフォントを使用するので、DebugCommandを追加する前にDebugManagerコンポーネントを追加する必要があります。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// デバッグマネージャーの初期化と追加
&lt;/SPAN&gt;debugManager = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;DebugManager&lt;/SPAN&gt;( &lt;SPAN style="COLOR: blue"&gt;this &lt;/SPAN&gt;);
Components.Add( debugManager );

&lt;SPAN style="COLOR: green"&gt;// デバッグマコマンドUIの初期化と追加
&lt;/SPAN&gt;debugCommandUI = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;DebugCommandUI&lt;/SPAN&gt;( &lt;SPAN style="COLOR: blue"&gt;this &lt;/SPAN&gt;);

&lt;SPAN style="COLOR: green"&gt;// デバッグコマンドUIを最上面に表示させる為にDrawOrderを変更する
&lt;/SPAN&gt;debugCommandUI.DrawOrder = 100;

Components.Add( debugCommandUI );&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;DebugManagerコンポーネントを追加した後に、DebugCommandUIコンポーネントを生成、デバッグコマンドを最上面に描画させる為にDrawOrderを変更してから追加するだけで、デバッグコマンドを使用することができます。ゲーム中にTABキーを押すことでデバッグコマンドを表示してコマンドを入力することができます。&lt;/P&gt;
&lt;P&gt;新しいコマンドを追加するには&lt;STRONG&gt;DebugCommandUI.RegisterCommand&lt;/STRONG&gt;メソッドを使います。このメソッドにはコマンド名、コマンドの説明、そしてコマンド実行じに呼び出されるデリゲートを指定します。デバッグサンプルではposコマンドを追加しています。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// サンプルコマンドの登録
&lt;/SPAN&gt;debugCommandUI.RegisterCommand(
    &lt;SPAN style="COLOR: #a31515"&gt;"pos"&lt;/SPAN&gt;,              &lt;SPAN style="COLOR: green"&gt;// コマンド名
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;"set position"&lt;/SPAN&gt;,     &lt;SPAN style="COLOR: green"&gt;// コマンド説明
    &lt;/SPAN&gt;PosCommand          &lt;SPAN style="COLOR: green"&gt;// コマンド実行用デリゲート
    &lt;/SPAN&gt;);&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;登録したデリゲートはコマンドが実行された時に自動的に呼び出されます。デバッグサンプルでは"pos"というコマンドが入力されるとPosCommandが呼び出されます。引数のhostはコマンドを実行したIDebugCommandHost、commandは入力されたコマンド文字列(ここではpos)、そしてargumentsは入力された他の引数を文字列の配列になっています。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;void &lt;/SPAN&gt;PosCommand( &lt;SPAN style="COLOR: #2b91af"&gt;IDebugCommandHost &lt;/SPAN&gt;host, &lt;SPAN style="COLOR: blue"&gt;string &lt;/SPAN&gt;command,
                                            &lt;SPAN style="COLOR: #2b91af"&gt;IList&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;&amp;gt; arguments )
{
    &lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;( &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt;.Compare( arguments[0], &lt;SPAN style="COLOR: #a31515"&gt;"show"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: blue"&gt;true &lt;/SPAN&gt;) == 0 )
    {
        &lt;SPAN style="COLOR: green"&gt;// show オプションで現在座標を表示する
        &lt;/SPAN&gt;host.Echo( &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt;.Format( &lt;SPAN style="COLOR: #a31515"&gt;"Pos={0},{1}"&lt;/SPAN&gt;, debugPos.X, debugPos.Y ) );
    }
    &lt;SPAN style="COLOR: blue"&gt;else
    &lt;/SPAN&gt;{
        &lt;SPAN style="COLOR: green"&gt;// "pos x座標 y座標"と入力されたものを処理する
        &lt;/SPAN&gt;debugPos.X = &lt;SPAN style="COLOR: #2b91af"&gt;Single&lt;/SPAN&gt;.Parse( arguments[0] );
        debugPos.Y = &lt;SPAN style="COLOR: #2b91af"&gt;Single&lt;/SPAN&gt;.Parse( arguments[1] );
    }
}&lt;/PRE&gt;
&lt;P&gt;各コマンドは単なる文字列なのでテキストファイルとしてログを取っておいて、後で複数のコマンドをバッチ処理したりすることができます。&lt;A target=_blank href="http://blogs.msdn.com/ito/archive/2008/12/12/gamefest-japan-2008-demo.aspx" mce_href="http://blogs.msdn.com/ito/archive/2008/12/12/gamefest-japan-2008-demo.aspx"&gt;Gamefest Japan 2008 デモプログラム&lt;/A&gt;の中ではデモを切り替えたときに以下のようにして３つのコマンドを呼び出していました。&lt;/P&gt;&lt;PRE class=code&gt;debugHost.ExecuteCommand( &lt;SPAN style="COLOR: #2b91af"&gt;String&lt;/SPAN&gt;.Format( &lt;SPAN style="COLOR: #a31515"&gt;"demo {0}"&lt;/SPAN&gt;, demoNames[curdemo] ) );
debugHost.ExecuteCommand( &lt;SPAN style="COLOR: #a31515"&gt;"fps on" &lt;/SPAN&gt;);
debugHost.ExecuteCommand( &lt;SPAN style="COLOR: #a31515"&gt;"tr on reset log:on" &lt;/SPAN&gt;);&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;デバッグコマンドは、その名が示すとおり、デバッグ時の機能なのでリリース時に外すことを忘れないようにしてください。Godモードのように無敵になるくらいだったらいいのですが、ゲームバランスを崩したり、ゲームの進行ができなくなるようなコマンドが残ったままリリースされるのは避けるようにしましょう。デバッグコマンドを外すもっとも簡単な方法は単にDebugCommandUIを追加しないようにするだけです。&lt;/P&gt;
&lt;P&gt;と、いうわけでFPSカウンター、TimeRuler、そしてデバッグコマンドを紹介してきました。これら３つのコンポーネントをゲーム開発時に役立ててみてはどうでしょうか？&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9372299" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.0/default.aspx">XNA 3.0</category><category domain="http://blogs.msdn.com/ito/archive/tags/_C730D030C330B030_/default.aspx">デバッグ</category></item><item><title>タイムルーラー</title><link>http://blogs.msdn.com/ito/archive/2008/12/29/timeruler.aspx</link><pubDate>Tue, 30 Dec 2008 03:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9256397</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/ito/comments/9256397.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9256397</wfw:commentRss><description>&lt;P&gt;注:今回紹介するコンポーネントは&lt;A target=_blank href="http://blogs.msdn.com/ito/archive/2008/12/27/debug-components-sample.aspx" mce_href="http://blogs.msdn.com/ito/archive/2008/12/27/debug-components-sample.aspx"&gt;デバッグサンプル&lt;/A&gt;に入っています。&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=TimeRuler src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/TimerRuler_FB53/TimeRuler_3.png" width=510 height=129 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/TimerRuler_FB53/TimeRuler_3.png"&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;時を測る&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;前回紹介したFPSカウンターではゲーム全体のパフォーマンスを測定するには使えますが、どの処理がどれだけ時間が掛かっているかを判定するには不向きです。&lt;/P&gt;
&lt;P&gt;例えば、ねこが大勢の敵をなぎ倒す「ねこ無双」というゲームを作っていて、敵が沢山出てきた時に処理落ちになった場合に最適化をする必要があったとします。&lt;/P&gt;
&lt;P&gt;最適化ルールその３:「最も負荷の高い部分(ボトルネック)の処理を最適化する」&lt;/P&gt;
&lt;P&gt;これは当然の話で、１フレーム内で10%しか消費していない処理よりも、50%消費している部分を最適化する方が効果的です。では、この高負荷の処理を発見するにはどうしたら良いでしょうか？ねこ無双の場合だと、敵が増えると処理落ちがするんだから真っ先に思いつくのは敵AI、敵のアニメーション、敵のコリジョン判定、敵の描画処理部分です。&lt;/P&gt;
&lt;P&gt;しかし、必ずしもそうとは限りません。もしかしたら、敵の数ではなく戦っている場面の描画部分がもともと負荷が多かったのかもしれないし、敵を表示するレーダー部分かもしれません。&lt;/P&gt;
&lt;P&gt;このボトルネックを発見するのに有用なのがリアルタイムプロファイラー、TimeRuler(タイムルーラー)です。TimeRulerでは、複数の処理時間を測定することができ、その結果をグラフでリアルタイムに表示してくれます。&lt;/P&gt;
&lt;P&gt;上図の例では、青い部分が更新処理、黄色い部分が描画処理になっています。この状態で最適化する場合は更新処理部分を最適化するのが効果的だと言うことが一目で判ります。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;アルゴリズムのチェック&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;理想的なアルゴリズムは計算量のオーダーがO(n)、もしくはO(n log n)になることです。例えば、敵を10体出現させたときの処理時間が1msだった場合、敵が100体になった時の処理時間が10ms~20ms以内に収まっていれば理想的なアルゴリズムを使っているということになります。逆に敵１００体の処理時間が1,000msになってしまうのは、計算量オーダーがO(n^2)になっているアルゴリズムを使っている可能性があります。良くあるケースでは、コリジョン判定を単純な多重ループにしている時などです。&lt;/P&gt;
&lt;P&gt;特に最近のゲームでは大量のオブジェクト数を処理するので、アルゴリズムの選択を間違えると、あっという間に処理が間に合わなくなってしまうので注意が必要です。&lt;/P&gt;
&lt;P&gt;TimeRulerを使ってオブジェクトの数を10,20,...100と順々に増やしていき、それぞれの処理時間を測定してグラフにすることで問題のあるアルゴリズム部分を発見することができます。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;瞬間最大負荷を測る&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;TimeRulerはリアルタイムプロファイラーなので、瞬間的な負荷も視覚的に見ることができます。例えば同じフレーム内で大量の敵を一気に発生させると、敵の初期化処理に時間が掛かりすぎて、そのフレームだけ処理落ちするということがあります。こういった瞬間的な負荷はFPSカウンターで発見することは不可能ですが、TimeRulerを使うとグラフが一瞬大きくブレるので判ります。&lt;/P&gt;
&lt;P&gt;また、TimeRulerを表示した状態でビデオに録画したり、動画をキャプチャーしておけば、こういった瞬間的な負荷を細かく調べることもできます。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;TimeRulerを使う為の準備&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;TimeRulerコンポーネントはDebugManagerにあるフォントを使用するので、TimeRulerを追加する前にDebugManagerコンポーネントを追加する必要があります。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// デバッグマネージャーの初期化と追加
&lt;/SPAN&gt;debugManager = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;DebugManager&lt;/SPAN&gt;( &lt;SPAN style="COLOR: blue"&gt;this &lt;/SPAN&gt;);
Components.Add( debugManager );&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;また、必須ではありませんが、TimeRulerはインスタンス生成時にGame.Servicesに&lt;STRONG&gt;IDebugCommandHost&lt;/STRONG&gt;インターフェースが追加されていると、&lt;STRONG&gt;tr&lt;/STRONG&gt;デバッグコマンドを登録します。DeubgCommandUIはIDebugCommandHostインターフェースを実装しているので、このコンポーネントを追加した後にTimeRulerを追加することで&lt;STRONG&gt;tr&lt;/STRONG&gt;コマンドを使うことができます。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// デバッグマコマンドUIの初期化と追加
&lt;/SPAN&gt;debugCommandUI = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;DebugCommandUI&lt;/SPAN&gt;( &lt;SPAN style="COLOR: blue"&gt;this &lt;/SPAN&gt;);

&lt;SPAN style="COLOR: green"&gt;// デバッグコマンドUIを最上面に表示させる為にDrawOrderを変更する
&lt;/SPAN&gt;debugCommandUI.DrawOrder = 100;

Components.Add( debugCommandUI );&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;デバッグコマンドUIをTabキーを押して表示させた後に、trとタイプするとTimerRulerの表示/非表示の切り替え、"tr on"で表示、"tr off"で非表示にすることができます。&lt;/P&gt;
&lt;P&gt;また、trコマンドには以下のオプションがあります。&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=475&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=61&gt;log&lt;/TD&gt;
&lt;TD vAlign=top width=409&gt;ログの表示/非表示の切り替え。 &lt;BR&gt;例) tr log&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=61&gt;reset&lt;/TD&gt;
&lt;TD vAlign=top width=409&gt;ログ履歴の初期化 &lt;BR&gt;例) tr reset&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=61&gt;frame&lt;/TD&gt;
&lt;TD vAlign=top width=409&gt;TimeRulerのバーの長さをフレーム単位で指定する(既定値:1) &lt;BR&gt;例) tr frame:2&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;プログラム側でも、これらの操作はできるようになっていて、表示の切り替えは&lt;STRONG&gt;TimeRuler.Visible&lt;/STRONG&gt;プロパティ、Logの表示は&lt;STRONG&gt;TimeRuler.ShowLog&lt;/STRONG&gt;プロパティ、表示フレーム数は&lt;STRONG&gt;TimeRuler.TargetSampleFrames&lt;/STRONG&gt;プロパティ、そしてログのリセットは&lt;STRONG&gt;TimeRuler.ResetLog&lt;/STRONG&gt;メソッドを呼ぶことでできます。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;最後に、TimeRulerをComponentsに追加することでTimeRulerが画面下に表示されるようになります。ただし、DebugCommandUIが先に登録されていると、初期状態では表示されません。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// タイムルーラーの初期化と追加
&lt;/SPAN&gt;timerRuler = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;TimeRuler&lt;/SPAN&gt;( &lt;SPAN style="COLOR: blue"&gt;this &lt;/SPAN&gt;);
Components.Add( timerRuler );&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;&lt;STRONG&gt;TimeRulerの使い方&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;上記の初期化を終えれば、TimeRulerを使う準備ができました。まず、TimeRulerにフレームの開始時点を知らせる&lt;STRONG&gt;StartFrame&lt;/STRONG&gt;メソッドを呼びます。場所はGameクラスのUpdateメソッドの先頭に記述するのが良いでしょう。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// タイムルーラーにフレーム開始を伝える
&lt;/SPAN&gt;timerRuler.StartFrame();&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;次に測定したい部分を&lt;STRONG&gt;BeinMark&lt;/STRONG&gt;と&lt;STRONG&gt;EndMark&lt;/STRONG&gt;メソッドで囲みます。BeginMarkメソッドには表示するバーのインデックス値(0~７)、マーカー名、バーに表示されるときの色を指定し、EndMarkではバーのインデックス値とマーカー名を指定します。マーカー名はCaseセンシティブなので、大文字小文字が違うと違うマーカー名と認識されることに注意してください。バーのインデックス値は省略するとインデックス値を0として呼び出した事になります。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// 更新期間、"Update"の測定開始
&lt;/SPAN&gt;timerRuler.BeginMark( 0, &lt;SPAN style="COLOR: #a31515"&gt;"Update"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #2b91af"&gt;Color&lt;/SPAN&gt;.Blue );

&lt;SPAN style="COLOR: green"&gt;// Updateの処理をここでする
&lt;/SPAN&gt;...

&lt;SPAN style="COLOR: green"&gt;// 更新期間、"Update"の測定終了
&lt;/SPAN&gt;timerRuler.EndMark( 0, &lt;SPAN style="COLOR: #a31515"&gt;"Update" &lt;/SPAN&gt;);&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;BeginMarkは以下のコードのように階層的に呼び出すこともできます。デフォルトでは最大３２階層になっていますが、TimeRuler.MaxNestCall定数値を変更することができます。ただし、Begin A, Begin B, End B, End Aのように呼べますが、Begin A, Begin B, End A, End Bのように呼ぶことはできません。&lt;/P&gt;&lt;PRE class=code&gt;timerRuler.BeginMark( &lt;SPAN style="COLOR: #a31515"&gt;"Update"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #2b91af"&gt;Color&lt;/SPAN&gt;.Blue );

    timerRuler.BeginMark( &lt;SPAN style="COLOR: #a31515"&gt;"Character Update"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #2b91af"&gt;Color&lt;/SPAN&gt;.Azure );

        timerRuler.BeginMark( &lt;SPAN style="COLOR: #a31515"&gt;"Character Animation"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #2b91af"&gt;Color&lt;/SPAN&gt;.BurlyWood );
        &lt;SPAN style="COLOR: green"&gt;// キャラクターアニメーション処理
        &lt;/SPAN&gt;...
        timerRuler.EndMark( &lt;SPAN style="COLOR: #a31515"&gt;"Character Animation" &lt;/SPAN&gt;);

        timerRuler.BeginMark( &lt;SPAN style="COLOR: #a31515"&gt;"Character Collision"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #2b91af"&gt;Color&lt;/SPAN&gt;.DarkOrchid );
        &lt;SPAN style="COLOR: green"&gt;// キャラクターコリジョン処理
        &lt;/SPAN&gt;...
        timerRuler.EndMark( &lt;SPAN style="COLOR: #a31515"&gt;"Character Collision" &lt;/SPAN&gt;);

    timerRuler.EndMark( &lt;SPAN style="COLOR: #a31515"&gt;"Character Update" &lt;/SPAN&gt;);

timerRuler.EndMark( &lt;SPAN style="COLOR: #a31515"&gt;"Update" &lt;/SPAN&gt;);&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;TRACE定数でTimeRuler機能のコントロール&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;TimeRulerはその性質上リリースビルドでも動作するようになっていますが、実際にゲームをリリースするときには実行する必要はありません。ゲームコード内に埋め込んだBegin/EndMarkを手で消したりするのはあまりにも不効率過ぎるので、簡単にそれらのメソッドの呼び出しを制御するためにTimeRulerの殆どのメソッドには&lt;A target=_blank href="http://msdn.microsoft.com/ja-jp/library/aa664622(VS.71).aspx" mce_href="http://msdn.microsoft.com/ja-jp/library/aa664622(VS.71).aspx"&gt;Conditional属性&lt;/A&gt;を使ってTRACE定数が宣言されているときのみに呼び出されるようになっています。TRACE定数はプロジェクトプロパティのビルドタブにある「TRACE定数の定義」のチェックボックスによってコントロールすることができます。&lt;/P&gt;
&lt;P&gt;C/C++ではコンパイラ最適化の一つとして呼び出し先が空の関数の場合には関数呼び出しのコードを生成しないようになっていますが、.Netでは呼び出するメソッドが空のメソッドであっても、メソッド呼び出しコードを生成します。代わりにConditional属性を使い、指定された定数が宣言されていない場合は、そのメソッドに使われた引数も含めて呼び出しコードを生成しないようになっています。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;マシン性能のクセを知る&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ここではTimeRulerなんていう格好つけた名前をつけてはいますが、同様の仕組みは8ビット機時代から使われていたものです。例えばPCエンジンでは、あるパレットの色を変更するとTVの画面外の色を変更することができるので、処理毎に色を変えることで画面の両脇に縦に伸びるバーを作ることができました。&lt;/P&gt;
&lt;P&gt;実装方法は変わりましたが、バーが振り切らないようにゲームを作るという目的は今も昔も一緒です。特に、最近のシステムでは幾重ものパイプラインステージやキャッシュといった複雑な仕組みがあるので、必ずしもコード量が実行速度に比例するわけではありません。ですから、常にTimeRulerを使うことでどの処理がどれくらいの負荷になるのかを実感できることができます。&lt;/P&gt;
&lt;P&gt;次回はデバッグコマンドを紹介します。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9256397" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.0/default.aspx">XNA 3.0</category><category domain="http://blogs.msdn.com/ito/archive/tags/_C730D030C330B030_/default.aspx">デバッグ</category></item><item><title>FPSカウンター</title><link>http://blogs.msdn.com/ito/archive/2008/12/27/fps-counter.aspx</link><pubDate>Sun, 28 Dec 2008 04:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9254649</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/9254649.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9254649</wfw:commentRss><description>&lt;P&gt;注:今回紹介するコンポーネントは&lt;A target=_blank href="http://blogs.msdn.com/ito/archive/2008/12/27/debug-components-sample.aspx" mce_href="http://blogs.msdn.com/ito/archive/2008/12/27/debug-components-sample.aspx"&gt;デバッグサンプル&lt;/A&gt;に入っています。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=fps-counter src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/fpscounter_BC74/fps-counter_3.png" width=180 height=90 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/fpscounter_BC74/fps-counter_3.png"&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;正確な測定には注意が必要&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;FPSカウンターは、一定時間内に(数秒程度)何フレーム更新できたかを計測した結果から、１秒間のフレーム数、FPS(Frame Per Second)を表示するという、非常に簡単な機能です。&lt;/P&gt;
&lt;P&gt;ですが、正確なFPSを測定するには幾つかの注意が必要です。&lt;STRONG&gt;Game.IsFixedTimeStep&lt;/STRONG&gt;の既定値はtrueになっているので、ゲームの更新と描画に掛かる時間が1msだとしても、見かけ上は16.6ms、つまり60FPSになってしまいます。また、描画時にV-Syncに同期するようになっているので、IsFixedTimeStepだけをfalseにしてもやはり60FPSになってしまいます。&lt;/P&gt;
&lt;P&gt;FPSを正しく測定するにはゲームクラスのコンストラクタ内で以下の様なコードを実行する必要があります。&lt;/P&gt;&lt;PRE class=code&gt;graphics = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;GraphicsDeviceManager&lt;/SPAN&gt;( &lt;SPAN style="COLOR: blue"&gt;this &lt;/SPAN&gt;);

graphics.SynchronizeWithVerticalRetrace = &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;;
IsFixedTimeStep = &lt;SPAN style="COLOR: blue"&gt;false&lt;/SPAN&gt;;&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;これでFPS自体は正しく測定することができますが、IsFixedTimeStepをfalseに変更するということは、ゲームの更新の仕方が&lt;STRONG&gt;固定更新&lt;/STRONG&gt;から、&lt;STRONG&gt;可変更新&lt;/STRONG&gt;に変えるということです。もし、キャラクターを移動するコードが以下の様になっている場合に可変更新に変更すると、キャラクターの移動が速すぎてゲームがプレイ不可能になる場合があります。&lt;/P&gt;&lt;PRE class=code&gt;pos += speed;&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;この問題を解決するには以下の様に、経過時間によって移動するようなコードになっている必要があります。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;float &lt;/SPAN&gt;dt = (&lt;SPAN style="COLOR: blue"&gt;float&lt;/SPAN&gt;)gameTime.ElapsedGameTime.TotalSeconds;

pos += speed * dt;&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;固定更新、可変更新の振る舞いの違いについては、&lt;A target=_blank href="http://blogs.msdn.com/ito/archive/2007/03/08/2-update.aspx" mce_href="http://blogs.msdn.com/ito/archive/2007/03/08/2-update.aspx"&gt;この投稿&lt;/A&gt;が参考になると思います。もし、既に固定更新でゲームを作っている場合にはFPSカウンターを使う意味はあまりありません。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;GPUとCPUバランスに注意&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;また、CPUとGPUの負荷バランスが違う場合には、FPS値は参考になりません。例えば６０フレームのゲームを作っている時にFPS値が丁度６０フレームになっているからといって、必ずしもこれ以上の処理を追加できないと言うわけではありません。例えば、１フレームあたりの処理時間が、CPUが50%、GPUが100%近く消費している場合、CPU側にはまだ５０%の余力があるにも関わらずFPSの値は６０になるので、余力が無いように見えてしまいます。逆にCPU100%、GPU50%の状態でも同じです。&lt;/P&gt;
&lt;P&gt;CPU、GPUバランスを調べる簡単な方法は、GPUの負荷を測定するにはUpdate内では何も処理をせずにDrawだけ実行し、CPUの負荷を測定するには逆にDrawの処理をしないようにする方法があります。ただし、Draw内にもCPU部分の処理があるので、もっと正確にCPUの負荷を測定するにはDrawPrimitiveのメソッドのみをコメントアウトする必要があります。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;６０FPSにならないんだけど&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;IsFixedTimeStepとSynchronizeWithVerticalRetraceをtrueにした状態で、明らかにゲーム全体の処理が16.6ms以内で済んでいるのにも関わらず、FPSにはいつも59.xxしか表示されない。というのはおかしいと思う人もいるかもしれません。&lt;/P&gt;
&lt;P&gt;これには３つの理由があります。ひとつめはTVの60フレームというのは実際には&lt;STRONG&gt;59.94&lt;/STRONG&gt;(厳密に言えば60/ 100.1%)になるので、理論的に60と言う数値にはならないこと。ふたつめは、測定する場合に１フレーム以下の余りの時間分で誤差がでるということ。そして、ハードウェア的には59.94でフレームを更新していても、ソフトウェア的に測定ポイントまで戻ってくるまでの時間が微妙に変わってくるということです。&lt;/P&gt;
&lt;P&gt;ですから、59.xxと言う数値を見たときには約60FPSと考えても問題ありません。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;FpsCounterコンポーネントの使い方&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;FpsCounterコンポーネントはDebugManagerにあるフォントを使用するので、FpsCounterを追加する前にDebugManagerコンポーネントを追加する必要があります。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// デバッグマネージャーの初期化と追加
&lt;/SPAN&gt;debugManager = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;DebugManager&lt;/SPAN&gt;( &lt;SPAN style="COLOR: blue"&gt;this &lt;/SPAN&gt;);
Components.Add( debugManager );&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;また、必須ではありませんが、FpsCounterはインスタンス生成時にGame.Servicesに&lt;STRONG&gt;IDebugCommandHost&lt;/STRONG&gt;インターフェースが追加されていると、&lt;STRONG&gt;fps&lt;/STRONG&gt;デバッグコマンドを登録します。DeubgCommandUIはIDebugCommandHostインターフェースを実装しているので、このコンポーネントを追加した後にFpsCounterを追加することで&lt;STRONG&gt;fps&lt;/STRONG&gt;コマンドを使うことができます。&lt;/P&gt;
&lt;P&gt;デバッグコマンドUIをTabキーを押して表示させた後に、fpsとタイプするとFPSの表示/非表示の切り替え、"fps on"で表示、"fps off"で非表示にすることができます。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// デバッグマコマンドUIの初期化と追加
&lt;/SPAN&gt;debugCommandUI = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;DebugCommandUI&lt;/SPAN&gt;( &lt;SPAN style="COLOR: blue"&gt;this &lt;/SPAN&gt;);

&lt;SPAN style="COLOR: green"&gt;// デバッグコマンドUIを最上面に表示させる為にDrawOrderを変更する
&lt;/SPAN&gt;debugCommandUI.DrawOrder = 100;

Components.Add( debugCommandUI );&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;最後に、FpsCounterをComponentsに追加することでFPSが画面左上に表示されるようになります。ただし、DebugCommandUIが先に登録されていると、初期状態では表示されません。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: green"&gt;// FPSカウンターの初期化と追加
&lt;/SPAN&gt;fpsCounter = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;FpsCounter&lt;/SPAN&gt;( &lt;SPAN style="COLOR: blue"&gt;this &lt;/SPAN&gt;);
Components.Add( fpsCounter );&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;FpsCounterはDrawableGameComponentから派生しているので、プログラム上から表示/非表示をコントロールするにはVisibleプロパティを変更することでできます。&lt;/P&gt;&lt;PRE class=code&gt;fpsCounter.Visible = true&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;次回はリアルタイムプロファイラーであるTimerRulerコンポーネントを紹介します。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9254649" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.0/default.aspx">XNA 3.0</category><category domain="http://blogs.msdn.com/ito/archive/tags/_C730D030C330B030_/default.aspx">デバッグ</category></item><item><title>デバッグサンプル</title><link>http://blogs.msdn.com/ito/archive/2008/12/27/debug-components-sample.aspx</link><pubDate>Sun, 28 Dec 2008 01:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9254589</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/ito/comments/9254589.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9254589</wfw:commentRss><description>&lt;p&gt;2009/06/25 追記: XNA GS 3.1用のサンプルを &lt;a href="http://higeneko.net/hinikeni/sample/xna31/DebugSample.zip"&gt;http://higeneko.net/hinikeni/sample/xna31/DebugSample.zip&lt;/a&gt;にアップしました&lt;/p&gt;  &lt;p&gt;2009年1月24日追記: サンプルプログラムのキーボード処理部分でテンキーの０を押すと１が入力されるバグを修正、アップデートしました。バグがあった場所はGameDebug/KeyboardUtils.csファイル内のInitializeKeyMapメソッド内の初期化コード部分です。AddKeyMap( Keys.NumPad0, &lt;strong&gt;&amp;quot;10&amp;quot;&lt;/strong&gt; )となっているのをAddKeyMap( Keys.NumPad0, &lt;strong&gt;&amp;quot;0&amp;quot;&lt;/strong&gt; )にする事で修正できます。連絡してくださったDERNAさんに感謝します。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;デバッグ３種の神器&lt;/strong&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/cf5b7b830045_107B3/ScreenShot_2.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/cf5b7b830045_107B3/ScreenShot_2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="ScreenShot" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/cf5b7b830045_107B3/ScreenShot_thumb.png" width="644" height="377" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/cf5b7b830045_107B3/ScreenShot_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ゲーム開発現場で最も使われているゲーム内で動作するデバッグ用の機能といえば以下の３つがあります。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;FPSカウンター &lt;/li&gt;    &lt;li&gt;リアルタイムプロファイラー &lt;/li&gt;    &lt;li&gt;デバッグコマンド &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;市販されているPCゲームの中にはオプション画面でFPSカウンターを表示できるようになっているものもあるので、パフォーマンスの指標として有名です。後のふたつについては一般にはあまり知られていませんが、ゲーム開発現場、特に北米のゲーム開発現では良く目にする機能です。&lt;/p&gt;  &lt;p&gt;前回紹介したGamefest Japan 2008のデモでも、これらの機能を使っています。そこで、今回は前回のデモからデバッグ機能だけを抜き取ったサンプルを作りました。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a title="http://higeneko.net/hinikeni/sample/DebugSample.zip" href="http://higeneko.net/hinikeni/sample/DebugSample.zip" mce_href="http://higeneko.net/hinikeni/sample/DebugSample.zip"&gt;http://higeneko.net/hinikeni/sample/DebugSample.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;前回と同じく、フォントはConsolasを使用しています。Consolasフォントが無い場合はビルドエラーになるので、以下のURLからConsolasフォントをダウンロードするか、フォント名を変更するようにしてください。&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en" target="_blank"&gt;https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;使い方&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;サンプルを起動すると、画面右上に使い方が表示されます。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;FPSカウンターの表示      &lt;ul&gt;       &lt;li&gt;Aボタン、またはAキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;TimeRulerの表示      &lt;ul&gt;       &lt;li&gt;Bボタン、またはBキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;TimeRulerログ表示      &lt;ul&gt;       &lt;li&gt;Xボタン、またはXキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;デバッグコマンドUIの表示      &lt;ul&gt;       &lt;li&gt;Tabキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;サンプルプログラムの終了      &lt;ul&gt;       &lt;li&gt;Backボタン、またはEscapeキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;デバッグコマンドUIはキーボード入力からデバッグ用コマンドを実行します。Xbox 360でもUSBキーボードを本体に繋げることで使うことができます。デバッグコマンドUIには元々使えるコマンドとして画面をクリアする&lt;strong&gt;cls&lt;/strong&gt;コマンド、登録されているコマンドを表示する&lt;strong&gt;help&lt;/strong&gt;コマンドがあります。基本的にWindowsにあるコマンドシェルと使い方は一緒で、上下キーで最近使ったコマンドのヒストリを表示する機能もあります。&lt;/p&gt;  &lt;p&gt;このデモでは、DebugSampleGame.cs内には独自のデバッグコマンドを追加するサンプルコードが含まれていて、ここではposコマンドを追加して、画面上に表示される「+」マークの位置を表示したり、変更できるようになっています。下の動画では見づらいですが、最初は左上にあった白い点がposコマンドによって画面下中央に移動しているのが判ると思います。&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:c79abacc-8dc3-4f0f-8af4-e8a2169e60fa" class="wlWriterEditableSmartContent"&gt;&lt;div id="b3e62b64-f121-4bbc-91a8-52b600231039" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://video.msn.com/video.aspx?vid=7e592c00-c497-40b9-9b27-9d275b497d07&amp;amp;from=writer" target="_new"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/cf5b7b830045_107B3/videobdbb970d0f44.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('b3e62b64-f121-4bbc-91a8-52b600231039'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;embed src=\&amp;quot;http://images.video.msn.com/flash/soapbox1_1.swf\&amp;quot; quality=\&amp;quot;high\&amp;quot; width=\&amp;quot;340\&amp;quot; height=\&amp;quot;280\&amp;quot; wmode=\&amp;quot;transparent\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; pluginspage=\&amp;quot;http://macromedia.com/go/getflashplayer\&amp;quot; flashvars=\&amp;quot;c=v&amp;amp;v=7e592c00-c497-40b9-9b27-9d275b497d07&amp;amp;from=writer\&amp;quot; &amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&lt;strong&gt;サンプルに含まれるファイル&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;このサンプルに含まれるファイルには、デバッグ機能の使い方のサンプルコードが入ったDebugSampleGame.csファイルの他に、デバッグ機能を提供する以下の８つのファイルがあります。&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="712"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="336"&gt;DebugSample/GameDebug/DebugCommandUI.cs&lt;/td&gt;        &lt;td valign="top" width="373"&gt;デバッグコマンドUIクラス&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="336"&gt;DebugSample/GameDebug/DebugManager.cs&lt;/td&gt;        &lt;td valign="top" width="373"&gt;デバッグ用のコンテントを格納する為のゲームコンポーネント&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="336"&gt;DebugSample/GameDebug/FpsCounter.cs&lt;/td&gt;        &lt;td valign="top" width="373"&gt;FPSカウンター&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="336"&gt;DebugSample/GameDebug/IDebugCommandHost.cs&lt;/td&gt;        &lt;td valign="top" width="373"&gt;デバッグコマンド用のインターフェース&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="336"&gt;DebugSample/GameDebug/KeyboardUtils.cs&lt;/td&gt;        &lt;td valign="top" width="373"&gt;キーボード入力用ユーティリティクラス&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="336"&gt;DebugSample/GameDebug/TimeRuler.cs&lt;/td&gt;        &lt;td valign="top" width="373"&gt;タイムルーラー&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="336"&gt;DebugSample/Utils/Layout.cs&lt;/td&gt;        &lt;td valign="top" width="373"&gt;画面レイアウト用構造体&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="336"&gt;DebugSample/Utils/StringBuilderExtensions.cs&lt;/td&gt;        &lt;td valign="top" width="373"&gt;StringBuilder用拡張メソッド宣言クラス&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;自分のゲームにデバッグ機能を追加するには、上記の８つのファイルをプロジェクトに追加し、DebugManager、FpsCounter、TimeRuler、そしてDebugCommandUIコンポーネントをゲームのInitializeメソッド内で以下の様に追加する事で使用することができます。&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: green"&gt;// デバッグマネージャーの初期化と追加
&lt;/span&gt;debugManager = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DebugManager&lt;/span&gt;( &lt;span style="color: blue"&gt;this &lt;/span&gt;);
Components.Add( debugManager );

&lt;span style="color: green"&gt;// デバッグマコマンドUIの初期化と追加
&lt;/span&gt;debugCommandUI = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DebugCommandUI&lt;/span&gt;( &lt;span style="color: blue"&gt;this &lt;/span&gt;);

&lt;span style="color: green"&gt;// デバッグコマンドUIを最上面に表示させる為にDrawOrderを変更する
&lt;/span&gt;debugCommandUI.DrawOrder = 100;

Components.Add( debugCommandUI );

&lt;span style="color: green"&gt;// FPSカウンターの初期化と追加
&lt;/span&gt;fpsCounter = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FpsCounter&lt;/span&gt;( &lt;span style="color: blue"&gt;this &lt;/span&gt;);
Components.Add( fpsCounter );

&lt;span style="color: green"&gt;// タイムルーラーの初期化と追加
&lt;/span&gt;timerRuler = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TimeRuler&lt;/span&gt;( &lt;span style="color: blue"&gt;this &lt;/span&gt;);
Components.Add( timerRuler );&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;DebugManagerとDebugCommandUIは自分自身をサービスとして登録するので、この二つは他のデバッグ用コンポーネントの前に追加する必要があります。&lt;/p&gt;

&lt;p&gt;次回から、それぞれのデバッグコンポーネントの使い方に付いて説明していきます。&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9254589" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/_C730D030C330B030_/default.aspx">デバッグ</category></item><item><title>Gamefest Japan 2008 デモプログラム</title><link>http://blogs.msdn.com/ito/archive/2008/12/12/gamefest-japan-2008-demo.aspx</link><pubDate>Fri, 12 Dec 2008 15:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9201966</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/ito/comments/9201966.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9201966</wfw:commentRss><description>&lt;p&gt;2009/06/25 追記: XNA GS 3.1用のサンプルを &lt;a href="http://higeneko.net/hinikeni/sample/xna31/GamefestJapan2008Demo.zip"&gt;http://higeneko.net/hinikeni/sample/xna31/GamefestJapan2008Demo.zip&lt;/a&gt;にアップしました&lt;/p&gt;  &lt;p&gt;2008/12/26 追記: デモプログラムの更新、キーボード入力で操作できるようになりました。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;やっと終わりました&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;今年の９月に行われたGamefest Japan 2008のプレゼンテーション資料が先月公開されました。&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/ja-jp/xna/cc723908.aspx" href="http://msdn.microsoft.com/ja-jp/xna/cc723908.aspx" target="_blank" mce_href="http://msdn.microsoft.com/ja-jp/xna/cc723908.aspx"&gt;http://msdn.microsoft.com/ja-jp/xna/cc723908.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;私も僭越ながら２つのセッションを担当させて頂き、そのプレゼンテーション資料も公開されています。XNA Game Studioでのゲーム開発においてのパフォーマンス改善について戦略的手法と実践的な手法、主にシステムレベルでの最適化の効果の程を紹介させていただきました。&lt;/p&gt;  &lt;p&gt;&lt;a title="http://download.microsoft.com/download/0/4/2/04291420-033b-4f46-b87d-de64a2dc6bac/X5.zip" href="http://download.microsoft.com/download/0/4/2/04291420-033b-4f46-b87d-de64a2dc6bac/X5.zip" mce_href="http://download.microsoft.com/download/0/4/2/04291420-033b-4f46-b87d-de64a2dc6bac/X5.zip"&gt;http://download.microsoft.com/download/0/4/2/04291420-033b-4f46-b87d-de64a2dc6bac/X5.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;本当はプレゼン時にサンプルプログラムの配布したかったのですが、本業の方のXNA Framework作業の方が佳境の最中で、その合間に書いたコードだったので非常に汚いコードであったのと、先月のXNA Game Studio 3.0のリリースまでその忙しさが続いたので、なかなか公開することができませんでした。っていうか、コメントを追加するのは当然として、他にも3.0対応にしたり、再利用可能なコンポーネントを使いやすく書き換えたりして、発表時のコードよりも4,000行近く増えてしまったのも、今まで時間が掛かった原因でした。&lt;/p&gt;  &lt;p&gt;ともかく、なんとか人に見せられる程度の体裁は整えたので、デモプログラムを公開します。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://higeneko.net/hinikeni/sample/GamefestJapan2008Demo.zip" mce_href="http://higeneko.net/hinikeni/sample/GamefestJapan2008Demo.zip"&gt;http://higeneko.net/hinikeni/sample/GamefestJapan2008Demo.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;解凍したフォルダの中には以下の３つのソリューションファイルがあるので、好きなソリューションファイルを使ってください。いずれのプロジェクトを開くのにもXNA Game Studio 3.0が必要です。また、Windowsで実行するにはシェーダーモデル2.0以上のビデオカードが必須になります。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;DemoWin.sln      &lt;ul&gt;       &lt;li&gt;Windows用のソリューションファイル &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;DemoXbox.sln      &lt;ul&gt;       &lt;li&gt;Xbox 360用のソリューションファイル &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Demo.sln      &lt;ul&gt;       &lt;li&gt;Windows/Xbox 360の両方のプロジェクトが入ったソリューションファイル &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;フォントは私がプログラムする時に使っている等幅フォントのConsolasを使用しています。Consolasフォントが無い場合はビルドエラーになるので、以下のURLからConsolasフォントをダウンロードするか、フォント名を変更するようにしてください。&lt;/p&gt;  &lt;p&gt;&lt;a title="https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en" href="https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en" target="_blank" mce_href="https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en"&gt;https://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;このサンプルプロジェクトのコード、アセットは非商用、商用に関わらず、自由に使ってかまいません。ただし、一部のコードはクリエータークラブオンラインのMesh Instancingのコードを流用、または変更しているので、それらのコードのライセンスについては付属されるMicrosoft Permissive License.rtfに沿います。&lt;/p&gt;  &lt;p&gt;&lt;a title="http://creators.xna.com/en-US/sample/meshinstancing" href="http://creators.xna.com/en-US/sample/meshinstancing" target="_blank" mce_href="http://creators.xna.com/en-US/sample/meshinstancing"&gt;http://creators.xna.com/en-US/sample/meshinstancing&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;で、お約束ですが、このサンプルコードやアセットを使用したことで発生したいかなる問題にも当方は責任を負いません。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;デモの内容&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;デモを起動すると、おなじみのCornflowerBlueが表示されます。ここでコントローラーのスタートボタンで４種類のデモの切り替えをし、Aボタンで手法の切り替えをします。また、デモによっては左右のトリガで表示オブジェクト数の増減ができます。以下に紹介する測定結果は全てXbox 360上で測定したものです。パフォーマンス測定をする時にはビルド設定をリリースにし、デバッグにアタッチしていない状態(Ctrl+F5)で実行することを忘れないでください。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;操作方法&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;デモの切り替え      &lt;ul&gt;       &lt;li&gt;スタートボタン、またはEnterキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;手法の切り替え      &lt;ul&gt;       &lt;li&gt;Aボタン、またはスペースキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;オブジェクト数の増減      &lt;ul&gt;       &lt;li&gt;左右のトリガ、またはUp/Downキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;デモの終了      &lt;ul&gt;       &lt;li&gt;Backボタン、またはEscapeキー &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;配列デモ&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;.Netには様々な配列のタイプがあり、慣れていないとどれを使ったら良いのか悩むと思います。このデモでは、様々な配列を使って5,000個のスプライトの移動させるときに掛かる時間を測定しています。画面左下にある青いバーが更新時間に掛かった時間でログ表示中の&amp;quot;Update&amp;quot;です。&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-2_2.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-2_2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="itoxe-2" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-2_thumb.png" width="644" height="364" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-2_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;この配列デモの結果を見るとArrayListを使うのは避けるべきで、それ以外の手法による速度差は30~40%程度なので、後に続くデモの効果に比べると少ないものなので、用途に合わせて使いやすい配列を使いましょうということになります。&lt;/p&gt;  &lt;p&gt;このデモのソースコードは&lt;strong&gt;Demo/ArrayDemo&lt;/strong&gt;フォルダの中にあります。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;strong&gt;動的頂点バッファデモ&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;動的頂点バッファの扱いはXNA GSでは簡単になっているものの、CPUの書き込みとGPUの読み込みがどんなタイミングで衝突するのかを理解して正しく使わないと思わぬパフォーマンス低下の原因になります。また、2Dゲームのパフォーマンス問題として頂点変換をはじめとするシェーダーでするべき仕事もCPUでしてしまい、CPU速度の遅いXbox 360では速度が出ないという問題があります。&lt;/p&gt;  &lt;p&gt;このデモでは、動的頂点バッファの使い方と、シェーダーを使った場合の効果を紹介しています。スケール、回転といった基本的なパラメーターを持ったパーティクルを3,000個描画したときに掛かる時間を測定しています。&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-3_2.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-3_2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="itoxe-3" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-3_thumb.png" width="644" height="364" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-3_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;CPUで頂点変換処理をした時に比べて、単純なシェーダー処理をするだけで8.5倍、vfetchを活用すると30倍、更にDirectMappingを使うと142倍という桁違いな速度アップになります。ただし、比較対象のCPUで頂点変換するコードは全く最適化されていないので、実際にはそこまで大きな数字は出なくとも0.09ミリ秒で3,000個のパーティクルの描画命令を発行できるというのは大きいと思います。&lt;/p&gt;  &lt;p&gt;世の中ではマルチコア、マルチスレッドが騒がれているので、どうしてもマルチスレッドプログラミングに手を出したくなってしまいますが、Xbox 360上でXNA GSが使えるHWスレッド数は４つまでなので、どんなにうまくプログラムしたとしても元の４倍以下の速度にしかならないことを考えるとシェーダーの活用がいかに効果的な手法なのかが判ると思います。&lt;/p&gt;  &lt;p&gt;このデモのソースコードは&lt;strong&gt;Demo/GameVertex&lt;/strong&gt;フォルダの中にあり、シェーダーコードは&lt;strong&gt;Demo/Content/GameVertex&lt;/strong&gt;の中にあります。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;インスタンスモデルデモ&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Xbox 360上で数万ポリゴンのモデルが数十個描画できるなら、数百ポリゴンのモデルを数千個描画できるはずと思って試してみると、数百個も描画すると処理落ちしてしまうという問題を何度か聞いたことがあります。これは、XNA GSというより、Direct X、というよりも昨今のGPUで共通の問題で、この問題を解決する為の手法がインスタンス(Instancing)です。Xbox 360はもちろん、Windowsでも非常に効果的な手法の一つです。&lt;/p&gt;  &lt;p&gt;インスタンスモデルのサンプルはクリエータークラブオンラインにもありますが、このデモではWindowsで使えるHWインスタンスをXbox 360でvfetchを使って実装していて、InstancedModelクラスを介してWindowsとXbox 360の両方で全く同じゲームコードを記述することができるようになっています。ただし、シェーダーコードのフェッチ部分はXbox 360用のコードが必要になりますが、フェッチ部分のみなので他のシェーダー処理部分は共通で使えます。&lt;/p&gt;  &lt;p&gt;このデモでは、３つのスペキュラ付き平行光源処理をした、12ポリゴン、24頂点のモデルを500個描画したときの時間を測定しています。&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-4_2.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-4_2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="itoxe-4" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-4_thumb.png" width="644" height="364" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-4_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;最適化されていない状態とHWインスタンスを使った場合で50倍、DirectMappingを使うと115倍の速度になっています。このデモでは3万６千個のボックスを描画した時点で60fpsを切りますが、これはボックスを移動する更新部分がネックになりGPUにはまだ余裕があります。そこで、試しに1,245ポリゴンのモデルを表示してみたのですが、その場合は最大3,440個のモデルが表示できました。これは１フレームあたり428万ポリゴン、秒間で２億5千万ポリゴンを描画できることになります。&lt;/p&gt;  &lt;p&gt;このデモのソースコードは&lt;strong&gt;Demo/GameModel&lt;/strong&gt;フォルダの中にあり、インスタンスモデルクラスの実装はDemoTypesフォルダの中にあり、シェーダーコードは&lt;strong&gt;Demo/Content/GameModel&lt;/strong&gt;の中にあります。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;インスタンスモデルアニメーションデモ&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;シェーダーモデル 3.0の機能として浮動小数点テクスチャと頂点シェーダーからテクスチャを読み込む頂点テクスチャがあります。このデモでは、アニメーションデータを浮動小数点テクスチャに格納し、アニメーション処理をCPUではなくGPUでしています。CPU側の処理としてはオブジェクトの移動と、アニメーションフレームの更新です。それぞれのオブジェクトのアニメーションスピードはランダムです。&lt;/p&gt;  &lt;p&gt;このデモでは、３つのスペキュラ付き平行光源処理をした、84ポリゴン、186頂点のモデルを500個描画したときの時間を測定しています。&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-6_2.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-6_2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="itoxe-6" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-6_thumb.png" width="644" height="364" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/GamefestJapan2008Demo_3C3A/itoxe-6_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Xbox 360上では大体16,000個のオブジェクトを描画することができます。&lt;/p&gt;  &lt;p&gt;ソースコードは&lt;strong&gt;Demo/GameAnime&lt;/strong&gt;フォルダの中にあり、シェーダーコードは&lt;strong&gt;Demo/Content/GameAnime&lt;/strong&gt;の中にあります。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;他にも役に立ちそうなもの&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;４種類のデモの紹介をしましたが、このデモコードの中には他にも役立ちそうなものがあります。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;TimeRuler (Demo/GameDebug/TimeRuler.cs) &lt;/li&gt;    &lt;li&gt;Fpsカウンター (Demo/GameDebug/FpsCounter.cs) &lt;/li&gt;    &lt;li&gt;デバッグコマンド (Demo/GameDebug/DebugCommandUI.cs) &lt;/li&gt;    &lt;li&gt;Layout (Demo/Utils/Layout.cs) &lt;/li&gt;    &lt;li&gt;StringBuilder拡張メソッド (Demo/Utils/StringBuilderExtensions.cs) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;これらについては追々紹介していきます。&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9201966" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B330F330C630F330C830FB30D130A430D730E930A430F330_/default.aspx">コンテント・パイプライン</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B030E930D530A330AF30B930_/default.aspx">グラフィクス</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B730A730FC30C030FC30E230C730EB30_+3.0/default.aspx">シェーダーモデル 3.0</category></item><item><title>招待サンプル</title><link>http://blogs.msdn.com/ito/archive/2008/11/25/invites-sample.aspx</link><pubDate>Wed, 26 Nov 2008 04:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9143077</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/9143077.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9143077</wfw:commentRss><description>&lt;P&gt;今日は&lt;A target=_blank href="http://creators.xna.com/en-US/sample/invites" mce_href="http://creators.xna.com/en-US/sample/invites"&gt;招待サンプル&lt;/A&gt;を紹介します。&lt;/P&gt;
&lt;P&gt;Xbox Live!の機能のひとつに、フレンドリスト内の友達と一緒にネットワークゲームをプレイしたいときに誘える招待機能があります。XNA GS 3.0ではこの招待機能がサポートされています。招待するケースとしては以下の二つのケースがあります。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;同じゲームをプレイしている時(In-Title Invites)&lt;/LI&gt;
&lt;LI&gt;違うゲームをプレイしている時(Cross-Title Invites)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;XNA GS 3.0上では、このどちらのケースでも&lt;STRONG&gt;NetworkSession.InviteAccepted&lt;/STRONG&gt;イベントが発生します。このイベントを受け取った時に、&lt;STRONG&gt;NetworkSession.JoinInvite&lt;/STRONG&gt;メソッドを呼ぶことで招待された側が招待した側のセッションに接続できるようになっています。以下はイベントハンドラへの登録と、ハンドラ内での処理の例です。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: #2b91af"&gt;NetworkSession&lt;/SPAN&gt;.InviteAccepted += InviteAcceptedEventHandler;&lt;BR&gt;&lt;/PRE&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;void &lt;/SPAN&gt;InviteAcceptedEventHandler(&lt;SPAN style="COLOR: blue"&gt;object &lt;/SPAN&gt;sender, &lt;SPAN style="COLOR: #2b91af"&gt;InviteAcceptedEventArgs &lt;/SPAN&gt;e)
{
    &lt;SPAN style="COLOR: green"&gt;// 現在のセッションから抜ける
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if &lt;/SPAN&gt;(networkSession != &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;)
    {
        networkSession.Dispose();
        networkSession = &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;;
    }

    &lt;SPAN style="COLOR: green"&gt;// 招待されたセッションに入る
    &lt;/SPAN&gt;networkSession = &lt;SPAN style="COLOR: #2b91af"&gt;NetworkSession&lt;/SPAN&gt;.JoinInvited(maxLocalGamers);
}&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;同じゲームをプレイしている場合は、通常のNetworkSessionの振る舞いと殆ど同じですが、違うゲームをプレイしている場合は振る舞いの仕方が変わってきます。ただし、これらの処理は全てOS側で行われるのでゲーム開発者は前述のInviteAcceptedイベントの実装をするだけです。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Xbox 360上で同じゲームが既にインストールしている場合は自動的にゲームが起動され、その直後にInviteAcceptedイベントが発生します。&lt;/LI&gt;
&lt;LI&gt;クリエーターゲーム(開発中のゲームやピアレビュー中のゲーム)の場合は、招待した人が同じゲームを持っていない場合に、その旨を伝えるメッセージが表示されます。&lt;/LI&gt;
&lt;LI&gt;コミュニティゲームの場合、ユーザーがそのゲームを持っていない場合はマーケットプレースに自動的に移動、該当するゲームをダウンロードするかのメニューが表示され、ダウンロード後に自動的にゲームが起動されます。&lt;/LI&gt;
&lt;LI&gt;Windows上の場合、上記のように自動的なダウンロードや起動するといった機能がないので、ユーザーが手動で行う必要があります。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;テスト時の注意&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;招待機能はXbox Live!の機能なので、ネットワークゲームのテストの様にシステムリンク(ローカル)を使ってテストできるのと違い、クリエータークラブ会員になっているゲーマータグが二つ必要なことに注意してください。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9143077" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/_CD30C330C830EF30FC30AF30_/default.aspx">ネットワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.0/default.aspx">XNA 3.0</category></item><item><title>セーフエリア・サンプル </title><link>http://blogs.msdn.com/ito/archive/2008/11/21/safearea-sample.aspx</link><pubDate>Sat, 22 Nov 2008 06:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9132551</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/9132551.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9132551</wfw:commentRss><description>&lt;P&gt;今回は&lt;A target=_blank href="http://creators.xna.com/en-US/sample/safearea" mce_href="http://creators.xna.com/en-US/sample/safearea"&gt;セーフエリア サンプル(Safe Area)&lt;/A&gt;の紹介をします。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;世の中には様々なTVがある&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ゲームをプレイする人達のTV環境は実に様々なものがあります。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;オーバースキャンとアンダースキャン&lt;/LI&gt;
&lt;LI&gt;HDTVとSDTV&lt;/LI&gt;
&lt;LI&gt;ワイドスクリーンと4:3&lt;/LI&gt;
&lt;LI&gt;コンポーネント接続とコンポジット接続&lt;/LI&gt;
&lt;LI&gt;60cm(2フィート)と3m(10フィート)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;オーバースキャンとセーフエリア&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;PCモニタなどのイメージ全体を表示するアンダースキャン方式に対して、HDTV、SDTVのどちらも、その多くがイメージ全体を表示することのできないオーバースキャン方式を採用しています。&lt;/P&gt;
&lt;P&gt;イメージ全体を表示することができないので、ゲームでスクリーン座標の左上(0, 0)に文字を表示したりするとオーバースキャン方式のディスプレイでは文字が読めなくなってしまいます。&lt;/P&gt;
&lt;P&gt;こういったオーバースキャン方式のディスプレイには以下の二つのタイプのセーフエリアがあります。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;タイトルセーフエリア(80%の領域)&lt;/LI&gt;
&lt;LI&gt;アクションセーフエリア(90%の領域)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;タイトルセーフエリアには文字などの大事な情報を表示する領域で、下図の青い色の領域になります。アクションセーフエリアは殆どのディスプレイで表示される領域です数では緑色の枠内の領域になります。そして、赤い部分はディスプレイによっては全く表示されない領域です。&lt;/P&gt;
&lt;P&gt;この画像は1280x720の画像なので、ゲームのインターフェースのデザインなどをするときにガイドラインとして使えるようになっています。&lt;/P&gt;
&lt;P align=center&gt;&lt;STRONG&gt;&lt;A target=_blank href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/safearea_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/safearea_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=safearea src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/safearea_thumb.png" width=244 height=139 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/safearea_thumb.png"&gt;&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;さて、タイトルセーフエリアに大事な情報を表示するからといって、Xbox 360、PCの両方で文字列をタイトルセーフエリアに描画した場合、Xbox 360上での見た目は良いとしても、PC上だと無駄にまわりのスペースが空いてしまいます。&lt;/P&gt;
&lt;P&gt;そこで、XNA GS 3.0から追加された&lt;STRONG&gt;Viewport.TitleSafeArea&lt;/STRONG&gt;プロパティを使います。このプロパティPC上では元のビューポートのサイズと一緒になりますが、Xbox 360上ではビューポートの80%の領域、つまりタイトルセーフエリアを返します。&lt;/P&gt;
&lt;P&gt;Safe Areaサンプル内にある&lt;STRONG&gt;AlignedSpriteBatch&lt;/STRONG&gt;クラスでは文字列をタイトルセーフエリアの右端、左上といった位置情報を指定して描画できるようになっています。&lt;/P&gt;
&lt;P&gt;また、&lt;STRONG&gt;SafeAreaOverlay&lt;/STRONG&gt;はコンポーネントになっていて、Xbox 360、デバッグの設定の時のみにタイトルセーフエリアの外側の領域を赤く表示するようになっています。&lt;/P&gt;
&lt;P&gt;実際のゲーム開発の場合に気をつける事としては、&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;3Dゲームの場合、操作するキャラクターが画面中央に描画しているかぎりはセーフエリアを気にすることがありません。&lt;/LI&gt;
&lt;LI&gt;スクロールタイプの2Dゲームの場合、メインキャラクターはタイトルセーフエリア内に表示するようにします。サンプルでは猫を移動することで画面をスクロールするようになっていますが、猫は常にタイトルセーフエリア内にいます。&lt;/LI&gt;
&lt;LI&gt;通常は全ての画面全体を描画するべきですが、シューティングゲームのようなものだと、あらかじめアクションセーフエリア外の部分を黒く表示して自機の移動範囲を判りやすくするという方法もあります。&lt;/LI&gt;
&lt;LI&gt;インターフェースの全てをタイトルセーフエリアに納める必要はない。下図はRoboGameをXbox 360上で実行したときの画面にセーフエリアを重ねた画像です。ゲームプレイにとって大事なプレイヤーのHPや武器の残弾数などの表示はタイトルセーフエリアに表示されていますが、ゲームプレイに支障のないインターフェースのデザイン的な部分はアクションセーフエリアに表示されています。&lt;/LI&gt;&lt;/UL&gt;
&lt;P align=center&gt;&lt;A target=_blank href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/safearea-sample_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/safearea-sample_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=safearea-sample src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/safearea-sample_thumb.png" width=644 height=364 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/safearea-sample_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;解像度とアスペクト比&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;TVモニタの場合は標準解像度の640x480から、1080pの1980x1080まで様々な種類があり、またアスペクト比も16:9と4:3の二種類があります。&lt;/P&gt;
&lt;P&gt;Xbox 360向けのゲームで様々な解像度とアスペクト比に対応するもっとも簡単な方法は720p、つまり1280x720を使うことです。Xbox 360には1/4～4倍の解像度にスケーリングしてくれるハードウェアがあるので、720pを設定するとどの解像度でも自動的にスケーリングしてくれます。また、720pのアスペクト比は16:9ですが、4:3のTVを使った場合にはTV上では以下のようにレターボックス表示になります。&lt;/P&gt;
&lt;P align=center&gt;&lt;A target=_blank href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/4x3_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/4x3_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=4x3 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/4x3_thumb.png" width=244 height=184 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/safeareasample_115D5/4x3_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;モニタとの距離&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ゲーム開発中、PCモニタとの距離は60センチ程度ですが、実際にリビングルームでゲームをする場合は3メートル程の距離があります。と、米国では言ってますが日本の住宅事情を考えると、もうちょっと短い距離になりそうですが、要点としては自室でPCモニタを見ている感覚でゲームを作ってしまうと、リビングルームでプレイする時に文字が小さくて読めないという問題が発生します。目安としては720pの解像度で20ポイント以上の大きさの文字列をつかうことです。&lt;/P&gt;
&lt;P&gt;TVとの距離の他にも&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;細い線を描画しない、特に水平線を書いた場合にインターレース方式のTVではちらつきが発生します。&lt;/LI&gt;
&lt;LI&gt;明るい赤い文字を使用しない。NTSCの場合、にじみの原因になります。&lt;/LI&gt;
&lt;LI&gt;大事な情報は色だけでなく、サイズや形を変えたり、アニメーションするようにする。これは赤と緑の色の区別がつきにくいという色覚障害が日本人では男性の20人に１人、女性は500人に１人という低くない割合でいるので、こういった配慮をすることでより多くの人達が快適に遊べるようになります。パズルゲームで色を合わせるといった場合は、色だけでなく模様や形状を変えると良いでしょう。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;レイアウトに注意&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;3Dゲームのシーンを描画する時には気にする必要はあまりありませんが、メニュー画面などをデザインする時にはセーフエリアを意識してデザインする必要があります。特に、パズルゲームやテーブルゲームなどの固定画面型の2Dゲームの場合にはレイアウトがそのままゲームプレイに影響するので、画面一杯使ってレイアウトした結果、TV上ではゲームをプレイするのが不可能になってしまったなんて事にならないよう注意しましょう。&lt;/P&gt;
&lt;P&gt;元ネタ:Safe Areaに含まれるドキュメントファイルから&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9132551" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+_D530EC30FC30E030EF30FC30AF30_/default.aspx">XNA フレームワーク</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B030E930D530A330AF30B930_/default.aspx">グラフィクス</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.0/default.aspx">XNA 3.0</category></item><item><title>ローカライゼーション・サンプル</title><link>http://blogs.msdn.com/ito/archive/2008/11/17/localization-sample.aspx</link><pubDate>Mon, 17 Nov 2008 13:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9109153</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/9109153.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9109153</wfw:commentRss><description>&lt;P&gt;Creators Club Onlineに以下の３つの新しいサンプルが追加されました。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;A target=_blank href="http://creators.xna.com/en-US/sample/localization" mce_href="http://creators.xna.com/en-US/sample/localization"&gt;ローカライゼーション サンプル(Localization)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A target=_blank href="http://creators.xna.com/en-US/sample/safearea" mce_href="http://creators.xna.com/en-US/sample/safearea"&gt;セーフエリア サンプル(Safe Area)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A target=_blank href="http://creators.xna.com/en-US/sample/invites" mce_href="http://creators.xna.com/en-US/sample/invites"&gt;招待 サンプル(Invites)&lt;/A&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;一気に紹介すると長くなるので、三回に分けてそれぞれのサンプルを紹介していきます。今回はローカライゼーション サンプルについて紹介します。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;ローカライゼーション&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;コミュニティゲームでゲームを投稿する場合、配信地域を選ぶことができます。現状ではアメリカ、カナダ、イギリス、フランス、イタリア、そしてスペインの６カ国で、2009年の前半には日本が加わり７カ国になります。世界の複数の国々の人達に自分の作ったゲームを楽しんで貰うためには必要な作業としてローカライズがあります。そこで、このサンプルではローカライズされた文字列とアセットの使い方のコードが含まれています。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;ローカライズされた文字列表示&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;このサンプルでは言語別のリソースファイル(.resxファイル)を用意し、ゲームクラスコンストラクタの中で実行環境の言語情報を以下のコードのように指定して文字列を変更しています。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Strings&lt;/SPAN&gt;.Culture = &lt;SPAN style="COLOR: #2b91af"&gt;CultureInfo&lt;/SPAN&gt;.CurrentCulture;&lt;BR&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;SpriteFontDescriptionクラスから派生したLocalizedFontDescriptionクラスに複数のリソースファイルを指定できるようになっていて、ここに各言語の文字列が入ったリソースファイルを指定し、コンテント･パイプライン内でLocalizedFontProcessorによって変換されます。&lt;/P&gt;
&lt;P&gt;言語別のリソースファイルは、&lt;STRONG&gt;リソース名.言語コード.resx&lt;/STRONG&gt;のようになっています。このサンプルではリソース名がStringsになっていて日本語のリソースファイル名は&lt;STRONG&gt;Strings.ja.resx&lt;/STRONG&gt;となっています。この言語コードは&lt;A target=_blank href="http://ja.wikipedia.org/wiki/ISO_639" mce_href="http://ja.wikipedia.org/wiki/ISO_639"&gt;ISO 639-1&lt;/A&gt;で定義されているアルファベット２文字になっています。&lt;/P&gt;
&lt;P&gt;殆どの場合は言語コードを指定するだけで済むのですが、言語コードだけでは足りなくなる場合もあります。例えば、同じ英語でもアメリカの場合はcolorでもイギリスの場合はcolourと違いがあります。その場合は言語コードと国名コードの組み合わせを使います。国名コードは&lt;A target=_blank href="http://ja.wikipedia.org/wiki/ISO_3166-1" mce_href="http://ja.wikipedia.org/wiki/ISO_3166-1"&gt;ISO 3166-1&lt;/A&gt;で定義されているアルファベット２文字を使います。アメリカの英語の場合は&lt;STRONG&gt;en-US&lt;/STRONG&gt;、イギリスの英語の場合は&lt;STRONG&gt;en-GB&lt;/STRONG&gt;となります。&lt;/P&gt;
&lt;P&gt;この&lt;STRONG&gt;言語コード-国名コード&lt;/STRONG&gt;の組み合わせをカルチャ名と呼び、カルチャを表すCultureInfoクラスを生成する時に以下のコードのようにして使用します。&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Strings&lt;/SPAN&gt;.Culture = &lt;SPAN style="COLOR: blue"&gt;new &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;CultureInfo&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #a31515"&gt;"en-GB"&lt;/SPAN&gt;);&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;ローカライズされたアセット読み込み&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ローカライズ作業の大半は文章の翻訳になりますが、中にはテクスチャ等のアセット自体をローカライズしたい時があります。このサンプルでは読み込むアセット名を前述のリソースファイル名と同じように、&lt;STRONG&gt;アセット名.カルチャ名&lt;/STRONG&gt;の組み合わせであることを前提として使うGetLocalizedAssetNameメソッドがゲームクラスに宣言されていて、国別の国旗テクスチャを変更しています。&lt;/P&gt;
&lt;P&gt;以下はコミュニティゲームがサポートする国と言語の表です。&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=441&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=71&gt;国名&lt;/TD&gt;
&lt;TD vAlign=top width=109&gt;公用語&lt;/TD&gt;
&lt;TD vAlign=top width=78&gt;言語コード&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;国名コード&lt;/TD&gt;
&lt;TD vAlign=top width=100&gt;カルチャ名&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=71&gt;アメリカ&lt;/TD&gt;
&lt;TD vAlign=top width=108&gt;英語&lt;/TD&gt;
&lt;TD vAlign=top width=79&gt;en&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;US&lt;/TD&gt;
&lt;TD vAlign=top width=99&gt;en-US&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=71&gt;カナダ&lt;/TD&gt;
&lt;TD vAlign=top width=108&gt;英語、フランス語&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;en,fr&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;CA&lt;/TD&gt;
&lt;TD vAlign=top width=99&gt;en-CA,fr-CA&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=71&gt;イギリス&lt;/TD&gt;
&lt;TD vAlign=top width=108&gt;英語&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;en&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;GB&lt;/TD&gt;
&lt;TD vAlign=top width=99&gt;en-GB&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=71&gt;フランス&lt;/TD&gt;
&lt;TD vAlign=top width=108&gt;フランス語&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;fr&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;FR&lt;/TD&gt;
&lt;TD vAlign=top width=99&gt;fr-FR&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=71&gt;イタリア&lt;/TD&gt;
&lt;TD vAlign=top width=108&gt;イタリア語&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;it&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;IT&lt;/TD&gt;
&lt;TD vAlign=top width=99&gt;it-IT&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=71&gt;スペイン&lt;/TD&gt;
&lt;TD vAlign=top width=108&gt;スペイン語&lt;/TD&gt;
&lt;TD vAlign=top width=81&gt;es&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;ES&lt;/TD&gt;
&lt;TD vAlign=top width=99&gt;es-ES&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=71&gt;日本&lt;/TD&gt;
&lt;TD vAlign=top width=108&gt;日本語&lt;/TD&gt;
&lt;TD vAlign=top width=82&gt;ja&lt;/TD&gt;
&lt;TD vAlign=top width=80&gt;JP&lt;/TD&gt;
&lt;TD vAlign=top width=99&gt;ja-JP&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;特徴として、カナダでは公用語が英語とフランス語の２つの言語が使われていることです。&lt;/P&gt;
&lt;P&gt;このサンプルは複数の言語へのローカライズの参考にもなりますが、リソースファイルを使った日本語表示の方法としても参考になるサンプルだと思います。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9109153" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_397DCB4E_/default.aspx">紹介</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.msdn.com/ito/archive/tags/Xbox360/default.aspx">Xbox360</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.0/default.aspx">XNA 3.0</category><category domain="http://blogs.msdn.com/ito/archive/tags/Windows/default.aspx">Windows</category></item><item><title>PIXを活用する　その２</title><link>http://blogs.msdn.com/ito/archive/2008/11/06/pix-02.aspx</link><pubDate>Fri, 07 Nov 2008 07:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9051448</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/9051448.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9051448</wfw:commentRss><description>&lt;P&gt;&lt;A target=_blank href="http://blogs.msdn.com/ito/archive/2008/10/29/pix-01.aspx" mce_href="http://blogs.msdn.com/ito/archive/2008/10/29/pix-01.aspx"&gt;前回に続いて&lt;/A&gt;PIXの機能と、私が実際にどんな状況でPIXを使って来たかを交えて紹介します。&lt;/P&gt;
&lt;P&gt;ちなみにPIXはピクスと呼びます。たまにピックスと呼ぶ人もいますが私のまわりではピクスが多いです。&lt;/P&gt;
&lt;P&gt;RenderウィンドウからDebug This Pixelメニューを使って表示されるDebuggerタブで、前回はDebug VertexやDebug Pixelをクリックしてのシェーダーのデバッグを紹介しましたが、今回はEvent部分をクリックして表示される情報について説明します。&lt;/P&gt;
&lt;P align=center&gt;&lt;A target=_blank href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix15_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix15_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=pix15 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix15_thumb.png" width=644 height=189 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix15_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Debuggerタブ内のそれぞれのピクセル情報の上の部分には、そのピクセルを描画したイベントが表示されます。上の場合は&lt;STRONG&gt;DrawIndexedPrimitive&lt;/STRONG&gt;となっています。ここをクリックすると、左下にあるイベントウィンドウ内で該当するイベントが選択されます。&lt;/P&gt;
&lt;P align=center&gt;&lt;A target=_blank href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix13_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix13_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=pix13 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix13_thumb.png" width=644 height=103 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix13_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;STRONG&gt;描画順序のチェック&lt;/STRONG&gt;&lt;/P&gt;
&lt;P align=left&gt;PIXは描画に関する全てのイベントとその情報を記憶しているので、好きなイベントを選択することで描画の課程を調べることができます。これはVisual Studio上でブレークポイントを設定するといった未来時間一方向へのデバッグに対して、PIXではキャプチャーしたフレーム内での時間を自由に移動できるデバッグをすることができます。&lt;/P&gt;
&lt;P align=left&gt;イベントを選択した状態でRenderタブを選択すると、選択されたイベント処理が終わった直後の描画結果、つまりフレーム描画の途中結果を見ることができます。 &lt;/P&gt;
&lt;P align=left&gt;不透明のオブジェクトを描画する場合、手前から奥にむけて順に描いていくのが効果的なのですが、普通にゲームをプレイしている限りでは描画順序は判らないし、描画コードを追いかけるのにも負担が掛かります。PIXを使うとそういった描画順序をここで簡単に確認できます。例えば、おっさんを描いている途中のこの段階で、遠景によく使われるスカイドームのオブジェクトが既に描画されている場合は、最後に書くべきスカイドームが先に描画されているという問題を発見することができます。&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix16_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix16_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=pix16 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix16_thumb.png" width=644 height=444 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix16_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;STRONG&gt;Meshデータの表示&lt;/STRONG&gt;&lt;/P&gt;
&lt;P align=left&gt;Draw系のイベントを選択した時、&lt;STRONG&gt;Meshタブ&lt;/STRONG&gt;にはその描画がどの様に行われたかの詳細な情報が表示されます。Meshタブの上の方には三つのワイヤーフレーム画面が表示され、左から順に以下のようになっています。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;Pre-Vertex Shader&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;Post-Vertex Shader&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;Viewport&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P align=center&gt;&lt;A target=_blank href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix08_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix08_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=pix08 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix08_thumb.png" width=644 height=414 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix08_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P align=left&gt;Pre-Vertex Shader画面には頂点シェーダーに送られる頂点、通常はローカル座標のモデルが表示されます。Post-Vertex Shader画面には頂点シェーダー処理後、つまり射影座標内でのモデルが表示されます。そして最後は透視変換後のビューポート座標でのモデルが表示されるViewport画面となっています。&lt;/P&gt;
&lt;P align=left&gt;そして、それら三つの画面の下には頂点シェーダーに入力頂点のリストを表示する&lt;STRONG&gt;PreVS&lt;/STRONG&gt;タブと、頂点シェーダー処理後の頂点リストを表示する&lt;STRONG&gt;PostVSタブ&lt;/STRONG&gt;があります。&lt;/P&gt;
&lt;P align=left&gt;頂点シェーダーを書いている場合に良くあるのが頂点変換ミスです。この場合、画面に変な形のモデルが表示されている場合は頂点シェーダーに問題があるというのはすぐに判るのですが、画面に何も表示されない場合は頂点変換ミスの他にもピクセルシェーダー内でのミスという場合もあるので、Viewport画面にちゃんと表示されているかを確認することで、頂点シェーダー、ピクセルシェーダーのどちらに問題があるかを絞り込む事ができます。&lt;/P&gt;
&lt;P&gt;頂点リスト内の頂点はクリックして選択することができ、選択された頂点は下図の様にモデル表示画面内と頂点リスト内で黄色で表示されます。また、頂点リスト内では選択された頂点が属する三角形の他の頂点が赤色で表示されます。&lt;/P&gt;
&lt;P align=center&gt;&lt;A target=_blank href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix14_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix14_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=pix09 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix09_3.png" width=514 height=357 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix09_3.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Deviceのステートの表示&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Meshタブ内で頂点シェーダーが正しく動作しているのを確認したけど、まだモデルが表示されない。そんな時に調べるのがDeviceステートです。この情報はEventsウィンドウに表示されているイベントの左側にある数字(下図の黄色い部分)をダブルクリックすることで表示されます。&lt;/P&gt;
&lt;P align=center&gt;&lt;A target=_blank href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix13_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix13_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=pix13 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix13_thumb.png" width=644 height=103 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix13_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P align=left&gt;Detailsウィンドウには新たに&lt;STRONG&gt;Deviceタブ&lt;/STRONG&gt;が追加表示されます。このDeviceタブの中には更に複数のタブが追加されます。それぞれのタブにはカテゴリ別のDeviceのステート情報が記載されています。&lt;/P&gt;
&lt;P align=center&gt;&lt;A target=_blank href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix14_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix14_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=pix14 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix14_thumb.png" width=644 height=412 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix14_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;私がここでよく使うのは&lt;STRONG&gt;Pixel Stateタブ&lt;/STRONG&gt;と&lt;STRONG&gt;Output State&lt;/STRONG&gt;タブです。Pixel Stateタブ内ではCullingやViewport、そしてAlphaテストなどの情報が役に立ちます。特にCullingが逆になっているとモデルがちゃんと表示されないし、Alphaテストに間違った値を設定しているとモデルが全く表示されないということもあります。また、Samplersセクションでは、どんなテクスチャが設定されているかを調べることができます。このSamplers部分で設定されているテクスチャの数字をダブルクリックすると、以下の様に設定されているテクスチャの詳細を見ることができます。&lt;/P&gt;
&lt;P align=center&gt;&lt;A target=_blank href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix17_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix17_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=pix17 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix17_thumb.png" width=644 height=476 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX02_11991/pix17_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;グロスマッピング、ディテールテクスチャといった、描画結果への反映が少ないようなテクスチャや、テクスチャに色以外の情報を入れている場合はここで調べたりしています。&lt;/P&gt;
&lt;P&gt;Output Stateタブ内ではデプステストの有無、ブレンディングステートを調べるのに使っています。特にアルファブレンドを使っている場合の見た目では判りづらいステートの違いはここで調べています。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;PIXを活用しよう&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;急ぎ足でしたが、二回に渡ってPIXの機能を紹介しました。2Dゲームと違って3Dの場合は実に様々なステートがあり、2Dゲームの場合はトライ＆エラーでどうにかなった問題も3Dゲームの場合はトライ＆エラーをするには時間が掛かりすぎてしまいます。そういった問題を解決するのにPIXは非常に強力なツールです。シェーダーのサンプルは沢山ありますが、シェーダーサンプル単体では問題なく動いたのにゲームに組み込んでみたら、動かなくなったなんて話を良く聞きます。そんな時にもPIXを使うと、なぜ動かないのかを調べることができます。&lt;/P&gt;
&lt;P&gt;また、Xbox 360向けに開発している場合でも、開発しているPCにShader Model 3.0のビデオカードがあれば、Windows用のプロジェクトに変換して実行できるようにしておけば、殆どの場合は描画に関するデバッグは問題なくできます。そのままデバッグできない例としてはXbox 360限定のvfetchを使った場合ですが、vfetchはあくまで頂点データのフェッチ用の命令なので、シェーダー全体のコード量に比べると非常に小さく、頂点データをフェッチした後のシェーダーはWindows上でもデバッグできます。&lt;/P&gt;
&lt;P&gt;私は、初代Xboxの頃からPIXを使って７年くらい経ちますが、今では描画に問題があったらすぐにPIXを立ち上げて調査するというのが習慣化していて、私にとってPIXはゲーム開発に必須のツールとなっています。&lt;/P&gt;
&lt;P&gt;綺麗な絵を出すシェーダープログラミングに比べると地味なものですが、これを機にPIXに触れてもらえば幸いです。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9051448" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B030E930D530A330AF30B930_/default.aspx">グラフィクス</category><category domain="http://blogs.msdn.com/ito/archive/tags/Windows/default.aspx">Windows</category></item><item><title>PIXを活用する　その１</title><link>http://blogs.msdn.com/ito/archive/2008/10/29/pix-01.aspx</link><pubDate>Thu, 30 Oct 2008 05:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9023470</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/ito/comments/9023470.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9023470</wfw:commentRss><description>&lt;p&gt;&lt;strong&gt;PIXとは&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;3Dゲームを開発している時に必ずといってあるのが、モデルが意図しない状態で表示されるという問題です。「色が変」や「形が変」と言う比較的原因が予想しやすい問題から「画面になにも出ない」といった原因を判断するのが困難な場合まで様々な問題があります。特にシェーダープログラムを使っているとこういった問題に直面する機会は多くなります。&lt;/p&gt; &lt;p&gt;こういった問題の原因を見つけるのに非常に有用なツールとして、Direct X SDKに付属する&lt;strong&gt;PIX for Windows&lt;/strong&gt;があります。このツールは元々、初代Xbox用に開発されたPerformance Investigator for Xbox (PIX)だったのですが、これを使った人達からの強い要望でWindows版が作られました。&lt;/p&gt; &lt;p&gt;XNA FrameworkはDirect X上で動作しているので、XNA GS用に作られたゲームもPIX for Windowsを使うことができます。&lt;/p&gt; &lt;p&gt;PIXの主な機能としては&lt;/p&gt; &lt;ul&gt; &lt;li&gt;１フレーム、もしくは複数のフレームのレンダリング情報のキャプチャ  &lt;li&gt;レンダリングに使われたDirect Xの描画関連命令の表示  &lt;li&gt;リソース使用量の表示  &lt;li&gt;各段階でのグラフィクスリソースの状態表示  &lt;ul&gt; &lt;li&gt;レンダーステート  &lt;li&gt;テクスチャ、レンダーターゲット  &lt;li&gt;頂点情報  &lt;li&gt;シェーダー情報&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;シェーダーデバッガ&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;があります。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;PIXの基本的な使い方&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ea4894b5-e98d-44f6-842d-e32147237638&amp;amp;displaylang=en" target="_blank" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ea4894b5-e98d-44f6-842d-e32147237638&amp;amp;displaylang=en"&gt;Direct X SDK&lt;/a&gt;をインストールした状態で(ここではAugust 2008を例にします)、スタートメニューから&lt;strong&gt;Microsoft DirectX SDK (August 2008)/DirectX Utilities/PIX for Windows&lt;/strong&gt;を選択してPIX for Windowsを起動します。&lt;/p&gt; &lt;p&gt;FileメニューからNew Experimentを選択すると以下の画面が表示されます。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix00_2.png" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="416" alt="pix00" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix00_thumb.png" width="644" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Program pathに対象となる実行ファイルを指定し、"A single-frame capture of Direct3D whenever F12 is pressed"のラジオボタンを選択して、右下にある"Start Experiment"ボタンを押すと、Program pathに指定した実行ファイルが実行されます。ここではSkinningSampleを使っています。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix01_2.png" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="384" alt="pix01" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix01_thumb.png" width="644" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;単独で実行させるのと違うのは、画面の左上にフレーム数などの情報が表示されています。キャプチャしたいシーンになったらF12キーを押してフレーム情報をキャプチャします。レンダリングするシーンの複雑さによってキャプチャに掛かる時間は変わってきます。&lt;/p&gt; &lt;p&gt;キャプチャした後にゲームを終了させると、PIX for Windowsに複数のウィンドウが表示されます。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix03_2.png" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="416" alt="pix03" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix03_thumb.png" width="644" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;この複数のウィンドウは上から順にCPUの作業時間をグラフで示す&lt;strong&gt;Timelineウィンドウ&lt;/strong&gt;、グラフィクスリソース確保状況を表示する&lt;strong&gt;Objectsウィンドウ&lt;/strong&gt;、左下はキャプチャしたフレーム内で起きたイベントを表示する&lt;strong&gt;Eventsウィンドウ&lt;/strong&gt;、そして右下が詳細を表示する&lt;strong&gt;Detailsウィンドウ&lt;/strong&gt;となっています。&lt;/p&gt; &lt;p&gt;ここで、Eventsウィンドウで調べたいフレームを選択したあとに、Detailsウィンドウ内の&lt;strong&gt;Renderタブ&lt;/strong&gt;をクリックすると以下の画面になります。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix04_2.png" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="416" alt="pix04" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix04_thumb.png" width="644" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;PIXをシェーダーデバッガとして使う&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;このRenderタブにはフレームのレンダリング結果が表示されます。また、Eventsウィンドウの選択したフレームを開くと中には複数のイベントが表示されていますが、ここにはXNA Frameworkではなく、Direct Xのイベントが表示されます。ここからデバッグしたいDrawIndexedPrimitiveメソッドを探し出すのは面倒なので、今回は簡単な方法を紹介します。&lt;/p&gt; &lt;p&gt;それはRenderタブに表示されている画面上でデバッグしたいモデルの場所で右クリックして表示されるメニューから&lt;strong&gt;Debug This Pixel...&lt;/strong&gt;を選択する方法です。ここでは、おっさんのアーマー部分を選択しました。&lt;/p&gt; &lt;p align="center"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="275" alt="pix05" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX01_10C70/pix05_thumb.png" width="511" border="0" mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX01_10C70/pix05_thumb.png"&gt;&lt;/p&gt; &lt;p&gt;Debug This Pixel...を選択すると、Detailsウィンドウに&lt;strong&gt;Debuggerタブ&lt;/strong&gt;が追加され、選択したピクセルがどのようにレンダリングされたいるかの情報が表示されます。レンダリング開始時のフレームバッファーの色、クリアーした時の色、モデルをレンダリングしたときの色と、時系列に表示されています。もし、ここで表示されるリストが多い場合は重ね塗りが何度も起こっているのでフィルレートに影響しているということが判ります。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix06_2.png" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="416" alt="pix06" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix06_thumb.png" width="644" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;今回デバッグしたいのはおっさんのアーマー部分のシェーダーなので、リストの中からDrawIndexedPrimitiveメソッドを使って赤っぽくなっているピクセルを探します。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix07_2.png" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="453" alt="pix07" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix07_thumb.png" width="644" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;DrawIndexedPrimitiveを使っているピクセルでは、そのピクセルを描画するのに使われた三角形の各頂点の頂点シェーダー、そしてピクセルシェーダーをデバッグすることができます。ここでは&lt;strong&gt;"Debug Vertex 0"&lt;/strong&gt;をクリックして頂点シェーダーのデバッグをすることにします。"Debug Vertex 0"をクリックすると以下のように、Debuggerタブ内に更にシェーダーアセンブリを表示する&lt;strong&gt;Disassemblyタブ&lt;/strong&gt;、ソーソコードを表示するタブ(ここではSkinnedModel.fx)が表示されます。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix11_2.png" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="484" alt="pix11" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix11_thumb.png" width="578" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;ここで、ソースコードをPIX上で表示するにはシェーダーソースコードにコンパイル元のファイル情報が記載されている必要があります。XNA Frameworkではデバッグ設定でシェーダーをコンパイルすると、この情報を自動的に追加するようになっているので、プロジェクトをデバッグ設定でコンパイルすることでPIX上でソースコードレベルでのデバッグができるようになっています。逆に言えば、アセンブリしか表示されない場合はプロジェクトのコンパイル設定がリリースになっているのが原因と思われます。&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix12_2.png" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="484" alt="pix12" src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/PIX_11131/pix12_thumb.png" width="574" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Visual Studio上で提供されているデバッグ機能には及ばないにしても、ステップ実行や実行後の変数の状態表示など、デバッグするのに必要最低限の機能はあるので、シェーダーコードのデバッグをするのに大いに役立ちます。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;PIXをシェーダーデバッガとして使うときの注意点&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;ソースコードレベルでのデバッグをするときには、プロジェクトをデバッグ設定でコンパイルする&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;次回に続く&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9023470" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/XNA/default.aspx">XNA</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/_B030E930D530A330AF30B930_/default.aspx">グラフィクス</category><category domain="http://blogs.msdn.com/ito/archive/tags/Windows/default.aspx">Windows</category><category domain="http://blogs.msdn.com/ito/archive/tags/_C730D030C330B030_/default.aspx">デバッグ</category></item><item><title>ClickOnce その２</title><link>http://blogs.msdn.com/ito/archive/2008/10/22/clickonce-02.aspx</link><pubDate>Thu, 23 Oct 2008 07:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9012426</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/9012426.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9012426</wfw:commentRss><description>&lt;P&gt;&lt;STRONG&gt;スタートメニューの登録名を変更する&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;デフォルトの状態でClickOnceを使うと、インストール時にスタートメニューには&lt;STRONG&gt;プロジェクト名/プロジェクト名&lt;/STRONG&gt;のように登録されます。前回の例ではSuperCatsというプロジェクトを作ったので、SuperCats/SuperCatsのようになります。&lt;/P&gt;
&lt;P&gt;この設定の変更はプロジェクトプロパティの発行タブで行います。&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/005_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/005_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=005 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/005_thumb.png" width=644 height=477 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/005_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;発行タブページは上図のようになっていて、この中のオプションボタンを押すと、以下の発行オプションダイアログが開きます。&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/003_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/003_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=003 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/003_thumb.png" width=382 height=484 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/003_thumb.png"&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;このダイアログ内の&lt;STRONG&gt;発行者名&lt;/STRONG&gt;と&lt;STRONG&gt;製品名&lt;/STRONG&gt;を変更することで、スタートメニューには&lt;STRONG&gt;発行者名/製品名&lt;/STRONG&gt;のように登録されます。ここでは、発行者名を「ひげねこ」、製品名を「超猫」とします。&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/004_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/004_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=004 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/004_thumb.png" width=438 height=221 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/004_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;この状態で発行されたパッケージをインストールすると、上図のようになります。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;配置マニフェストにマシン名とユーザー名が記載されるのを防ぐ&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ここでは、デフォルトの状態で配布するパッケージにはパッケージを作ったマシン名と、ユーザー名が含まれている問題を解決する方法を紹介します。これでも構わないと言う人は読み飛ばして下さい。&lt;/P&gt;
&lt;P&gt;アプリケーションを発行すると、発行先のフォルダには&lt;STRONG&gt;アプリケーション名.application&lt;/STRONG&gt;という配置マニフェストファイルが生成されます。このファイルはXMLファイルで中には発行者の情報が書かれおり、デフォルトの状態では発行者の情報は&lt;STRONG&gt;マシン名/ユーザー名&lt;/STRONG&gt;のようになります。&lt;/P&gt;
&lt;P&gt;なぜこうなっているかを簡単に説明すると、ClickOnceは発行者が発行したアプリケーションが第三者によって発行者の意図しない変更がされるのを防ぐために電子署名をするようになっていて、配置マニフェストには署名に使われた証明書の発行者名が記載されるようになっているからです。&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/001_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/001_2.png"&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/002_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/002_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=002 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/002_thumb.png" width=265 height=227 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/002_thumb.png"&gt;&lt;/A&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;デフォルトでは自動的に電子署名が作られ、上図のようにプロジェクトにテンポラリ証明書が追加されます。&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=001 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/001_thumb.png" width=644 height=395 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/001_thumb.png"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;この証明書の詳細は、プロジェクトプロパティの署名タブで見ることができます。上図では、私がテストに使っているノートブックのマシン名とユーザー名が発行者情報になってしまっています。&lt;/P&gt;
&lt;P&gt;殆どの場合は問題ないのですが、個人的な情報、例えば彼女やお嫁さん(現実、非現実含む)の名前とかをマシン名やユーザー名に使ってい場合には、その情報をネットに流出するといろいろと問題があるという人も居ると思うのでここでは電子証明書の生成のしかたを紹介します。&lt;/P&gt;
&lt;P&gt;個人でゲーム制作をしている場合、電子証明書を取得するには以下の二種類が考えられます。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;A target=_blank href="http://www.verisign.co.jp/" mce_href="http://www.verisign.co.jp/"&gt;VeriSign&lt;/A&gt;などの電子証明書発行サービスを利用する(有料)&lt;/LI&gt;
&lt;LI&gt;自己署名証明書を作る&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;作ったゲームを商品として販売するには1にするべきですが、ここでは自己署名証明書の作り方を紹介します。ただし、この証明書は誰にでも作ることができるので信頼できる証明書では無いことに注意して下さい。&lt;/P&gt;
&lt;P&gt;証明書を作るには&lt;A target=_blank href="http://msdn.microsoft.com/ja-jp/library/bfsktky3(VS.80).aspx" mce_href="http://msdn.microsoft.com/ja-jp/library/bfsktky3(VS.80).aspx"&gt;makecert.exe&lt;/A&gt;を使います。このツールは&lt;A target=_blank href="http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=ja" mce_href="http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=ja"&gt;.Net Framework SDK&lt;/A&gt;やWindows SDKに付属しています。SDKのコマンドプロンプトを開いて、以下のコマンドを実行します。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;makecert -r -n "CN=John Smith" -b 01/01/2008 -e 12/31/2008 -sky exchange -ss my&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;それぞれのオプションの意味は以下のようになっています。&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=501&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=52&gt;-r&lt;/TD&gt;
&lt;TD vAlign=top width=445&gt;自己署名証明書を作成&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=52&gt;-n&lt;/TD&gt;
&lt;TD vAlign=top width=445&gt;X.500 標準に準拠した証書名、ここでは発行者名を"John Smith"としている。&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=52&gt;-b&lt;/TD&gt;
&lt;TD vAlign=top width=445&gt;証明書の有効期間開始日 月/日/西暦で表される&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=52&gt;-e&lt;/TD&gt;
&lt;TD vAlign=top width=445&gt;証明書の有効期間終了日 月/日/西暦で表される&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=52&gt;-sky&lt;/TD&gt;
&lt;TD vAlign=top width=445&gt;サブジェクトのキーの種類&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=52&gt;-ss&lt;/TD&gt;
&lt;TD vAlign=top width=445&gt;作成した証明書を格納するストア名&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;ここでは、発行者名を"John Smith"としましたが、自分の好きな名前に変更することができます。また、Windows OSには電子証明書を入れておくストアと呼ばれる金庫のようなものがあり、ここでは生成した証明書をこのストアに格納しています。&lt;/P&gt;
&lt;P&gt;証明書を作ったら、プロジェクトプロパティの証明タブにある&lt;STRONG&gt;ストアから選択&lt;/STRONG&gt;ボタンを押して以下の証明書選択ダイアログを表示します。&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/006_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/006_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=006 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/006_thumb.png" width=507 height=276 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce02_12E2B/006_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&amp;nbsp; ここに、先ほど作った証明書が表示されるので、使いたい証明書を選びます。署名タブに選択した証明書が表示されているのを確認したら、発行タブを開いて、&lt;STRONG&gt;今すぐ発行ボタン&lt;/STRONG&gt;で発行すると配置マニフェストには新しい発行者が記載されることになります。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;まとめ&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;二回に渡って、ClickOnceの使い方を簡単に紹介してきました。ClickOnceはもともと.Net 2.0から導入された.Netベースのアプリケーションを簡単に配布する為の仕組みです。より細かい仕組みについて興味がある人は以下のURLが参考になると思います。&lt;/P&gt;
&lt;P&gt;ClickOnceの真実 &lt;BR&gt;&lt;A title=http://www.atmarkit.co.jp/fdotnet/clickonce/index/index.html href="http://www.atmarkit.co.jp/fdotnet/clickonce/index/index.html" mce_href="http://www.atmarkit.co.jp/fdotnet/clickonce/index/index.html"&gt;http://www.atmarkit.co.jp/fdotnet/clickonce/index/index.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;ClickOnceを使うことで手軽にXNA Game Studio 3.0で作られたゲームを配布することができ、配布先でも必須コンポーネントを自動的にインストールしてくれるので、ゲームを遊ぶ側の負担が大幅に減っています。&lt;/P&gt;
&lt;P&gt;また、ClickOnceのサポートに伴ってXNA Framework 3.0のランタイムを必須コンポーネントとしてインストーラープロジェクトから参照できるようになったのでClickOnceではサポートされていない細かいカスタマイズを含むインストーラーも作りやすくなっています。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9012426" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.0/default.aspx">XNA 3.0</category><category domain="http://blogs.msdn.com/ito/archive/tags/Windows/default.aspx">Windows</category></item><item><title>ClickOnce その1</title><link>http://blogs.msdn.com/ito/archive/2008/10/17/clickonce-01.aspx</link><pubDate>Sat, 18 Oct 2008 04:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9004107</guid><dc:creator>Yuichi Ito</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ito/comments/9004107.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ito/commentrss.aspx?PostID=9004107</wfw:commentRss><description>&lt;P&gt;XNA Game Studio 3.0の新機能の一つにClickOnceのサポートがあります。今まではWindows用に作ったゲームを配布するには&lt;A target=_blank href="http://blogs.msdn.com/ito/archive/2008/05/07/distribute-xna-games.aspx" mce_href="http://blogs.msdn.com/ito/archive/2008/05/07/distribute-xna-games.aspx"&gt;多くのランタイムを手動でインストールする必要&lt;/A&gt;があり、非常に不便だった問題を解決するためのものです。&lt;/P&gt;
&lt;P&gt;ClickOnceの他にも、Visual Studio上でプログラムインストール用のプロジェクト用のコンポーネントも用意されているので、簡単にXNA Game Studioで作られたゲームを再配布できるようになりました。&lt;/P&gt;
&lt;P&gt;今回は、ClickOnceを使ったゲーム配布の流れを紹介します。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;配布用のパッケージ作成&lt;/LI&gt;
&lt;LI&gt;パッケージの内容&lt;/LI&gt;
&lt;LI&gt;インストール時の振る舞い&lt;/LI&gt;
&lt;LI&gt;注意点&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;ゲーム配布用のパッケージを作る&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ゲームが完成したら、Visual Studio 2008上のビルドメニューから&lt;STRONG&gt;{プロジェクト名}の発行&lt;/STRONG&gt;を選択します。ここでは例としてSuperCatsという名前のプロジェクトを使います。&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=image00 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce01_1059E/image00_3.png" width=412 height=189 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce01_1059E/image00_3.png"&gt;&lt;/P&gt;
&lt;P&gt;以下の様な発行ウィザードが表示されます。もっとも手っ取り早い方法は、アプリケーションを発行する場所を適当な位置を指定した後に、完了ボタンを押すだけでプロジェクトのビルドと、配布用のパッケージが作られます。&lt;/P&gt;
&lt;P align=center&gt;&amp;nbsp;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce01_1059E/%E7%84%A1%E9%A1%8C-01_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce01_1059E/%E7%84%A1%E9%A1%8C-01_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=無題-01 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce01_1059E/%E7%84%A1%E9%A1%8C-01_thumb.jpg" width=530 height=484 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce01_1059E/%E7%84%A1%E9%A1%8C-01_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;STRONG&gt;パッケージの内容&lt;/STRONG&gt;&lt;/P&gt;
&lt;P align=left&gt;ウィーザードで発行先に指定したフォルダ(ここではtmp/public)には以下のフォルダやファイルが作られます。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;Application Filesフォルダ&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;setup.exe&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;{プロジェクト名}.application&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P align=left&gt;パッケージ全体のサイズは元々のゲームのサイズ+500KB程度になります。注:ベータ版では+5MB程になっていました。&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce01_1059E/%E7%84%A1%E9%A1%8C-06_2.png" mce_href="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce01_1059E/%E7%84%A1%E9%A1%8C-06_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=無題-06 src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce01_1059E/%E7%84%A1%E9%A1%8C-06_thumb.png" width=643 height=484 mce_src="http://blogs.msdn.com/blogfiles/ito/WindowsLiveWriter/clickOnce01_1059E/%E7%84%A1%E9%A1%8C-06_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;後はこの二つのファイルとフォルダをzipファイルなどにまとめて自分のサイトにアップするだけです。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;インストールの振る舞い&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;配布用のパッケージをダウンロードし、setup.exeを実行するだけで、ゲームのインストール、そして実行までが自動的に行われます。&lt;/P&gt;
&lt;P&gt;この時、setup.exeはゲームを実行するのに必要な以下のコンポーネントがインストールされているかをチェックします。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;.Net Framework 3.5&lt;/LI&gt;
&lt;LI&gt;XNA Framework 3.0&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;もし、これらのランタイムがシステムにインストールされていない場合は、自動的にそれらのコンポーネントをネットからダウンロードし、インストールします。.Net Framework 3.5をインストールしていない環境の場合、最初のインストールに時間が掛かる事に注意して下さい。&lt;/P&gt;
&lt;P&gt;XNA GS 2.0の時にはフレームワークが使っているDirectXのランタイムは別途インストールする必要がありましたが、XNA GS 3.0ではそれらのコンポーネントもXNA Framework 3.0のランタイムにまとめられています。&lt;/P&gt;
&lt;P&gt;また、インストールされたプログラムはデフォルトの状態ではスタートメニューにのプロジェクト名のフォルダと、その下にショートカットが作られます。&lt;/P&gt;
&lt;P&gt;アンインストールする場合は、他のアプリケーションと同じようにプログラムの追加/削除メニューからアンインストールすることができます。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;注意点&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ClickOnceのサポートによってゲームの配布が簡単になりましたが、残念ながらGame for Windows Liveのランタイムは再配布パッケージの中には含まれないので、ネットワーク対応のゲームやGamerServices名前空間の機能を使っているゲームを他のマシンで遊ぶにはXNA GS 3.0をインストールする必要があります。&lt;/P&gt;
&lt;P&gt;また、今回紹介した方法だと.applicationファイル内に発行したマシン名とユーザー名の情報が記録されるので、これらの情報を公開したくない人は注意して下さい。この解決方法と、スタートメニューに登録される名前をプロジェクト名から好きな名前に変更する仕方などは次回紹介します。&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9004107" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ito/archive/tags/_B230FC30E0308B957A76_/default.aspx">ゲーム開発</category><category domain="http://blogs.msdn.com/ito/archive/tags/XNA+3.0/default.aspx">XNA 3.0</category><category domain="http://blogs.msdn.com/ito/archive/tags/Windows/default.aspx">Windows</category></item></channel></rss>