ちょっとやってみた系ログ
XNA突っ込んでどう動かすかというか勉強をしてみた。
基本の流れ
基本は.NET のMainで走ってる。で、Microsoft.Xna.Framework.Game クラスが、内部でループやらなにやら隠蔽してAPIを公開している模様。どうもこのインスタンス1個でウィンドウを作ったり、無限ループしたり、作画やロジックのコールをするそうな。
で、Windows プロパティ経由でウィンドウ情報にアクセスできる。設定は非常に少ないが、Handle プロパティ経由でウィンドウハンドル拾ってこれる。試しに Form でラップしたらボタンとかメニューとか追加できた。
XBox や WindowsPhone 対応のためだろう。実記で動かしてないから不明だが、多分XBoxやWPで呼ぶとエラーが起きるか、null が返るかしそうな悪寒。
GraphicsDeviceManager
GraphicsDeviceManager について見てた。どうもグラフィック系デバイスリソースの管理を全部やってくれるらしい。無くても根性だせばいけそうだが、マルチプラットフォーム考えたら怖いし手出さないほうがよさげ。何にしろ勉強段階でこだわる理由は無いので、任せられるのは任せよう。
デフォルトだとコンストラクタでインスタンス作ってるけど、実際に実行できるのは Initialize 以降のタスクのようだ。
GraphicsDevice
グラボ性能とか、画面の表示モードとか引っこ抜ける。
System.Console.WriteLine(GraphicsDevice.DisplayMode.Width); System.Console.WriteLine(GraphicsDevice.DisplayMode.Height); System.Console.WriteLine(GraphicsDevice.DisplayMode.AspectRatio);
こんなの結構必要だよね。フルスクリーン時のワイド対応とかさ。
GameTime
TotalRealTime と TotalGameTime が存在してる。
TotalRealTime は、ゲームが起動してからの実時間で、TotalGameTime はゲームの実動作時間を表すものらしい。
ElapsedGameTime 経由で、最後に Update が呼び出されてからの時間経過が取得できる。ElapsedRealTime で前フレームからの経過時間が拾ってこれると。
で、TargetElapsedTime を使うことで、Updateの呼び出し間隔が指定できるようだ。
固定ステップと可変ステップ
基本的には TargetElapsedTime 指定の時間間隔で Update が呼ばれる。これが固定ステップで、そんなの関係ねー!呼べるだけUpdate呼ぶんじゃ!ってのが可変ステップ。
Game クラスのプロパティ、IsFixedTimeStepをfalseにしてやるとこのモードに突入すると。
作画遅延
作画は実行速度が遅かった筈で、それにより60フレームが維持できない場合がある。
が、弾幕STGでは処理落ち歓迎かも知れんが、音ゲーでは致命的。遅れた分の処理は、画面とは別にロジック処理は先行すべきなんだが、、、、と思ったら、固定ステップの場合、Update呼び出しが遅れていると、Draw無視してUpdateが実行されるらしい。やるなブライトめ。
フレーム落ちしてるとき、Game.IsRunningSlowly プロパティで、フレーム落ちが検出できるそうな。イイネ。
逆に処理落ちさせる場合はどうすっぺ?と思ったけど、Draw同期すりゃいいだけの話なのは見えてるので、ロジックでどうとでもいける。
てーかよほどアホな処理書かない限り、同人クオリティの2D/3Dで昨今のハイスペ厨のマシンが処理落ちするとは到底思えんが、、、、w
垂直同期
画面のリフレッシュレートに同期するという話。
GraphicsDeviceManager の SynchronizeWithVerticalRetrace を false にして、可変ステップにすると、更新できるだけ更新しまくるベンチマークモードに突入する。
画像が乱れたりするかもしれんが、この方がゲーム進行速度の遅延を無視できる場合も多い。
まぁ内容次第ということで。
以下継続。