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:描画対象バッファのロックに失敗しました