トップページ > 記事閲覧
3.22c から 3.23 に更新すると音声の非同期読み込みが出来なくなる
名前:あいおい? 日時: 2022/01/16 18:01

C# Unicode版です。 DX.SetUseASyncLoadFlag(DX.TRUE);を使用し読み込んだサウンドハンドルについて、最新バージョンにてリグレッションがあったため報告いたします。 上記関数を使用し音声の非同期読み込みを以前のバージョンから使っていましたが、Ver.3.23に更新したところ同期的に読み込む挙動 (一瞬フリーズする) に変化しました。 ゲームの読み込み処理周辺は一切処理を変えておらず、旧Ver.のDLLをそのままコピーしたところ問題無く動作しました。 3.22c〜3.23の間で音声の処理に関する変更はありますか? WASAPI、DirectSound関係なく発生します。
メンテ

Page: 1 |

Re: 3.22c から 3.23 に更新すると音声の非同期読み込みが出来なくなる ( No.1 )
名前:管理人 日時:2022/01/16 21:41

> 3.22c〜3.23の間で音声の処理に関する変更はありますか? 3.22c から現在までに非同期読み込みに関わる部分も手を加えているので、その何れかに原因が あるのかもしれません ただ、5分くらいのwavファイルを20個非同期で LoadSoundMem で読み込んで、LoadSoundMem に掛かった時間を 画面に表示するテストプログラムを実行してみましたが、問題なく非同期で読み込まれ、LoadSoundMem 20回に 掛かった時間は 0.6 msec でした( 非同期読み込みをしなかった場合 11sec 掛かりました ) #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if( DxLib_Init() < 0 ) return -1; LONGLONG Time = GetNowHiPerformanceCount() ; SetUseASyncLoadFlag( TRUE ) ; for( int i = 0 ; i < 20 ; i ++ ) { LoadSoundMem( "BGM.wav" ); } SetUseASyncLoadFlag( FALSE ) ; Time = GetNowHiPerformanceCount() - Time ; SetDrawScreen( DX_SCREEN_BACK ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; DrawFormatString( 0, 0, GetColor( 255,255,255 ), "LoadTime:%d ASyncLoadCount:%d", ( int )Time, GetASyncLoadNum() ) ; ScreenFlip() ; } DxLib_End(); return 0; } よろしければあいおい?さんの環境でも上記のプログラムであれば非同期読み込みが正常に行われるか お試し頂けないでしょうか? m(_ _)m ( "BGM.wav" の部分はお手元の数分の長さがあるサウンドファイルを指定してください )
メンテ
Re: 3.22c から 3.23 に更新すると音声の非同期読み込みが出来なくなる ( No.2 )
名前:ひろかず 日時:2022/01/17 11:15

私も気になったので確認してみました。 私が制作中のプログラムでも、音楽ファイルの読み込み中にカクツキが発生しました。 ちなみに私が利用しているのは、「3Dモデル機能&ソフトウエアレンダリング機能無しパッケージ Windows版 VisualStudio( C++ )用」です。 3.22c カクツキ無し 3.22e カクツキ有り 3.23 カクツキ有り の状態です。 気になったのは下記の更新履歴です。 3.22d <仕様変更等の項目>  非同期読み込み指定で読み込んでいるハンドルを読み込み終了前に使用した場合は、その場で読み込みが完了するまで待つように処理を変更。 この箇所で誤判定があるのかもしれません。 なお、上記プログラムでは、非同期読み込みは正常に行われました。
メンテ
Re: 3.22c から 3.23 に更新すると音声の非同期読み込みが出来なくなる ( No.3 )
名前:あいおい? 日時:2022/01/17 19:22

To 管理人さん > よろしければあいおい?さんの環境でも上記のプログラムであれば非同期読み込みが正常に行われるか チェックしてみました。非同期読み込みは上手くいっているようです Async 2245 Sync 8109620 To ひろかずさん 発生するケースがあると考えると、何かしら問題がありそうですね。 > この箇所で誤判定があるのかもしれません。 これに関係する関数を使用しているのでここがミソかなと思います。 ####### 私のプログラムでは以下のような動作をしています。 音楽再生のプレビューを行う仕組みなんですが、読み込む際は DX.SetUseASyncLoadFlag(DX.TRUE); で非同期読み込みのフラグをオンにして、 DX.LoadSoundMem(); で読み込み。 DX.SetUseASyncLoadFlag(DX.FALSE); で非同期読み込みのフラグをオフ。 非同期読み込みの関数を実行後すぐにフラグをオフにしても非同期読み込みされることは仕様の範囲内でありそれを利用しています。 ゲームループ中に、 DX.CheckHandleASyncLoad(<ハンドル>) == DX.FALSE で非同期読み込みが完了しているかどうかチェックをし、左の式が true ならば再生を行う。 まだ false なら再生は行わず、次のゲームループで再度チェックをする。 という実装にしています。 サウンドハンドルを簡単に扱えるようクラスを作っているのですが、非同期・同期どちらの場合でも初期化時に ChangeVolumeSoundMem(); を使用しているため、 これが "非同期読み込み指定で読み込んでいるハンドルを読み込み終了前に使用した場合は、その場で読み込みが完了するまで待つように処理を変更。" に該当するのかもしれません
メンテ
Re: 3.22c から 3.23 に更新すると音声の非同期読み込みが出来なくなる ( No.4 )
名前:あいおい? 日時:2022/01/17 19:31

連レス失礼します m(__)m > 非同期・同期どちらの場合でも初期化時に ChangeVolumeSoundMem(); を使用しているため、 DX.GetUseASyncLoadFlag() を使用して「非同期フラグがオンの場合、音量のデフォルト値 (255) を ChangeVolumeSoundMem で設定しない」という条件分岐を行い修正したところ、 同期的に読み込まれるような挙動 (カクつき) は解消されました。 非同期読み込みに対応する際、GetFrequencySoundMem/SetFrequencySoundMem は既に条件分岐で場合分けしていましたが、ChangeVolumeSoundMem を考慮していませんでした。 ChangeVolumeSoundMem が "非同期読み込み指定で読み込んでいるハンドルを読み込み終了前に使用した場合は、その場で読み込みが完了するまで待つように処理を変更。" に該当するのは間違いないようです。 ひろかずさんの制作しているゲームにも、上のような処理があってカクつきが発生している可能性があります。
メンテ
Re: 3.22c から 3.23 に更新すると音声の非同期読み込みが出来なくなる ( No.5 )
名前:ひろかず 日時:2022/01/17 23:12

>> あいおい?さん あいおい?さんの書き込みで発生原因が分かりました。 私の場合は、SetVolumeSoundMemでボリュームの設定を行っておりました。 再生はしないで、ボリュームの設定だけあらかじめ行っていたのですが、これがまずい行為だったのでしょうか? 一応、ファイルの読み込み終了後に、ボリューム設定を行うようプログラムの修正は可能です。
メンテ
Re: 3.22c から 3.23 に更新すると音声の非同期読み込みが出来なくなる ( No.6 )
名前:ひろかず 日時:2022/01/18 22:12

自分のプログラムに関しましては、ファイルの読み込み直後にボリューム設定を行わず、 再生の直前にボリューム設定を行うよう変更しました。 その結果、カクつきが無くなりましたので問題は解決しました。 あいおい?さん、有り難うございました。
メンテ
Re: 3.22c から 3.23 に更新すると音声の非同期読み込みが出来なくなる ( No.7 )
名前:管理人 日時:2022/01/19 01:11

> ひろかずさん 原因をお調べ頂きありがとうございます m(_ _;m > 気になったのは下記の更新履歴です。 > 3.22d > <仕様変更等の項目> >  非同期読み込み指定で読み込んでいるハンドルを読み込み終了前に使用した場合は、その場で読み込みが完了するまで待つように処理を変更。 すみません、最近行った変更なのに失念していました orz > 再生はしないで、ボリュームの設定だけあらかじめ行っていたのですが、これがまずい行為だったのでしょうか? 非同期読み込み中のハンドルを関数の引数として渡した場合は、現在は一律で関数を実行前に読み込みが完了するのを待つようになっています 以前の仕様では、非同期読み込み中のハンドルを関数の引数として渡した場合はエラーになり、何もせずに関数から出てくる、というものだったので 3.22c以前 : 非同期読込中にボリューム設定を行うと、読み込み中エラーとなり、ボリューム設定が行われない 3.22d以降 : 非同期読込中にボリューム設定を行うと、読み込みが終わるまで待ってからボリューム設定を行うので動作がカクつく 上記のように 3.22c以前でも 3.22d以降でも、非同期読込中にボリューム設定を行おうとすると正常な動作にはならない ようになっています( 現在のバージョンではカクつきはするもののボリューム設定自体は正常に行われますが… ) > あいおい?さん お試し頂きありがとうございます m(_ _)m 原因が判明したようで何よりです
メンテ
Re: 3.22c から 3.23 に更新すると音声の非同期読み込みが出来なくなる ( No.8 )
名前:ひろかず(解決) 日時:2022/01/19 20:37

>> 管理人さん 非同期読み込み時の処理につきましてご返信頂き、誠に有り難うございます。 もともと、私のプログラムに間違いがあったのですね。申し訳ございません。 今回の件がきっかけで、プログラムの間違いを修正することが出来ました。感謝申し上げます。 あいおい?さんが立てたスレッドですが、こちらで解決済みとさせて頂きます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存