管理人様、お忙しい中すみません。
特に個々最近はサウンド関係でお世話になっています。
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; // ソフトの終了
}