A3サイズの升目帖(旧)

ゲーム制作やプログラミングに関する雑記

サウンドの再生に成功した…が

D言語でゲームサウンド

とりあえず Windows 上で動作させようということで、サウンドの再生には XAudio2 を採用した。

OS は Windows10 なので、XAudio2.9 がターゲットになる。

もともとは DirectSound を検討していたんだが、あれって知らん間に非推奨になってたんやね。

いつ消えるかもわからん非推奨のもんをごり押しで使い続けるのもアレなので、これを機会に XAudio2 に乗り換えることにした。


D言語向けに色々と移植

というわけで、XAudio2 のマクロましまし黒魔術ヘッダファイルをせっせとD言語に翻訳すること小一時間…

どうにかサウンドを再生できるようになった。ヘッダの移植は DirectX11 で苦労した経験が活きた。

XAudio2 自体のプログラミングだが、DirectSound と比べてめっちゃ楽やん…!(簡単とは言っていない)

パンの設定・取得でちょっとつまずいたくらいで、あとはスイスイ行けた。


「いや~ サウンドも制覇したわけだし、インフラはほぼ完成。これで安泰だな!」

…と思っていたのだが…


なんかFPSがガタ落ちするんですが

XAudio2 を使い始めた途端、FPS がコンスタントに 7~10 近く落ちる現象を確認。

今まで 60FPS で動いてたゲームが、平均 50FPS くらいになってしまうのだ。

そりゃねぇぜ…


発生条件

これが不思議なことに、サウンドを何ら再生していない無音の状態でも発生する。

原因を細かく調べた結果、マスタリングボイスを生成しなければ 60FPS が維持されることがわかった。どうやら、主なトリガーはマスタリングボイスの生成らしい。

また、メッセージループで過負荷を防ぐために入れている Thread.sleep を削除すると、マスタリングボイスが存在しても 60FPS を維持できる。(もちろん CPU 使用率は跳ね上がってしまうが。)


解決方法いまだ不明

どうしたらよいかは現時点ではわかっていない。

困ったもんだな…。FPS が10も落ちるんじゃあ正直言ってお話にならんぞ。

スレッド周りが原因なんだろうか? メッセージループのあるUIスレッドで XAudio2 を起動したのがまずかった?

XAudio2 は、 Microsoft がゲーム開発向けと謳っている技術なので、選定は間違ってないと思うんだがなあ。

使い方がまずいんだろうけど、ゲームで XAudio2 を使用する際の正しいお作法みたいなのがよくわからないので手が打てんなコレ…

XAudio2 で検索かけても、出てくるのはすべてサウンドの再生に終始するサンプルばかりだしなあ。

メッセージループと併用する際の正しいサンプルとかがあれば泣いて喜ぶのだが。

ひょっとしてD言語との相性の問題だったり?

う~ん、なんもわからん。

ぐぬぬ