スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++とDirectX弄りの備忘録(2)

ということで2。今回はDirectInputの話。
ゲームにしろなんにしろユーザーからの入力は必要、ということで入力デバイスを一手に担ってくれるのが、
DirectXのなかでもDirectInputということになる。実際のところ使い方は割と簡単。

問題は、このAPIバージョン8からさっぱりアップデートがないこと。MSによると、

「DirectInputはもうやめた。ゲームパッドに関してはこれからはXInputを使え。
ただし対応しているのは箱のコントローラだけだ(笑。マウスとキーボードがほしけりゃWindowsのAPI使え」

つまるところ箱のコントローラを使わない限りは、WindowsのAPIを直接たたくかほかの手段を探すってことになる。
ゲームパッドに関してはそれ専用の取得APIがあるみたいで、めんどくさいが使えなくはない。
キーボードとマウスはAPIを使うとなると、GetAsyncKeyState()だったりGetCursorPos()あたりを使うか、
プロシージャのコールバックを利用しての実装をしろ、という意味なんだと思う。

どちらにしても割と仕込むのが面倒くさいので、やっぱりDirectInputを使うか、
箱(もしくは互換のある)コントローラを使うことを強要する、というくらいしか選択肢がないから
結局DirectInput使ったほうが楽っていうのが現状…なのでしょうか?
よくわからないからもっとほかの使いやすいライブラリがあったら教えてほしい。



ところでスプライトバッチの方は、ソートとかはめんどくさいのでとりあえずは、
指示された描画が同一テクスチャである限りはこれをバッファに貯め、
End()メソッドかテクスチャが変更されたときに動的頂点バッファに書き込んで
DrawIndexedPrimitive()する、って形だとリリースビルド時・最適化最大・最小限のコードで、
同一テクスチャだと7000枚程度の板ポリゴンであればぎりぎり60fpsを維持できるような感じにはなった。
ただ、単純計算28000頂点を処理したところで限界が来ているから、まだあまり効率がいいってわけではないか。
ちょっとまじめなゲームだったら数万頂点あるのは当たり前だろうしねぇ。
実際にはあたり判定だとかテクスチャの変更は起こるわけだから、まだまだ遅くなる。
ついでにUSAGEにDYNAMICを指定して頂点バッファを作成しているからか、
メモリの確保場所をPOOL_DEFAULTに設定しないとうまく頂点バッファが確保されない。
インデックスバッファは静的でいいから大丈夫なんだが、動的に操作するような場合は
POOL_DEFAULTフラグを設定しないとうまくいかないようだ。毎フレーム書き換えるからDYNAMIC指定したが、
もしかしたらWRITE_ONLYフラグだけのときと変わらないのかもしれない。おまじないおまじない。
これの問題は、デバイスロスト時にリソースのバックアップが行われないため再作成の必要があること。
まぁ7に変えてから未だかつてデバイスロストにあったことがない(XPは割とすぐなった)ので、
デバイスロストしたらご愁傷様でした、でももういい気がしてる。

あと効率化するとすれば、頂点情報に回転とスケール情報を埋め込んでGPU側に各々頂点計算をさせるか。
やはりそうなると頂点シェーダが必要になってくるし、例えば画面全体に適当なスクリーンをかぶせて色調を
ある程度統一させるといったエフェクトをやるならば、効率的にはピクセルシェーダを使わなければならない。

ここらでDirectX10or11に行ってみるか。いったん何かしらまとまったものを作ってから。
奴らはプログラマブルシェーダ必須だからいろいろ弄れるだろうし、用意されたスプライトクラスも
DirectX9のころとは違って即時描画じゃなくて一応そこそこのバッチ処理をしてくれるようになっているっぽい。
ついでにどうやらうちのPCはPS,VSともに3.0以上っぽいのでだいたいのことは試せるみたい。
ストリームソースを2つ使って、片方を反復して使用するような設定にしてやれば
(名前から察するにたぶんSetStreamSourceFreqだろうか)ハードウェアインスタンシングも可能か。



さて、DirectInputの使い方。ほかのDirectX系と同じく、
基本となるDirectInputインタフェースの作成→使用する各デバイス管理インタフェースの作成、
という具合でやってやればだいたい大丈夫っぽい。

ところでLinaxとかだと外部の入力装置ってってどうやって取得するんですかね。
たぶん直接、割と低レベルでの操作しないといけないからわけわからんのでしょうな。

続きを読む

スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。