複数の3D図形描画(DrawSphere3Dなど)を繰り返し描画するようなプログラム(以下)
において、以下のテスト環境下にて、メモリ使用量が描画回数に応じて線形に増加する
現象に遭遇しました。
すべてVS Community 2022のReleaseモードでテストしましたが、Debugモードでも同じです。
PC@・・・XPS13(Win11 HOME、i7-1195G7、RAM32GB、Intel(R) Iris(R) Xe Graphics)
PCA・・・自作PC(Win10 PRO、AMD Ryzen 9 3900X、RAM32GB、GeForce GTX 1660 Ti)
私が所有する2台のPCのうち、PC@の方ではプログラムのメモリ使用量が描画の繰り返し回数に伴い、
以下コードの場合では、最終的に1.2GBまで増加し、ClearDrawScreenでもメモリは解放されており
ませんでした。また、以下コードのnを例えば200などに増やすと、メモリ使用量が2GB弱まで到達した段階で、
Access violationでプログラムが異常終了します。
一方、PCAではメモリ使用量は、常に250MBほどで、以下コードのnを増やしても、描画回数に伴う明らか
なメモリ使用量の増加は確認できませんでした。
また、以下コードにおいて、★★★の位置でScreenFlip()を行うと、PC@においても、
対症的ですが問題を回避できるようです。
以下に、現象の再現性のために使ったプログラムとPC@において実行した際のLog.txtを貼り付けます。
【プログラム】
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// Zバッファを有効にする
SetUseZBuffer3D(TRUE);
// Zバッファへの書き込みを有効にする
SetWriteZBuffer3D(TRUE);
SetDrawScreen(DX_SCREEN_BACK);
int i, j, n = 100;
// 3D空間上に球を描画する
for (j = 0; j < n; j++) {
for (i = 0; i < n; i++) {
DrawSphere3D(VGet(320.0f * i / n, 200.0f * j / n, 0.0f), 80.0f, 32, GetColor(255, 0, 0), GetColor(255, 255, 255), TRUE);
ProcessMessage();
}
//ScreenFlip(); //★★★
}
ScreenFlip();
WaitKey(); // キー入力待ち
ClearDrawScreen();
ScreenFlip();
WaitKey(); // キー入力待ち
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
【Log.txt】
0:ChangeWindowMode実行
0:ウインドウモードフラグが立てられました
2:DXライブラリの初期化処理開始
3: システムの情報を出力します
3: DXライブラリ Ver3.21b
3: 論理プロセッサの数 : 8
4: OS Windows10 ( Build 22000 )
105: 現時点のCPU動作速度:大体2.93GHz
105: MMX命令を使用します
105: SSE命令が使用可能です
105: SSE2命令が使用可能です
105: CPUベンダ:GenuineIntel
106: CPU名:11th Gen Intel(R) Core(TM) i7-1195G7 @ 2.90GHz
106: COMの初期化... 成功
109: 非同期読み込み処理の初期化...成功
110: ファイルアクセス処理の初期化...成功
111: メモリ総量:32474.79MB 空きメモリ領域:20727.91MB
111: タイマーの精度を検査します
111: 精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
112: パフォーマンスカウンターを使用します タイマー精度 : 10000.000000 KHz
112: ソフトの二重起動検査... 二重起動はされていませんでした
113: ウインドウクラスを登録します... 登録に成功しました
113: ウインドウモード起動用のウインドウを作成します
113: ディスプレイ情報のセットアップ開始
114: モニターの数:1 ディスプレイデバイスの数:4
114: No.0 モニター名:\\.\DISPLAY1 2560x1440 32bit 60Hz
210: ディスプレイ情報のセットアップ完了
214: ウインドウの作成に成功しました
214: ウインドウを表示します
234: IMEを無効にしました
236: ウインドウスタイルをウインドウモード用に変更します... 完了
255: DirectInput関係初期化処理
255: XInput DLL の読み込み中... 成功
257: DirectInput7 の取得中... DirectInput8 の取得を試みます...成功
341: 引き続き初期化処理... 初期化成功
342: ジョイパッドの初期化...
447: ジョイパッドの初期化は正常に終了しました
447: マウスデバイスの初期化... 初期化成功
447: キーボードデバイスの初期化... 初期化成功
451: DirectInput 関連の初期化は正常に終了しました
454: DirectSound の初期化を行います
454: DirectSound インターフェースの取得を行います.... 成功
457: 引き続きインターフェースの初期化処理... 成功
658: DirectSound デバイスを列挙します
659: Module Name : Description : プライマリ サウンド ドライバー
659: Module Name : {0.0.0.00000000}.{25753a5b-4cd1-4ea1-8176-090d3c20d415} Description : PL2875UH (HD Audio Driver for Display Audio)
659: Module Name : {0.0.0.00000000}.{c90b190d-7de1-4193-80d5-8956af19b487} Description : Speakers (Realtek(R) Audio)
660: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz
660: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB
660: 利用可能サンプリング精度
660: Primary 16bit = OK 8bit = OK
660: Secondary 16bit = OK 8bit = OK
661: 利用可能チャンネル
661: Primary MONO = OK STEREO = OK
661: Secondary MONO = OK STEREO = OK
661: DirectSound の初期化は正常に終了しました
662: d3d11.dll の読み込み.... 成功
664: dxgi.dll の読み込み.... 成功
664: API CreateDXGIFactory1 のアドレスを取得します.... 成功
664: IDXGIFactory1 を作成します.... 成功
668: API D3D11CreateDevice のアドレスを取得します.... 成功
668: IDXGIAdapter を取得します.... 成功
668: Direct3D 11 FeatureLevel 11_0 以上を対象とします
669: ID3D11Device オブジェクトを取得します.... 成功
706: IDXGIDevice1 を取得します.... 成功
706: IDXGIDevice1->SetMaximunFrameLatency( 1 ); を実行しました
706: [ウインドウモード 640x480]
707: IDXGISwapChain を作成します.... 成功
709: IDXGIFactory->CreateSwapChain の戻り値:0x00000000
709: IDXGIOutput を取得します.... 成功
710: Graphics Device:Intel(R) Iris(R) Xe Graphics
710: 画面のフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です
710: 16bit Zバッファフォーマットは DXGI_FORMAT_D16_UNORM です
710: 24bit Zバッファフォーマットは DXGI_FORMAT_D24_UNORM_S8_UINT です
710: 32bit Zバッファフォーマットは DXGI_FORMAT_D32_FLOAT です
710: 16bit カラーフォーマットは DXGI_FORMAT_B5G6R5_UNORM です
711: 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です
711: アルファ付き 16bit カラーフォーマットは DXGI_FORMAT_B4G4R4A4_UNORM です
711: アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です
711: アルファテスト用 16bit カラーフォーマットは DXGI_FORMAT_B5G5R5A1_UNORM です
711: アルファテスト用 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です
711: DXT1テクスチャフォーマットは DXGI_FORMAT_BC1_UNORM です
711: DXT2テクスチャフォーマットは使えません
712: DXT3テクスチャフォーマットは DXGI_FORMAT_BC2_UNORM です
712: DXT4テクスチャフォーマットは使えません
712: DXT5テクスチャフォーマットは DXGI_FORMAT_BC3_UNORM です
712: ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です
712: ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です
712: ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です
712: 1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です
712: 1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です
713: 1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です
713: 1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です
713: 2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です
713: 2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です
713: 2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です
713: 2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です
713: 描画用 16bit カラーフォーマットは DXGI_FORMAT_B5G6R5_UNORM です
713: 描画用 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です
714: 描画用アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です
714: 描画用 ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です
714: 描画用 ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です
714: 描画用 ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です
714: 描画用1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です
715: 描画用1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です
715: 描画用1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です
715: 描画用1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です
715: 描画用2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です
715: 描画用2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です
715: 描画用2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です
715: 描画用2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です
716: 使用する機能レベル:D3D_FEATURE_LEVEL_11_1
716: 同時にレンダリングできるバッファの数:8
716: 最大テクスチャサイズ 幅:16384 高さ:16384
716: 標準描画用の頂点バッファの作成.... 成功
717: シェーダーコード関係の初期化.... 成功
733: 各種シェーダー用定数バッファの作成.... 成功
734: 各種 ID3D11InputLayout の作成.... 成功
776: 画像の単純転送処理の初期化... 成功
777: 深度バッファを作成します.... 成功
779: フォントの初期化を行います
782: フォントの初期化は正常に終了しました
782: 文字コードバッファの初期化を行います... 完了しました
786:DXライブラリの初期化処理終了
4664:フォントの初期化を行います
4664:フォントの初期化は正常に終了しました
5015:d3d11.dll の解放 1
5016:dxgi.dll の解放 1
5016:Direct3D11 のオブジェクト数を出力
5016:Direct3D11 のオブジェクト合計数 : 0
5017:DirectInput 関連の終了処理... 完了
5045:DirectSound の終了処理は正常に終了しました
5045:ウインドウを閉じようとしています
5051:ウインドウが破棄されようとしています
5051:ソフトを終了する準備が整いました
5107:COMを終了... 完了
5108:
5108:Alloc memory dump
5108: Total size:0(0.000kb) Alloc num:0
5108: