トップページ > 記事閲覧
サウンドの再生関係で質問です。
名前:ケジメ 日時: 2015/06/24 00:18

管理人様、お忙しい中すみません。 特に個々最近はサウンド関係でお世話になっています。 Directサウンド関係での質問です。 VC++ 2013版 DXlib 3.14e Windows 7環境です。 本題ですが、3D空間上で効果音を鳴らすために効果音を複数読込(一つの効果音をLoadSoundMemで読込、DuplicateSoundMemで複製)してるのですが、この状態でメモリ消費が増えるのは理解しています。 サウンドを再生する際に再生スレッド(バッファとか色々)が生成されてメモリ消費が増えるとの認識もあります。 ですが、サウンドが鳴り終った後もメモリの使用量(サウンド再生に用いたメモリ)が減らないのが気になりました。(スレッドが削除されていない? API等に変化があった?) もし、自分の何かの勘違い等であればよいのですが。 簡単な再現プログラムを記載しておきます。 効果音はDxlibに付いてるサンプルを使用しています。 #include "DxLib.h" int fpscnt; int avev; #define sNum 100 int WorkSize(void) { typedef struct { DWORD cb; DWORD PageFaultCount; SIZE_T PeakWorkingSetSize; SIZE_T WorkingSetSize; SIZE_T QuotaPeakPagedPoolUsage; SIZE_T QuotaPagedPoolUsage; SIZE_T QuotaPeakNonPagedPoolUsage; SIZE_T QuotaNonPagedPoolUsage; SIZE_T PagefileUsage; SIZE_T PeakPagefileUsage; } info_t; typedef BOOL(WINAPI*func_t)(HANDLE, info_t*, DWORD); static func_t func; static enum { FIRST, OK, ERR } flag; static HANDLE proc; info_t info; HINSTANCE dll; if (flag == FIRST) { if ((dll = LoadLibraryA("psapi")) == 0) { flag = ERR; return 0; } func = (func_t)GetProcAddress(dll, "GetProcessMemoryInfo"); if (func == 0) { flag = ERR; return 0; } proc = GetCurrentProcess(); flag = OK; } if (flag == ERR) return 0; func(proc, &info, sizeof info); return(int)info.WorkingSetSize; } inline void Show_fps(int c){ int i; static int fs[60 + 1], ti; wchar_t l_str[256]; fs[fpscnt % 60] = GetNowCount() - ti; ti = GetNowCount(); if ((fpscnt % 60) == 59){ avev = 0; for (i = 0; i<60; i++) avev += fs[i]; avev /= 60; } // 物理メモリの使用容量 if (avev != 0) { swprintf_s(l_str, 256, L"%.1fF M:%uMb %d", 1000.0 / (double)avev, WorkSize() / 1024000,c); DrawString(0, 0, l_str, GetColor(255, 255, 255), GetColor(0, 0, 0)); } fpscnt++; return; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int SHandle[sNum+1], cnt = 0, ccnt = 0; SetUseDirect3DVersion(DX_DIRECT3D_9); SetUseDirect3D9Ex(TRUE); Set3DSoundOneMetre(1.0f); ChangeWindowMode(true); if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } SetDrawScreen(DX_SCREEN_BACK); SetCreate3DSoundFlag(true); SHandle[0] = LoadSoundMem(L"test.wav",1); ChangeVolumeSoundMem(100, SHandle[0]); Set3DRadiusSoundMem(200.0f, SHandle[0]); for (int i = 1; i < sNum; i++) { SHandle[i] = DuplicateSoundMem(SHandle[0], 3); ChangeVolumeSoundMem(100, SHandle[i]); Set3DRadiusSoundMem(200.0f, SHandle[i]); } while (!ProcessMessage()) { ClearDrawScreen(); if (cnt >= 10) { cnt = 0; Set3DPositionSoundMem(VGet(GetRand(100), GetRand(100), GetRand(100)), SHandle[ccnt]); PlaySoundMem(SHandle[ccnt], DX_PLAYTYPE_BACK); ccnt++; if (ccnt >= sNum) ccnt = 0; } else cnt++; Show_fps(ccnt); ScreenFlip(); } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
メンテ

Page: 1 |

Re: サウンドの再生関係で質問です。 ( No.1 )
名前:ケジメ 日時:2015/06/24 00:28

追記です。 複製した数だけ再生されれば、メモリの使用量の上昇は止まります。
メンテ
Re: サウンドの再生関係で質問です。 ( No.2 )
名前:管理人 日時:2015/06/25 01:21

以前のバージョンと挙動が異なるということでしょうか? 少し調べた限りでは使用メモリが増えるタイミングは DirectSound の API( サウンドの再生を開始する API ) の中なので、 DXライブラリの初期の頃から現在の挙動だったと思います ( そして何故 DirectSound のサウンド再生 API を呼び出すとメモリ使用量が増えるのかは、 API の中でどのような処理が行われているのか分からないので、不明です ) ただ一つ思い当たる点として、数ヶ月前までの1年間ほど、初期状態で使用するサウンド用の API を DirectSound から XAudio2 に変更していたというのがあります 現在も DxLib_Init の呼び出し前に SetEnableXAudioFlag( TRUE ) ; という記述を増やせば XAudio2 を使用するようになるのですが、こちらにしてみたところ載せていただいたサンプルでも 使用メモリの増え方が緩やかになりました ( 因みに3Dサウンドの再生には DirectSound よりも XAudio2 の方が適しているので、 よろしければ DxLib_Init の前に SetEnableXAudioFlag( TRUE ) ; を記述してみてください ) 因みに XAudio2 をデフォルトでは使用しなくなった理由ですが、デバッグ起動をした際に XAudio2 の DLL を読み込むタイミングでOSが数十秒間停止するという現象がありまして、 酷い時は15分近く停止したままになることもあり、殆どの方が3Dサウンドを使用しない現状で XAudio2 を初期状態で使用する API にするのは好ましくないと思い DirectSound に戻しました 話が少し本題から逸れてしまいました、要約しますと ・メモリが増える原因は不明( DirectSound の中で増えている ) ・DirectSound はDXライブラリ初期の頃から使用していたのでずっと前から現在の挙動だったはず ・ただ数ヶ月前から1年間ほど DirectSound の代わりに XAudio2 が初期状態の使用 API だった となります m(_ _)m
メンテ
Re: サウンドの再生関係で質問です。 ( No.3 )
名前:ケジメ(解決) 日時:2015/06/25 14:04

管理人様、お手数をお掛けしてすみません。 XAudio2が初期で有効の頃に3Dサウンドを使用していた頃と勘違いした模様です。 真に申し訳ありません。
メンテ

Page: 1 |

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

   クッキー保存