トップページ > 記事閲覧
非同期読込み中の音飛び
名前:SUIMA 日時: 2015/10/27 23:51

いつもDXライブラリに大変お世話になっております。 BGMを再生しながら、ランダムに画像を表示すると言った処理をしたいと思い、実装したのですが、非同期読み込み時にBGMが音飛びするという事態が起こり、解決策に困っております。 以下、状況を再現したコード //BGMを再生しながら、1秒毎に画像を読み込み描画する #include "DxLib.h" //DXライブラリ Ver3.15c int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ int Pattern = 0; int iBgmHandle = -1; int iBgpHandle = -1; int cnt0 = 0; SetWaitVSyncFlag( FALSE ); //垂直同期 ON = TRUE SetAlwaysRunFlag( TRUE ); //非アクティブ時に処理継続 SetUseASyncLoadFlag( TRUE ); //非同期読み込み ChangeWindowMode( TRUE ); //ウィンドウモード SetWindowSizeChangeEnableFlag( TRUE ); //ウィンドウサイズ変更可 SetGraphMode( 1280, 720, 32 ); //ウィンドウサイズ&カラーモード指定 SetDrawScreen( DX_SCREEN_BACK ); //ダブルバッファ設定 //初期化 if( DxLib_Init() == -1 ){ return -1; } while( TRUE ){ if( ProcessMessage() != 0 ){ break; } //メッセージ処理 switch( Pattern ){ case 0:{ //初期化 iBgmHandle = LoadBGM( "Bgm.mp3" ); Pattern = 1; break; } case 1:{ //読み込み完了待ち if( CheckHandleASyncLoad( iBgmHandle ) == FALSE ){ PlaySoundMem( iBgmHandle, DX_PLAYTYPE_LOOP ); Pattern = 2; } break; } case 2:{ //画像読み込み iBgpHandle = LoadGraph( "Bgp.jpg" ); Pattern = 3; break; } case 3:{ //読み込み完了待ち if( CheckHandleASyncLoad( iBgpHandle ) == FALSE ){ Pattern = 4; } break; } case 4:{ //待機 ClearDrawScreen(); DrawGraph( 0, 0, iBgpHandle, FALSE ); ScreenFlip(); if( cnt0++ > 240 ){ //1秒間待つ Pattern = 2; cnt0 = 0; DeleteGraph( iBgpHandle ); } break; } } Sleep( 4 ); //FPS制御 240fpsぐらい } DeleteGraph( iBgpHandle ); DeleteSoundMem( iBgmHandle ); // DXライブラリ使用の終了処理 DxLib_End(); return 0; } //使用させていただいた画像 //ttps://www.pakutaso.com/20151059294tser.html ライブラリ側の読み込みスレッド内で、Sleep等を実行していただければ、読み込み速度と引き換えに、音飛びを回避できるのではないだろうか? <-などと考えてはおりますが、見当違いなことを申しておりましたら、申し訳ございません。 問題に対する、解決策等ご提示いただければ幸いです。 よろしくお願いします。
メンテ

Page: 1 |

Re: 非同期読込み中の音飛び ( No.1 )
名前:管理人 日時:2015/10/30 01:31

非同期読み込み中の音飛び、了解しました ただ、作業時間が確保できなくてまだ現象が発生するかの確認もできていません、すみません そんな状態で申し訳ないのですが、二つほどご質問させてください m(_ _;m 1.お使いのOSは何でしょうか? 2.お使いのPCに搭載されているCPUは何でしょうか?
メンテ
Re: 非同期読込み中の音飛び ( No.2 )
名前:SUIMA 日時:2015/10/30 15:38

ご多忙の中、返信ありがとうございます。 使用しているPCの環境は以下の通り ------------------ System Information ------------------ Time of this report: 10/30/2015, 14:42:48 Machine name: DESKTOP-BAD9NGC Operating System: Windows 10 Pro 64-bit (10.0, Build 10240) (10240.th1.150930-1750) Language: Japanese (Regional Setting: Japanese) System Manufacturer: Gigabyte Technology Co., Ltd. System Model: GA-880GA-UD3H BIOS: Award Modular BIOS v6.00PG Processor: AMD Phenom(tm) II X6 1090T Processor (6 CPUs), ~3.2GHz Memory: 12288MB RAM Available OS Memory: 12278MB RAM Page File: 4933MB used, 18352MB available Windows Dir: C:\WINDOWS DirectX Version: 12 DX Setup Parameters: Not found User DPI Setting: Using System DPI System DPI Setting: 96 DPI (100 percent) DWM DPI Scaling: Disabled Miracast: Available, with HDCP Microsoft Graphics Hybrid: Not Supported DxDiag Version: 10.00.10240.16384 64bit Unicode Microsoft Visual Studio C++ 2015 Local Windows Debugger を接続してデバックしていると、特に音飛びが激しく(発生頻度が上がる)なくなります。デバッガの有無にかかわらず、マウスカーソルが固まる(OSが一瞬ハングアップしてる?) 上記の仮定を元に調査してみると、他のアプリケーション(GoogleChrome等)の音も音飛びが発生していました。 恐らく、CPU使用率が100%に達しているのだと考えられます。
メンテ
Re: 非同期読込み中の音飛び ( No.3 )
名前:管理人 日時:2015/11/02 02:34

ご返答ありがとうございます うーん性能的にとても画像ひとつを非同期読み込みしただけでは CPU 使用率が100%になったり 音飛びが発生したりしそうにないですね・・・ 載せていただいたプログラムを私の手元で実行してみましたが、問題なく動作して、音飛びも発生しませんでした CTRLキー と シフトキー と ESCキー を同時に押すとタスクマネージャーが起動して、 「パフォーマンス」タブでCPUの使用率を確認することができますが、 CPU 使用率はどのようになっていますでしょうか?
メンテ
Re: 非同期読込み中の音飛び ( No.4 )
名前:SUIMA 日時:2015/11/03 13:31

ご返信有り難うございます。 CPUの使用状況について、 通常時:0.8% 〜 1.6%程度 読み込み時:6.0% 〜 20.0%程度 更新頻度は、「高」に設定しました。
メンテ
Re: 非同期読込み中の音飛び ( No.5 )
名前:管理人 日時:2015/11/04 03:55

ご確認ありがとうございます やはりCPU使用率は100%になっていませんよね? > ライブラリ側の読み込みスレッド内で、Sleep等を実行していただければ、読み込み速度と引き換えに、音飛びを回避できるのではないだろうか? > <-などと考えてはおりますが、見当違いなことを申しておりましたら、申し訳ございません。 こちらはCPUが同時に実行できるスレッドの数より多くのスレッドを実行しようとした場合は有効ですが、 載せていただいたプログラムは常にアクティブになりそうなスレッドは最大でも3スレッドくらいなので、 6コアある( 6スレッド同時に実行できる ) AMD Phenom(tm) II X6 1090T では特に効果はないと思います サウンド処理を実行するスレッドも優先順位は最大になっているので、何が原因なのか検討もつきません・・・ ただ、本件と関係があるかはわかりませんが、気になった点は二つほどあります 1.SetDrawScreen( DX_SCREEN_BACK ) ; が DxLib_Init 呼び出しの前にある  SetDrawScreen は DxLib_Init 呼び出しの後にしか効果がありませんので、  SetDrawScreen( DX_SCREEN_BACK ) ; は DxLib_Init 呼び出しの後に記述するようにしてください 2.240fps ではなければ音飛びしないかどうか  載せていただいたプログラムでは 240fps で動作するようになっていますが、  こちらを 120fps や 60fps にした場合は音飛びはなくなりますでしょうか?
メンテ
Re: 非同期読込み中の音飛び ( No.6 )
名前:SUIMA 日時:2015/11/07 13:27

管理人様、お忙しい中ありがとうございます。 1,SetDrawScreen を初期化後に呼び出しましたが、特に変化は現れませんでした。 2,Fpsに関しては、60fpsまで下げても、逆に制限なしで動作させても特に変化はありませんでした。 以上のような結果になりました。
メンテ
Re: 非同期読込み中の音飛び ( No.7 )
名前:管理人 日時:2015/11/08 03:56

ご返答ありがとうございます あと、メールをお送りいただきありがとうございます、プログラムと動画も拝見させていただきました 動画では音とびの際にマウスカーソルの動きも止まっていますが、一般的に考えて SUIMAさんがご使用の PCの性能で画像を非同期で読み込んだだけで再生しているサウンドやマウスカーソルの動きまで止まる ( システム全体が止まっている )ようなことが発生するのは考え辛いので、SUIMAさんのPCを直接調べてみないと 断言はできないのですが、何らかの環境的な問題があるような気がします( 常駐ソフトや使用されているデバイス等 ) 手元でも作業に使用しているPCや7年前に購入した小型の非力なノートPCや、タブレット型のWindows10PCで アップしていただいたプログラムを実行してみたのですが、何れも音とびの現象は発生しませんでした なので、お手数で申し訳ありませんが、よろしければ音とびの原因になりそうな常駐ソフト( セキュリティソフトや、 便利機能などの常駐系ソフト )や、デバイス( 動作が重いことが多い USB接続型のサウンドデバイスやHDD等 )が 原因になっていないかご確認になってみてください m(_ _;m また、Windows10 はまだリリースされてから日が浅いので、使用されているデバイスのドライバが原因である可能性も ありますので、最新のドライバが無いかや、WindowsUpdate で新しい更新が無いか等もご確認になってみてください あと、原因の究明には繋がらないかもしれませんがひとつ気になることが・・・ 非同期読み込み際に音とびが発生するとのことですが、非同期読み込みではない場合( SetUseASyncLoadFlag を 使用しない場合 )は音とびは発生しないのでしょうか? 少し思ったのは、もし非同期読み込みが原因ではなく「画像が作成されるタイミングでストップ現象が発生する」ので あれば、グラフィックスデバイスのドライバが原因である可能性も考えられます 仮にそうであればグラフィックスデバイスのドライバのバージョンを最新にしてみたり、逆に少し古いバージョンの ドライバに変更してみたりすると現象が発生しなくなるかもしれません ( もしくはドライバの動作モードがデバッグモードになっている、等の設定関連が原因かもしれませんが・・・ ) 推測ばかりで申し訳ありません・・・
メンテ
Re: 非同期読込み中の音飛び ( No.8 )
名前:SUIMA(解決) 日時:2015/11/09 23:23

返信有り難うございます。 非同期読み込みをOFFにしてみた結果、それでも現象は発生しました。 完全にこちらの調査不足でした、申し訳ございません。 環境依存の問題として、この件は解決とさせていただきます。 管理人様、ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存