トップページ > 記事閲覧
3D図形描画でのメモリ使用量増加
名前:YUKI 日時: 2022/06/12 15:17

複数の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:
メンテ

Page: 1 |

Re: 3D図形描画でのメモリ使用量増加 ( No.1 )
名前:管理人 日時:2022/06/13 00:41

載せていただいたプログラムを手元の GeForceGTX 1080 の Windows11 環境で 実行したところ、nの値をどれだけ大きくしてもメモリ使用量は 280MB でしたので 恐らく Intel(R) Iris(R) Xe Graphics のドライバの実装関係が原因で メモリが異常に消費しているのだと思います ところで、ログを拝見する限りでは使用されているDXライブラリのバージョンが 3.21b と少し古いようです( 2019年のバージョン ) 恐らく本件の現象とは関係が無いと思いますが、よろしければこちらの暫定の 最新バージョンをお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: 3D図形描画でのメモリ使用量増加 ( No.2 )
名前:YUKI 日時:2022/06/13 08:44

お教えいただきありがとうございます。ドライバの実装関係が原因と考えられる点、分かって安心しました。
メンテ

Page: 1 |

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

   クッキー保存