FPSを作ってみる@wiki
03)
最終更新:
slice
-
view
(2011/03/25)
XAudioとメモリ
非常に間が空いた.
例の地震で動揺して変な事口走ったりしないようにと意図的にネット活動を自粛してたのもあるが一応,生きている(生きてしまった・・か?)
さておきこのページに私情は極力挟まない方針なので思い出しながら作業の進捗を書く事にする.
例の地震で動揺して変な事口走ったりしないようにと意図的にネット活動を自粛してたのもあるが一応,生きている(生きてしまった・・か?)
さておきこのページに私情は極力挟まない方針なので思い出しながら作業の進捗を書く事にする.
サウンドはogg形式のストリーム再生も含めXAudioに移行完了した.
躓いたのはコマンドの適用は常に非同期で行われるという点で,DirectSoundではStop関数を呼べば処理が返ってくる頃には確実に再生が止まっていた.
(たまたま自分の環境でそうなっていただけかもしれない)
XAudioはそれも例外なく非同期なのであるタイミングでStopを呼んだからといって即座に再生が止まるわけではない.
これが非ストリーム再生ならStopの直後にFlushBuffer(サウンドコマンドクリア関数),Startと続けて呼んでおけば
後はライブラリがその順番で処理してくれて全く問題は無いのだが
ストリーム再生ではユーザーがバッファを適時更新しなくてはならない関係上同期は必須である.
これはストリーム再生クラスに再生終了のコールバック関数を備える事で解決した.
躓いたのはコマンドの適用は常に非同期で行われるという点で,DirectSoundではStop関数を呼べば処理が返ってくる頃には確実に再生が止まっていた.
(たまたま自分の環境でそうなっていただけかもしれない)
XAudioはそれも例外なく非同期なのであるタイミングでStopを呼んだからといって即座に再生が止まるわけではない.
これが非ストリーム再生ならStopの直後にFlushBuffer(サウンドコマンドクリア関数),Startと続けて呼んでおけば
後はライブラリがその順番で処理してくれて全く問題は無いのだが
ストリーム再生ではユーザーがバッファを適時更新しなくてはならない関係上同期は必須である.
これはストリーム再生クラスに再生終了のコールバック関数を備える事で解決した.
次.メモリ管理について.
現時点ではヒープメモリの確保に全て標準のnew,delete(malloc,free)を使用している.
処理速度とメモリが貴重な組み込み環境ならともかく
ことメモリの潤沢なPCであるしそんなのはゲームが出来てから心配すれば良い.
しかしだからと言って「数十,数百バイト程度の小規模オブジェクトには向いていない,重い」「メモリ効率が良くない(?)」と評判の
汎用性重視のアロケータをLuaに使わせるのも憚られる訳である.
そうでなくとも小規模~大規模をカバーしたアルゴリズムは小規模に特化したそれには勝てないだろう=用途に合ったアロケータが必須
という考えの下,Lua用のアロケータを自作しようと思った次第である.
(もちろん既存のアルゴリズムを参考に実装をするという意味)
現時点ではヒープメモリの確保に全て標準のnew,delete(malloc,free)を使用している.
処理速度とメモリが貴重な組み込み環境ならともかく
ことメモリの潤沢なPCであるしそんなのはゲームが出来てから心配すれば良い.
しかしだからと言って「数十,数百バイト程度の小規模オブジェクトには向いていない,重い」「メモリ効率が良くない(?)」と評判の
汎用性重視のアロケータをLuaに使わせるのも憚られる訳である.
そうでなくとも小規模~大規模をカバーしたアルゴリズムは小規模に特化したそれには勝てないだろう=用途に合ったアロケータが必須
という考えの下,Lua用のアロケータを自作しようと思った次第である.
(もちろん既存のアルゴリズムを参考に実装をするという意味)
自分自身アロケータがどうとかは語れるほど詳しくは無いのでまずは手近な資料である
Modern C++ Designの「小規模オブジェクトアロケータ」の項を読みつつ実装と簡単な動作テストを完了した.
予めある一定のサイズでもって切り分けたメモリブロックを要求された容量に応じて
(32バイトなら32バイトのブロック,4バイトなら4バイトのを)割り当てるという比較的単純な物で
このタイプはプールアロケータと呼ぶらしい.
Modern C++ Designの「小規模オブジェクトアロケータ」の項を読みつつ実装と簡単な動作テストを完了した.
予めある一定のサイズでもって切り分けたメモリブロックを要求された容量に応じて
(32バイトなら32バイトのブロック,4バイトなら4バイトのを)割り当てるという比較的単純な物で
このタイプはプールアロケータと呼ぶらしい.
ただまあ要求されたサイズずばりのブロックをいちいち用意していたのでは埒が明かないから
実際には30バイトの要求に対しては32バイトで代用などする訳で
このメモリを切り分けるサイズが肝となる.
メモリの傾向なんてのは完成されたゲームを動かしてみない事には分からないのでひとまず
4, 8, 16, ...と指数倍数的に増やして行き64からは128,192と64ずつ最大512までとした.
それより大きい要求は従来のnewで確保する.
実際には30バイトの要求に対しては32バイトで代用などする訳で
このメモリを切り分けるサイズが肝となる.
メモリの傾向なんてのは完成されたゲームを動かしてみない事には分からないのでひとまず
4, 8, 16, ...と指数倍数的に増やして行き64からは128,192と64ずつ最大512までとした.
それより大きい要求は従来のnewで確保する.
動作させた所,使用メモリ量が従来newに対して若干減った程度で特に速度の違いは見られなかったが
空き探索の度に線形探索をかけるでもなし
デバッガで見る限り必要以上に確保しているようにも見えないしOKとする.
ちなみに現時点での自作プログラムのメモリ確保要求の傾向としては
20~30バイトが最も確保&解放頻度が高く次いで64か16バイト辺り,320バイトが時々とたまに512バイトクラスがあるようだ.
空き探索の度に線形探索をかけるでもなし
デバッガで見る限り必要以上に確保しているようにも見えないしOKとする.
ちなみに現時点での自作プログラムのメモリ確保要求の傾向としては
20~30バイトが最も確保&解放頻度が高く次いで64か16バイト辺り,320バイトが時々とたまに512バイトクラスがあるようだ.
(2011/03/05)
API
今更ながら
DirectInputとXInput
DirectSound(以下DS)とXAudio
それぞれどちらを使えばいいのか悩む.
「いいのか」と言われれば新しい規格が良いに決まってるだろ!と突っ込まれそうだが
なにはともあれ調べてみる.
DirectInputとXInput
DirectSound(以下DS)とXAudio
それぞれどちらを使えばいいのか悩む.
「いいのか」と言われれば新しい規格が良いに決まってるだろ!と突っ込まれそうだが
なにはともあれ調べてみる.
結果.
XAudioとXInputは扱いがDirect~と比べて楽のようだ.
しかしXInputに関しては使えるコントローラがXbox360用の物だけという事で即却下.
(仮に誰かが抜け道的に使えるように改造したバージョンがあったとしてもボタン数とか振動云々が劣っている様だし)
別にMS帝国が~等と言うつもりはないが流石にこれはどうかと.
入力関係はDirectInputを継続.
XAudioとXInputは扱いがDirect~と比べて楽のようだ.
しかしXInputに関しては使えるコントローラがXbox360用の物だけという事で即却下.
(仮に誰かが抜け道的に使えるように改造したバージョンがあったとしてもボタン数とか振動云々が劣っている様だし)
別にMS帝国が~等と言うつもりはないが流石にこれはどうかと.
入力関係はDirectInputを継続.
次はサウンド.
まずVista以降ではサウンドのハードウェアアクセラレーションがばっさり切り捨てられたとの事.
したがってXAudioはすべてソフトウェア処理となる.
WinXPではXAudioはDSでのエミュレーション,Vista以降はDSはXAudioでのエミュで動いているようだ.
エミュで動くのならDSでも良いように思われるが
EAXはともかく定位やドップラー効果さえも動作しない?というような情報もあったりで結局どっちなのかわからず.
自分で試そうにも当方Vistaか7を持っていない・・
まずVista以降ではサウンドのハードウェアアクセラレーションがばっさり切り捨てられたとの事.
したがってXAudioはすべてソフトウェア処理となる.
WinXPではXAudioはDSでのエミュレーション,Vista以降はDSはXAudioでのエミュで動いているようだ.
エミュで動くのならDSでも良いように思われるが
EAXはともかく定位やドップラー効果さえも動作しない?というような情報もあったりで結局どっちなのかわからず.
自分で試そうにも当方Vistaか7を持っていない・・
ちなみにサウンド再生APIにはOpenALというのもある.
こちらもunrealエンジンとdoomIIIエンジンのゲームは概ね,他にcall of duty4やhitmanなんかもあったりして
マイナーというわけでもない.
こちらもunrealエンジンとdoomIIIエンジンのゲームは概ね,他にcall of duty4やhitmanなんかもあったりして
マイナーというわけでもない.
DSかXAudioなら後者でありOpenALとは何とも言えない感じ.
うだうだしてると時間ばかり過ぎるのでとりあえずXAudioで実装してみようかと思う.
うだうだしてると時間ばかり過ぎるのでとりあえずXAudioで実装してみようかと思う.