トップページ > 記事閲覧
DX.DxLib_Init()が終了しない
名前:そら 日時: 2017/07/12 14:36

はじめまして、そらと申します。 Windows7、デュアルディスプレイの環境下で、C#経由でDXライブラリを使用させていただいております。 現在、DXライブラリの初期化が終了しないことがあり、困っております。 具体的には、DX.DxLib_Init()メソッドを呼び出した後、次の処理に移りません。 おおよそ50%程度の頻度で発生しております。 このとき、log.txtは毎回、 「画像の単純転送処理の初期化... 成功」 で止まっており、次の 「フォントの初期化を行います」 が出力されません。 Log.txtは下記の通りです。 どのような原因が考えられるでしょうか? 0:ChangeWindowMode実行 0:ウインドウモードフラグが立てられました 15:DXライブラリの初期化処理開始 31: システムの情報を出力します 31: DXライブラリ Ver3.18c 31: 論理プロセッサの数 : 4 46: OS Windows7 ( Build 7601 Service Pack 1 ) 146: 現時点のCPU動作速度:大体2.30GHz 152: MMX命令を使用します 156: SSE命令が使用可能です 160: SSE2命令が使用可能です 164: CPUベンダ:GenuineIntel 185: CPU名:Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz 192: COMの初期化... 成功 200: 非同期読み込み処理の初期化...成功 209: ファイルアクセス処理の初期化...成功 218: メモリ総量:3981.67MB 空きメモリ領域:2926.79MB 222: タイマーの精度を検査します 226: 精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 230: パフォーマンスカウンターを使用します タイマー精度 : 2648.554000 KHz 238: ソフトの二重起動検査... 二重起動はされていませんでした 251: ウインドウクラスを登録します... 登録に成功しました 262: ウインドウモード起動用のウインドウを作成します 266: ディスプレイ情報のセットアップ開始 271: モニターの数:2 ディスプレイデバイスの数:6 276: No.0 モニター名:\\.\DISPLAY1 1680x1050 32bit 59Hz 280: No.1 モニター名:\\.\DISPLAY2 1024x768 32bit 59Hz 593: ディスプレイ情報のセットアップ完了 597: ウインドウの作成に成功しました 601: ウインドウを表示します 621: IMEを無効にしました 625: ウインドウスタイルをウインドウモード用に変更します... 完了 652: DirectInput関係初期化処理 657: XInput DLL の読み込み中... 成功 671: DirectInput7 の取得中... DirectInput8 の取得を試みます...成功 695: 引き続き初期化処理... 初期化成功 708: ジョイパッドの初期化... 716: ジョイパッドの初期化は正常に終了しました 720: マウスデバイスの初期化... 初期化成功 729: キーボードデバイスの初期化... 初期化成功 741: DirectInput 関連の初期化は正常に終了しました 750: DirectSound の初期化を行います 755: DirectSound インターフェースの取得を行います.... 成功 774: 引き続きインターフェースの初期化処理... 成功 855: DirectSound デバイスを列挙します 860: Module Name : Description : プライマリ サウンド ドライバー 864: Module Name : {0.0.0.00000000}.{2aeeb39c-d02b-4115-8432-e392e64c108f} Description : (2- インテル(R) ディスプレイ用オーディオ) 868: Module Name : {0.0.0.00000000}.{4d01fdda-8c61-4b0d-8d7b-3de4082a7617} Description : DELL E2009W (2- インテル(R) ディスプレイ用オーディオ) 872: Module Name : {0.0.0.00000000}.{c3f9160f-c1da-4cc6-b65c-d5b35278d978} Description : Realtek Digital Output (2- Realtek High Definition Audio) 876: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 880: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 884: 利用可能サンプリング精度 888: Primary 16bit = OK 8bit = OK 892: Secondary 16bit = OK 8bit = OK 896: 利用可能チャンネル 900: Primary MONO = OK STEREO = OK 905: Secondary MONO = OK STEREO = OK 909: DirectSound の初期化は正常に終了しました 914: BEEP音用のサウンドバッファの作成に失敗しました 920: d3d11.dll の読み込み.... 成功 943: dxgi.dll の読み込み.... 成功 956: API CreateDXGIFactory1 のアドレスを取得します.... 成功 965: IDXGIFactory1 を作成します.... 成功 977: API D3D11CreateDevice のアドレスを取得します.... 成功 989: IDXGIAdapter を取得します.... 成功 1003: Direct3D 11 FeatureLevel 11_0 以上を対象とします 1009: ID3D11Device オブジェクトを取得します.... 成功 2007: IDXGIDevice1 を取得します.... 成功 2016: IDXGIDevice1->SetMaximunFrameLatency( 1 ); を実行しました 2020: [ウインドウモード 2704x1050] 2025: IDXGISwapChain を作成します.... 成功 2037: IDXGIFactory->CreateSwapChain の戻り値:0x00000000 2041: IDXGIOutput を取得します.... 成功 2050: Graphics Device:Intel(R) HD Graphics 530 2054: 画面のフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 2058: 16bit Zバッファフォーマットは DXGI_FORMAT_D16_UNORM です 2062: 24bit Zバッファフォーマットは DXGI_FORMAT_D24_UNORM_S8_UINT です 2066: 32bit Zバッファフォーマットは DXGI_FORMAT_D32_FLOAT です 2072: カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 2076: DXT1テクスチャフォーマットは DXGI_FORMAT_BC1_UNORM です 2082: DXT2テクスチャフォーマットは使えません 2085: DXT3テクスチャフォーマットは DXGI_FORMAT_BC2_UNORM です 2089: DXT4テクスチャフォーマットは使えません 2094: DXT5テクスチャフォーマットは DXGI_FORMAT_BC3_UNORM です 2099: ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です 2103: ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です 2107: ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です 2115: 1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です 2119: 1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です 2124: 1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です 2128: 1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です 2132: 2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です 2137: 2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です 2142: 2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です 2147: 2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です 2152: 描画用 16bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 2156: 描画用 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 2161: 描画用アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 2165: 描画用 ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です 2170: 描画用 ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です 2174: 描画用 ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です 2178: 描画用1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です 2182: 描画用1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です 2186: 描画用1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です 2190: 描画用1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です 2196: 描画用2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です 2200: 描画用2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です 2204: 描画用2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です 2208: 描画用2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です 2213: 使用する機能レベル:D3D_FEATURE_LEVEL_11_0 2218: 同時にレンダリングできるバッファの数:8 2222: 最大テクスチャサイズ 幅:16384 高さ:16384 2226: 標準描画用の頂点バッファの作成.... 成功 2235: 深度バッファを作成します.... 成功 2245: シェーダーコード関係の初期化.... 成功 2297: 各種シェーダー用定数バッファの作成.... 成功 2339: 各種 ID3D11InputLayout の作成.... 成功 2403: 画像の単純転送処理の初期化... 成功 ご参考までに、下記のようにコーディングしております。 public void Init() { Mutex mutex = new Mutex(false, Application.ProductName + ":MoviePlayer.Init()"); try { if (!mutex.WaitOne(60000, false)) { log.Error("Init():タイムアウト時間内にMutexを取得できませんでした。"); return; } int res = 0; res = DX.SetApplicationLogSaveDirectory("D:\\BS1\\AlphaMoviePlayer"); res = DX.SetUseDateNameLogFile(1); res = DX.SetOutApplicationLogValidFlag(1); // ウインドウモードで起動 res = DX.ChangeWindowMode(DX.TRUE); if (res != 0) { log.Error("init:ChangeWindowMode:" + res.ToString()); return; } // 透過ウインドウ設定 res = DX.SetUseBackBufferTransColorFlag(DX.TRUE); if (res != 0) { log.Error("init:SetUseBackBufferTransColorFlag:" + res.ToString()); return; } res = DX.SetDoubleStartValidFlag(DX.TRUE); if (res != 0) { log.Error("init:SetDoubleStartValidFlag:" + res.ToString()); return; } // 画面モードの設定 res = DX.SetGraphMode(this.screenSize.Width, this.screenSize.Height, 32); if (res != 0) { log.Error("init:SetGraphMode:" + res.ToString()); } // DXライブラリを初期化 res = DX.DxLib_Init(); if (res < 0) { log.Error("init:DxLib_Init:" + res.ToString()); return; } res = DX.SetAlwaysRunFlag(DX.TRUE); if (res != 0) { log.Error("init:SetAlwaysRunFlag:" + res.ToString()); } this.window = new WindowController("DxLib"); this.window.SetWindowPosition(WindowPosition.Bottom); this.isRunning = true; ThreadStart movStart = new ThreadStart(this.playingMovie); this.movThread = new Thread(movStart); this.movThread.Start(); ThreadStart sStart = new ThreadStart(this.playingSound); this.soundThread = new Thread(sStart); this.soundThread.Start(); } finally { try { mutex.ReleaseMutex(); mutex.Close(); } catch (Exception ex) { log.Error("Init():Close Mutex Error:" + ex.ToString()); } } }
メンテ

Page: 1 |

Re: DX.DxLib_Init()が終了しない ( No.1 )
名前:そら 日時:2017/07/12 14:40

[補足]Mutexを利用している利用について。 二つのプロセスでDXライブラリを使用しており、ほぼ同時に初期化が行われます。 このために障害が発生しているのかと考え、Mutexを利用して排他制御を試みましたが、同じでした。 そもそも、初期化が終わらないのは一つ目に実行されるプロセスでした。 したがって、初期化処理がかちあってしまったことによって障害発生しているわけではないと結論づけています。
メンテ
Re: DX.DxLib_Init()が終了しない ( No.2 )
名前:管理人 日時:2017/07/13 01:33

二つのプロセスで同時に起動している関係で、DXライブラリの標準の動作である 『非アクティブになったら、アクティブになるまで待つ』という処理が作動して プログラムの進行が止まってしまっている可能性があります res = DX.SetAlwaysRunFlag(DX.TRUE); ↑こちらの処理を DxLib_Init の呼び出し前に実行すれば『非アクティブになったら、アクティブになるまで待つ』の 処理が行われなくなるので、意図された通りの挙動になるかもしれません
メンテ
Re: DX.DxLib_Init()が終了しない ( No.3 )
名前:そら 日時:2017/07/13 13:37

お教え頂いた方法で、現象が再現しなくなりました。 ありがとうございます。 なお、二つのプロセスで同時に起動している件について、初期化時・再生時等、利用側で排他制御を加える必要はありますでしょうか? それとも不要でしょうか?
メンテ
Re: DX.DxLib_Init()が終了しない ( No.4 )
名前:管理人 日時:2017/07/14 01:38

> なお、二つのプロセスで同時に起動している件について、初期化時・再生時等、利用側で排他制御を加える必要はありますでしょうか? > それとも不要でしょうか? プロセスが異なるのであれば不要だと思います ( DirectX の機能も( ウインドウモードであれば )プロセス毎に独立していますので )
メンテ
Re: DX.DxLib_Init()が終了しない ( No.5 )
名前:そら 日時:2017/07/14 10:27

了解いたしました。 ありがとうございます。
メンテ

Page: 1 |

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

   クッキー保存