トップページ > 記事閲覧
たまにMakeScreenに失敗する
名前:8127 日時: 2017/08/06 15:28

DXライブラリを使わせていただいております。 さて、題名通り、MakeScreen関数が失敗してしまうことがあって悩んでいます。(返り値が-1になる) ・引数に問題はない MakeScreen(96,48,TRUE)など ・ver3.16fで発生したので最新版3.18cに変えてみたがそれでも発生する。3.16以前のバージョンで発生したことはない ・長時間PCを起動したままのときに体感多く起きる気がする、一度この現象が発生するとPCを再起動しない限り治らない ・一方、PCを再起動すると同じコードで正常に動作する ・プログラムを起動してすぐに起きるのでハンドル上限数に達してはいないと思われる ・他の場所のmalloc等は成功しているのでメモリが足りないわけでもなさそう どうかよろしくお願いいたします。 Windows7 Professional SP1 64bit VC++ 2017 community 最新版 MakeScreenに失敗したときのログを添付します。 ソースコードは言ってもらえれば部分的には上げられますが、大規模かつ依存関係の多いプロジェクトなので全部上げるのは厳しいです。 0:ChangeWindowMode実行 1:ウインドウモードフラグが立てられました 8:ディスプレイ情報のセットアップ開始 10: モニターの数:2 ディスプレイデバイスの数:6 11: No.0 モニター名:\\.\DISPLAY1 1366x768 32bit 60Hz 12: No.1 モニター名:\\.\DISPLAY2 1920x1080 32bit 60Hz 90:ディスプレイ情報のセットアップ完了 94:DXライブラリの初期化処理開始 99: システムの情報を出力します 99: DXライブラリ Ver3.16f 100: 論理プロセッサの数 : 4 100: OS Windows7 ( Build 7601 Service Pack 1 ) 201: 現時点のCPU動作速度:大体2.58GHz 202: MMX命令を使用します 202: SSE命令が使用可能です 203: SSE2命令が使用可能です 203: CPUベンダ:GenuineIntel 207: CPU名: Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz 207: COMの初期化... 成功しました 221: メモリ総量:8086.17MB 空きメモリ領域:2766.07MB 221: タイマーの精度を検査します 222: 精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 223: パフォーマンスカウンターを使用します タイマー精度 : 2533.339000 KHz 224: ソフトの二重起動検査... 二重起動はされていませんでした 227: ウインドウクラスを登録します... 登録に成功しました 228: ウインドウモード起動用のウインドウを作成します 467: ウインドウの作成に成功しました 467: ウインドウを表示します 1363: IMEを無効にしました 1364: ウインドウスタイルをウインドウモード用に変更します... 完了 1409: DirectInput関係初期化処理 1409: XInput DLL の読み込み中... 成功 1490: DirectInput7 の取得中... DirectInput8 の取得を試みます...成功 1523: 引き続き初期化処理... 初期化成功 1536: ジョイパッドの初期化... 1578: 入力装置を見つけました 1579: Device Instance Name : PC Game Controller 1579: Device Product Name : PC Game Controller 1580: 周期的エフェクトの作成に失敗しました。 1582: ジョイパッドの追加は正常に終了しました 1583: ジョイパッドの初期化は正常に終了しました 1583: マウスデバイスの初期化... 初期化成功 1584: キーボードデバイスの初期化... 初期化成功 1585: DirectInput 関連の初期化は正常に終了しました 1591: DirectSound の初期化を行います 1592: DirectSound インターフェースの取得を行います.... 成功 1598: 引き続きインターフェースの初期化処理... 成功 1662: DirectSound デバイスを列挙します 1663: Module Name : Description : プライマリ サウンド ドライバー 1664: Module Name : {0.0.0.00000000}.{8455e110-f5b1-4157-8e24-93e035583be1} Description : スピーカー (Realtek High Definition Audio) 1664: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 1664: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 1665: 利用可能サンプリング精度 1665: Primary 16bit = OK 8bit = OK 1666: Secondary 16bit = OK 8bit = OK 1666: 利用可能チャンネル 1666: Primary MONO = OK STEREO = OK 1667: Secondary MONO = OK STEREO = OK 1668: DirectSound の初期化は正常に終了しました 1669: BEEP音用のサウンドバッファの作成に失敗しました 1669: d3d11.dll の読み込み.... 成功 1675: dxgi.dll の読み込み.... 成功 1675: API CreateDXGIFactory1 のアドレスを取得します.... 成功 1676: IDXGIFactory1 を作成します.... 成功 1682: API D3D11CreateDevice のアドレスを取得します.... 成功 1683: IDXGIAdapter を取得します.... 成功 1684: Direct3D 11 FeatureLevel 11_0 以上を対象とします 1684: ID3D11Device オブジェクトを取得します.... 失敗 1708: d3d11.dll の解放 1 1708: dxgi.dll の解放 1 1709: Direct3D11 のオブジェクト数を出力 1709: Direct3D11 のオブジェクト合計数 : 0 1715: DirectDraw オブジェクトの取得を行います.... 成功 1722: 引き続き初期化処理... 初期化に成功しました 1731: IDirect3D9Ex オブジェクトを取得します.... 成功 1735: IDirect3DDevice9Ex オブジェクトを取得します.... Direct3DDevice9Ex の作成に失敗しました 1739: IDirect3DDevice9Ex オブジェクトを取得します.... Direct3DDevice9Ex の作成に失敗しました 1743: IDirect3DDevice9Ex オブジェクトを取得します.... Direct3DDevice9Ex の作成に失敗しました 1747: IDirect3DDevice9Ex オブジェクトを取得します.... Direct3DDevice9Ex の作成に失敗しました 1752: d3d9.dll の解放 1 1754: DirectDraw オブジェクトの取得を行います.... 成功 1755: 引き続き初期化処理... 初期化に成功しました 1822: フォントの初期化を行います 1827: フォントの初期化は正常に終了しました 1828: 文字コードバッファの初期化を行います... 完了しました 1830:DXライブラリの初期化処理終了
メンテ

Page: 1 |

Re: たまにMakeScreenに失敗する ( No.1 )
名前:管理人 日時:2017/08/07 00:39

ログを拝見する限りでは Direct3D 11、 Direct3D 9 のどちらの初期化にも失敗していて、 ソフトウエアレンダリングモードで起動しているようです そして、ソフトウエアレンダリングモードではアルファチャンネルつきの描画対象にできる画像の 作成はできないので、MakeScreen の第三引数を TRUE にして呼び出すと無条件で -1 が返ってきます なので、根本的な原因は Direct3D 11、 Direct3D 9 の初期化に失敗してしまっていることなのですが、 お使いのPCに搭載されているグラフィックスデバイスは何でしょうか?( Geforce や Radeon など ) ただ、Direct3D 11, Direct3D 9 の初期化に失敗することに関してはDXライブラリ側では どうしようも無いので、グラフィックスデバイスのドライバを最新のものに更新してみたり、 グラフィックスデバイス自体が不調である可能性もありますので、その場合はグラフィックスデバイスの 交換を検討されてみたりしてください
メンテ
Re: たまにMakeScreenに失敗する ( No.2 )
名前:8127(解決) 日時:2017/08/07 12:28

管理人様、 グラフィックスデバイスはIntel(R) HD Graphics 4000 です。 なるほど、DirectX自体の不具合なのですね。 とりあえず、プログラム自体にはバグがないようなのでほっとしています。(後々不特定多数に公開するかもしれないので...) グラフィックスデバイスの調子が悪いのはこちらの問題ですし、今のところは再起動すれば直るので 勝手ながら解決とさせていただきます。ありがとうございました。
メンテ
Re: たまにMakeScreenに失敗する ( No.3 )
名前:8127 日時:2017/08/13 17:43

一度は解決とさせていただきましたがまた同じことについて不明な点がありましたので質問させていただきます。 ↑の状況(ソフトウエアレンダリングモードで起動してしまった場合)はどちらにせよゲームはできないので、 起動時にダイアログを出して終了しようと考えています。 そこで、ソフトウエアレンダリングモードで起動したかを取得したいのですが、そのような関数はありますでしょうか? GetUse3DFlag()は試しましたがTRUEが返ってくるようです。 また、Log.txtを開く以外の方法でお願いします。
メンテ
Re: たまにMakeScreenに失敗する ( No.4 )
名前:管理人 日時:2017/08/14 15:33

ソフトウエアレンダリングモードで起動した場合は GetScreenMemToSystemMemFlag という関数が TRUE を返しますので こちらで判断できます ただ、GetUse3DFlag の戻り値が FALSE にならないのはバグなので、こちらに修正したバージョンをアップしました よろしければお使いください m(_ _;m http://dxlib.o.oo7.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用 http://dxlib.o.oo7.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用 http://dxlib.o.oo7.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用 http://dxlib.o.oo7.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用 http://dxlib.o.oo7.jp/temp/DxLibDotNet.zip // Windows版 .NET用 http://dxlib.o.oo7.jp/temp/DxLibMakeTest.exe // ソース
メンテ
Re: たまにMakeScreenに失敗する ( No.5 )
名前:8127 日時:2017/08/14 20:13

管理人様、 「// Windows版 VisualC++ 用」 のプログラムを動かしてみたのですが別のバグ?があるようで検証ができません。 内容はLoadSoundMemが特定の素材でフリーズするというものです(失敗ではなく処理が返ってこない) フリーズを起こす素材は〜音人〜様の「動き01(ひょいっ)」です。(それ以外の50程度の音は正常に読み込まれた) ttps://on-jin.com/sound/index.php 再現コード int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(true); DxLib_Init(); volatile int a = LoadSoundMem("something.mp3"); //正常に読み込まれる volatile int b = LoadSoundMem("動き01(ひょいっ).mp3"); //処理が返らない DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 } ・3.18cは正常に動作したので修正したバージョン特有の問題? お忙しいと思いますが調査をよろしくお願いいたします。 ログ 0:ChangeWindowMode実行 0:ウインドウモードフラグが立てられました 4:DXライブラリの初期化処理開始 11: システムの情報を出力します 11: DXライブラリ Ver3.18f 12: 論理プロセッサの数 : 4 12: OS Windows7 ( Build 7601 Service Pack 1 ) 114: 現時点のCPU動作速度:大体2.59GHz 114: MMX命令を使用します 115: SSE命令が使用可能です 116: SSE2命令が使用可能です 117: CPUベンダ:GenuineIntel 120: CPU名: Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz 121: COMの初期化... 成功 127: 非同期読み込み処理の初期化...成功 128: ファイルアクセス処理の初期化...成功 130: メモリ総量:8086.17MB 空きメモリ領域:4283.57MB 130: タイマーの精度を検査します 131: 精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 131: パフォーマンスカウンターを使用します タイマー精度 : 2533.398000 KHz 132: ソフトの二重起動検査... 二重起動はされていませんでした 134: ウインドウクラスを登録します... 登録に成功しました 135: ウインドウモード起動用のウインドウを作成します 136: ディスプレイ情報のセットアップ開始 137: モニターの数:2 ディスプレイデバイスの数:6 137: No.0 モニター名:\\.\DISPLAY1 1366x768 32bit 60Hz 138: No.1 モニター名:\\.\DISPLAY2 1280x1024 32bit 60Hz 206: ディスプレイ情報のセットアップ完了 363: ウインドウの作成に成功しました 364: ウインドウを表示します 914: IMEを無効にしました 915: ウインドウスタイルをウインドウモード用に変更します... 完了 946: DirectInput関係初期化処理 946: XInput DLL の読み込み中... 成功 983: DirectInput7 の取得中... DirectInput8 の取得を試みます...成功 1051: 引き続き初期化処理... 初期化成功 1066: ジョイパッドの初期化... 1211: 入力装置を見つけました 1213: Device Instance Name : PC Game Controller 1214: Device Product Name : PC Game Controller 1215: 周期的エフェクトの作成に失敗しました。 1219: ジョイパッドの追加は正常に終了しました 1220: ジョイパッドの初期化は正常に終了しました 1221: マウスデバイスの初期化... 初期化成功 1221: キーボードデバイスの初期化... 初期化成功 1223: DirectInput 関連の初期化は正常に終了しました 1232: DirectSound の初期化を行います 1232: DirectSound インターフェースの取得を行います.... 成功 1242: 引き続きインターフェースの初期化処理... 成功 1396: DirectSound デバイスを列挙します 1397: Module Name : Description : プライマリ サウンド ドライバー 1398: Module Name : {0.0.0.00000000}.{8455e110-f5b1-4157-8e24-93e035583be1} Description : スピーカー (Realtek High Definition Audio) 1398: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 1399: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 1400: 利用可能サンプリング精度 1400: Primary 16bit = OK 8bit = OK 1401: Secondary 16bit = OK 8bit = OK 1402: 利用可能チャンネル 1402: Primary MONO = OK STEREO = OK 1403: Secondary MONO = OK STEREO = OK 1405: DirectSound の初期化は正常に終了しました 1407: d3d11.dll の読み込み.... 成功 1414: dxgi.dll の読み込み.... 成功 1415: API CreateDXGIFactory1 のアドレスを取得します.... 成功 1416: IDXGIFactory1 を作成します.... 成功 1427: API D3D11CreateDevice のアドレスを取得します.... 成功 1428: IDXGIAdapter を取得します.... 成功 1429: Direct3D 11 FeatureLevel 11_0 以上を対象とします 1429: ID3D11Device オブジェクトを取得します.... 成功 1459: IDXGIDevice1 を取得します.... 成功 1460: IDXGIDevice1->SetMaximunFrameLatency( 1 ); を実行しました 1460: [ウインドウモード 640x480] 1461: IDXGISwapChain を作成します.... 成功 1464: IDXGIFactory->CreateSwapChain の戻り値:0x00000000 1465: IDXGIOutput を取得します.... 成功 1467: Graphics Device:Intel(R) HD Graphics 4000 1467: 画面のフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1468: 16bit Zバッファフォーマットは DXGI_FORMAT_D16_UNORM です 1468: 24bit Zバッファフォーマットは DXGI_FORMAT_D24_UNORM_S8_UINT です 1469: 32bit Zバッファフォーマットは DXGI_FORMAT_D32_FLOAT です 1469: カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1470: DXT1テクスチャフォーマットは DXGI_FORMAT_BC1_UNORM です 1470: DXT2テクスチャフォーマットは使えません 1471: DXT3テクスチャフォーマットは DXGI_FORMAT_BC2_UNORM です 1471: DXT4テクスチャフォーマットは使えません 1472: DXT5テクスチャフォーマットは DXGI_FORMAT_BC3_UNORM です 1473: ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です 1473: ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です 1474: ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です 1475: 1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です 1475: 1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です 1476: 1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です 1476: 1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です 1477: 2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です 1478: 2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です 1478: 2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です 1479: 2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です 1480: 描画用 16bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 1480: 描画用 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 1481: 描画用アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1481: 描画用 ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です 1482: 描画用 ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です 1482: 描画用 ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です 1483: 描画用1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です 1483: 描画用1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です 1484: 描画用1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です 1484: 描画用1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です 1485: 描画用2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です 1485: 描画用2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です 1486: 描画用2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です 1486: 描画用2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です 1487: 使用する機能レベル:D3D_FEATURE_LEVEL_11_0 1487: 同時にレンダリングできるバッファの数:8 1487: 最大テクスチャサイズ 幅:16384 高さ:16384 1488: 標準描画用の頂点バッファの作成.... 成功 1489: 深度バッファを作成します.... 成功 1490: シェーダーコード関係の初期化.... 成功 1535: 各種シェーダー用定数バッファの作成.... 成功 1539: 各種 ID3D11InputLayout の作成.... 成功 1612: 画像の単純転送処理の初期化... 成功 1628: フォントの初期化を行います 1630: フォントの初期化は正常に終了しました 1631: 文字コードバッファの初期化を行います... 完了しました 1638:DXライブラリの初期化処理終了
メンテ
Re: たまにMakeScreenに失敗する ( No.6 )
名前:管理人 日時:2017/08/15 00:44

> ・3.18cは正常に動作したので修正したバージョン特有の問題? 調べてみたところ、3.18d のときに mp4ファイル読み込み用に追加した 『Media Foundation を使ったファイル読み込み処理』の中で停止していました ( API の内部で停止しているため原因は不明 ) Media Foundation では mp3ファイルは読み込めないので『Media Foundation を使ったファイル読み込み処理』 より先に mp3ファイルの読み込みを行える『DirectShow を使ったファイル読み込み処理』を行うようにすることで 停止しないようにできました( 読み込みが成功するとその先の読み込み処理は実行されないため ) その変更を加えたバージョンをアップしましたので、よろしければお試しください m(_ _;m http://dxlib.o.oo7.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用 http://dxlib.o.oo7.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用 http://dxlib.o.oo7.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用 http://dxlib.o.oo7.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用 http://dxlib.o.oo7.jp/temp/DxLibDotNet.zip // Windows版 .NET用 http://dxlib.o.oo7.jp/temp/DxLibMakeTest.exe // ソース ( 中身を既存のライブラリのファイルに上書きして、VisualStudioをお使いの場合は『リビルド』を、  BCCをお使いの場合は『再構築』をして下さい )
メンテ
Re: たまにMakeScreenに失敗する ( No.7 )
名前:8127(解決) 日時:2017/08/15 01:14

素早いご対応、ありがとうございました! 無事ファイルが読み込めるようになりました。 DirextXがおかしくなる現象は、すぐに再現できるものでもないのでGetUse3DFlag()の検証はまだなのですが もし挙動がおかしいようならまた連絡させていただきます。
メンテ

Page: 1 |

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

   クッキー保存