トップページ > 記事閲覧
メモリリークが発生してしまう
名前:初心者 日時: 2025/03/30 11:22

DXライブラリのC#版とVisualStudio 2022を使用してデスクトップマスコットを作成しているのですが、 >ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=3211 こちらのサンプルを参考にモデルを表示させようとしたところ、メモリリークが発生し、フリーズしてしまいました。 解決策を教えて頂けると幸いです。 よろしくお願いいたします。 【コード】 using System; using System.Collections.Generic; using System.Drawing; using System.Numerics; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using DxLibDLL; using System.Runtime.InteropServices; namespace DesktopMascot { static class Program { private static int Screen; private static int ScreenSizeX, ScreenSizeY; private static int SoftImage; private static int ModelHandle; private static int AttachIndex; private static float TotalTime; private static float PlayTime; private static float PlaySpeed; /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { // ウインドウモードで起動 DX.ChangeWindowMode(DX.TRUE); // 透過ウインドウ設定 DX.SetUseBackBufferTransColorFlag(DX.TRUE); // ウインドウサイズを設定 ScreenSizeX = 600; ScreenSizeY = 600; DX.SetGraphMode(ScreenSizeX, ScreenSizeY, 32); //描画の設定 DX.SetZBufferBitDepth(24); DX.SetCreateDrawValidGraphZBufferBitDepth(24); DX.SetFullSceneAntiAliasingMode(4, 2); // DXライブラリを初期化 if (DX.DxLib_Init() < 0) { return; } //常に最前面に表示 DX.SetWindowZOrder(DX.DX_WIN_ZTYPE_TOPMOST); // 描画対象にできるアルファチャンネル付き画面を作成 Screen = DX.MakeScreen(ScreenSizeX, ScreenSizeY, DX.TRUE); // 画面取り込み用のソフトウエア用画像を作成 SoftImage = DX.MakeARGB8ColorSoftImage(ScreenSizeX, ScreenSizeY); // モデルの読み込みとアニメーション設定 ModelHandle = DX.MV1LoadModel("Data/testmodel.pmd"); // 3Dモデルの読み込み AttachIndex = DX.MV1AttachAnim(ModelHandle, 0, -1, DX.FALSE); // モーションの読み込み TotalTime = DX.MV1GetAttachAnimTotalTime(ModelHandle, AttachIndex); // モーションの長さ取得 PlayTime = 0.0f; // モーションの開始時間 PlaySpeed = 0.6f; // モーションの再生速度 // モデルの透過率を設定(テスト用、最終的には影を透過) DX.MV1SetOpacityRate(ModelHandle, 0.5f); // モデルの描画時にRGB値をA値で乗算する設定にする DX.MV1SetUseDrawMulAlphaColor(ModelHandle, DX.TRUE); // 透過色を紫に設定 DX.SetTransColor(255, 0, 255); // 描画先を描画対象にできるアルファチャンネル付き画面にする DX.SetDrawScreen(Screen); // カメラ設定 DX.SetCameraNearFar(0.1f, 1000.0f); // 描画距離 DX.SetCameraPositionAndTarget_UpVecY( DX.VGet(0.0f, 10.0f, -30.0f), DX.VGet(0.0f, 10.0f, 0.0f)); // カメラ位置と注視点 // メインループ while (DX.ProcessMessage() == 0 && DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) == 0) { // 画面をクリア DX.ClearDrawScreen(); // アニメーションの更新 PlayTime += PlaySpeed; if (PlayTime >= TotalTime) PlayTime = 0.0f; DX.MV1SetAttachAnimTime(ModelHandle, AttachIndex, PlayTime); // モデルの描画 DX.MV1DrawModel(ModelHandle); // 描画先の画像をソフトイメージに取得する DX.GetDrawScreenSoftImage(0, 0, ScreenSizeX, ScreenSizeY, SoftImage); // 取り込んだソフトイメージを使用して透過ウインドウの状態を更新する DX.UpdateLayerdWindowForSoftImage(SoftImage); // 少し待つ DX.WaitTimer(12); } // DXライブラリの後始末 DX.DxLib_End(); } } } 【ログ】 0:ChangeWindowMode実行 0:ウインドウモードフラグが立てられました 3:DXライブラリの初期化処理開始 4: システムの情報を出力します 4: DXライブラリ Ver3.24d 5: 論理プロセッサの数 : 12 5: OS Windows11 ( Build 26100 ) 6: COMの初期化... 成功 6: 非同期読み込み処理の初期化...成功 7: ファイルアクセス処理の初期化...成功 8: メモリ総量:32680.61MB 空きメモリ領域:20794.38MB 8: タイマーの精度を検査します 9: 精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 9: パフォーマンスカウンターを使用します タイマー精度 : 10000.000000 KHz 10: 11: ソフトの二重起動検査... 二重起動はされていませんでした 12: ウインドウクラスを登録します... 登録に成功しました 12: ウインドウモード起動用のウインドウを作成します 13: ディスプレイ情報のセットアップ開始 14: モニターの数:1 ディスプレイデバイスの数:3 14: No.0 モニター名:\\.\DISPLAY1 1920x1080 32bit 59Hz 96x96dpi 20: ディスプレイ情報のセットアップ完了 20: ウインドウ矩形 ( 644, 189 )-( 1260, 828 ) 23: ウインドウの作成に成功しました 23: ウインドウを表示します 49: IMEを無効にしました 52: ウインドウスタイルをウインドウモード用に変更します... 完了 76: XInput DLL の読み込み中... 成功 78: DirectInput関係初期化処理 78: DirectInput8 の取得を試みます...成功 90: 引き続き初期化処理... 初期化成功 93: ジョイパッドの初期化... 93: XInput 対応コントローラーのチェックを開始します 93: XInput 対応コントローラー No.0 をチェック 95: XInput 対応コントローラー No.0 の接続は確認できませんでした 95: XInput 対応コントローラー No.1 をチェック 95: XInput 対応コントローラー No.1 の接続は確認できませんでした 96: XInput 対応コントローラー No.2 をチェック 96: XInput 対応コントローラー No.2 の接続は確認できませんでした 97: XInput 対応コントローラー No.3 をチェック 97: XInput 対応コントローラー No.3 の接続は確認できませんでした 97: XInput 対応コントローラーのチェック完了 98: DirectInput 対応ジョイパッドの列挙を開始します 178: DirectInput 対応ジョイパッドの列挙終了 179: ジョイパッドの初期化は正常に終了しました 179: マウスデバイスの初期化... 初期化成功 180: キーボードデバイスの初期化... 初期化成功 184: DirectInput 関連の初期化は正常に終了しました 193: WASAPI の初期化を行います 199: デバイス名 : Headphones (High Definition Audio Device) 203: デフォルト遅延時間 : 10.000 ms 204: 最小遅延時間 : 2.667 ms 204: 遅延時間 : 10.000 ms 204: チャンネル数   : 2 ch 205: 量子化ビット深度 : 32 bit 205: 有効ビット深度  : 32 bit 205: サンプリングレート : 48000 Hz 205: データ形式 : 浮動小数点型 211: 動作モード : 共有モード 212: WASAPI の初期化は正常に終了しました 214: d3d11.dll の読み込み.... 成功 222: dxgi.dll の読み込み.... 成功 223: API CreateDXGIFactory2 のアドレスを取得します.... 成功 223: IDXGIFactory2 を作成します.... 成功 227: API CreateDXGIFactory6 のアドレスを取得します.... 成功 227: IDXGIAdapter を列挙 228: Adapter No.0 Desc:AMD Radeon RX 6500 XT VRAM:3072MB 228: Output Device No.0 Name:\\.\DISPLAY1 ( 0, 0 )-( 1920, 1080 ) 229: Adapter No.1 Desc:Microsoft Basic Render Driver VRAM:0MB 229: API D3D11CreateDevice のアドレスを取得します.... 成功 229: IDXGIAdapter を取得します.... 成功 230: IDXGIAdapter1 を取得します.... 成功 231: IDXGIAdapter2 を取得します.... 成功 231: IDXGIAdapter3 を取得します.... 成功 232: IDXGIAdapter4 を取得します.... 成功 232: Direct3D 11 FeatureLevel 11_0 以上を対象とします 233: ID3D11Device オブジェクトを取得します.... 成功 270: IDXGIDevice1 を取得します.... 成功 270: IDXGIDevice1->SetMaximunFrameLatency( 1 ); を実行しました 271: [ウインドウモード 600x600 ( 660, 227 )-( 1260, 827 )] 271: IDXGISwapChain2 を作成します.... 成功 272: IDXGIFactory2->CreateSwapChainForHwnd の戻り値:0x00000000 273: IDXGIOutput を取得します.... 成功 273: Graphics Device:AMD Radeon RX 6500 XT 274: 画面のフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 275: 16bit Zバッファフォーマットは DXGI_FORMAT_D16_UNORM です 275: 24bit Zバッファフォーマットは DXGI_FORMAT_D24_UNORM_S8_UINT です 275: 32bit Zバッファフォーマットは DXGI_FORMAT_D32_FLOAT です 275: 16bit カラーフォーマットは DXGI_FORMAT_B5G6R5_UNORM です 276: 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 276: アルファ付き 16bit カラーフォーマットは DXGI_FORMAT_B4G4R4A4_UNORM です 276: アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 277: アルファテスト用 16bit カラーフォーマットは DXGI_FORMAT_B5G5R5A1_UNORM です 277: アルファテスト用 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 277: DXT1テクスチャフォーマットは DXGI_FORMAT_BC1_UNORM です 277: DXT2テクスチャフォーマットは使えません 278: DXT3テクスチャフォーマットは DXGI_FORMAT_BC2_UNORM です 278: DXT4テクスチャフォーマットは使えません 278: DXT5テクスチャフォーマットは DXGI_FORMAT_BC3_UNORM です 278: BC7_UNORM テクスチャフォーマットは DXGI_FORMAT_BC7_UNORM です 279: BC7_UNORM_SRGB テクスチャフォーマットは DXGI_FORMAT_BC7_UNORM_SRGB です 279: ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です 279: ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です 279: ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です 280: 1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です 280: 1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です 280: 1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です 280: 1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です 281: 2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です 281: 2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です 281: 2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です 281: 2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です 282: 描画用 16bit カラーフォーマットは DXGI_FORMAT_B5G6R5_UNORM です 282: 描画用 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 282: 描画用アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 283: 描画用 ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です 283: 描画用 ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です 283: 描画用 ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です 283: 描画用1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です 283: 描画用1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です 284: 描画用1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です 284: 描画用1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です 284: 描画用2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です 284: 描画用2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です 285: 描画用2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です 285: 描画用2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です 285: 使用する機能レベル:D3D_FEATURE_LEVEL_11_1 285: 同時にレンダリングできるバッファの数:8 286: 最大テクスチャサイズ 幅:16384 高さ:16384 286: 標準描画用の頂点バッファの作成.... 成功 287: シェーダーコード関係の初期化.... 成功 318: 各種シェーダー用定数バッファの作成.... 成功 319: 各種 ID3D11InputLayout の作成.... 成功 342: 画像の単純転送処理の初期化... 成功 343: 深度バッファを作成します.... 成功 346: フォントの初期化を行います 348: フォントの初期化は正常に終了しました 472: 文字コードバッファの初期化を行います... 完了しました 488:DXライブラリの初期化処理終了 489:ウインドウスタイルをウインドウモード用に変更します... 完了 40380:描画対象バッファ読み取り用のテクスチャの作成に失敗しました 40380:描画対象バッファのロックに失敗しました 40394:描画対象バッファ読み取り用のテクスチャの作成に失敗しました 40394:描画対象バッファのロックに失敗しました 40408:描画対象バッファ読み取り用のテクスチャの作成に失敗しました 40409:描画対象バッファのロックに失敗しました …… 41463:描画対象バッファ読み取り用のテクスチャの作成に失敗しました 41463:描画対象バッファのロックに失敗しました 41480:描画対象バッファ読み取り用のテクスチャの作成に失敗しました 41480:描画対象バッファのロックに失敗しました
メンテ

Page: 1 |

Re: メモリリークが発生してしまう ( No.1 )
名前:管理人 日時:2025/03/31 01:49

載せていただいたプログラムを手元の環境で実行してみたのですが、特に使用メモリが 増え続ける等の問題も発生せず、正常に動作しました 最新の 3.24f であれば正常に動作するかもしれませんので、よろしければ こちらの最新版をお試しになってみてください m(_ _)m https://dxlib.xsrv.jp/DxLib/DxLibDotNet3_24f.zip
メンテ
Re: メモリリークが発生してしまう ( No.2 )
名前:初心者 日時:2025/03/31 13:49

ご返信ありがとうございます。 最新版を試しましたが、メモリリークが発生しました。 調べたところ、どうやらグラフィックボードのドライバーが有効になっていると メモリリークが発生してしまうようです。 【環境】 OS:Windows 11 Pro 64bit グラボ:AMD Radeon RX 6500 XT グラボのドライバーのバージョン:32.0.11027.2001 こちらの不具合を修正していただくことは可能でしょうか?
メンテ
Re: メモリリークが発生してしまう ( No.3 )
名前:管理人 日時:2025/04/01 00:19

最新版でも駄目でしたか… > こちらの不具合を修正していただくことは可能でしょうか? すみません、手元に Radion RX 6500 XT が無いのですぐに修正することは難しいかもしれません DXライブラリはデフォルトでは Direct3D 11 を使用しているのですが、 DX.DxLib_Init() の呼び出しより前の箇所に DX.SetUseDirect3DVersion( DX.DX_DIRECT3D_9EX ); と記述することで Direct3D 9 を使用するようにすることができます Direct3D 9 であれば本件の不具合が発生しないかもしれませんので、 よろしければ試してみて頂けないでしょうか? m(_ _)m
メンテ
Re: メモリリークが発生してしまう ( No.4 )
名前:初心者(解決) 日時:2025/04/01 09:24

ご返信ありがとうございます。 Direct3D 9 を使用するようにしたところ、メモリリークが発生しなくなりました。 対応ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存