トップページ > 過去ログ > 記事閲覧
CreateGraphFromSoftImageについて
名前:CPL 日時: 2011/05/04 04:49

こんにちは。DXライブラリにはいつもお世話になっています。 CreateGraphFromSoftImageを使って画像ハンドルを作成し、ウィンドウを最小化すると、 ウィンドウを復帰させても画像が表示されなくなるというバグ(仕様?)を発見しました。 できればLoadGraphで読み込んだ画像と同じように扱いたいので、自動で復帰するようにしていただけるとありがたいです。 よろしくおねがいします。

Page: 1 |

Re: CreateGraphFromSoftImageについて ( No.1 )
名前:いっち 日時:2011/05/04 17:15

事象の再現するソースをご提供いただけますか? あわせて、ご使用の環境とDXライブラリのバージョンを教えてください。
Re: CreateGraphFromSoftImageについて ( No.2 )
名前:CPL 日時:2011/05/04 23:38

ライブラリのバージョンは3.05、OSはWindows 7、コンパイラはVC++10です。 自分の環境ではほぼ100%の再現性があります。 #include "DxLib.h" #include <Windows.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // DXライブラリの初期化 ChangeWindowMode(true); DxLib_Init(); SetDrawScreen(DX_SCREEN_BACK); // グラフィックのロード int soft_image = LoadSoftImage("test.png"); int graph = CreateGraphFromSoftImage(soft_image); DeleteSoftImage(soft_image); // メインループ while (ProcessMessage() == 0) { ClearDrawScreen(); clsDx(); DrawGraph(0, 0, graph, true); ScreenFlip(); } // グラフィックを開放 DeleteGraph(graph); // 終了 DxLib_End(); return 0; }
Re: CreateGraphFromSoftImageについて ( No.3 )
名前:いっち 日時:2011/05/05 10:05

私の環境はXPですが、ウィンドウを最小化しても画像が表示されなくなることはありませんでした。 念のため、事象発生時のLog.txtをご提供下さい。 バイナリの問題ではないと思いますが、私の環境でビルドした実行ファイルをアップロードしました。 もし宜しければお試しになってみてください。 h t t p : / / w w w1.axfc.net/uploader/Sc/so/230941.zip&key=dxlib (スペースを消してください)
Re: CreateGraphFromSoftImageについて ( No.4 )
名前:CPL 日時:2011/05/05 11:32

アップロードされたバイナリをWindows 7で実行してみましたが、同様の問題が発生しました。 確かにXPでは、ウィンドウを最小化しても問題は発生しませんね。 その代わりに、テストコードをフルスクリーンモードで起動させてからアプリケーションを切り替えると、XPでも同じ現象が確認できるようです。 以下、Log.txtのコピペです。 0:システムの情報を出力します 1: DXライブラリ Ver3.05 2: 論理プロセッサの数 : 4 3: OS Windows7 ( Build 7600 ) 105: CPU動作速度:大体3.19GHz 106: MMX命令を使用します 106: SSE命令が使用可能です 107: SSE2命令が使用可能です 107: CPUベンダ:GenuineIntel 110: CPU名:Intel(R) Core(TM) i5 CPU 650 @ 3.20GHz 111:COMの初期化... 成功しました 114:メモリ総量:4087.05MB 空きメモリ領域:2431.91MB 115:タイマーの精度を検査します 116:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 116: パフォーマンスカウンターを使用します タイマー精度 : 3137.998000 KHz 118: ソフトの二重起動検査... 二重起動はされていませんでした 120:ウインドウクラスを登録します... 登録に成功しました 121:ウインドウモード起動用のウインドウを作成します 134:ウインドウの作成に成功しました 174:IMEを無効にしました 176:ウインドウスタイルをウインドウモード用に変更します... 完了 178:DirectInput関係初期化処理 178: DirectInput7 の取得中... 成功 187: 引き続き初期化処理... 初期化成功 190: ジョイパッドの初期化... 196: ジョイパッドの初期化は正常に終了しました 197: マウスデバイスの初期化... 初期化成功 199: キーボードデバイスの初期化... 初期化成功 202:DirectInput 関連の初期化は正常に終了しました 203:DirectSound の初期化を行います 204:DirectSound インターフェースの取得を行います.... 成功 207:引き続きインターフェースの初期化処理... 成功 244: DirectSound デバイスを列挙します 246: モジュール名: ドライバ記述:プライマリ サウンド ドライバー 246: モジュール名:{0.0.0.00000000}.{e6dcbf34-b214-4cee-880d-8e1d82f6c212} ドライバ記述:スピーカー (High Definition Audio デバイス) 247: モジュール名:{0.0.0.00000000}.{1f98c845-8400-484f-b806-6abfb1bc5d97} ドライバ記述:デジタル オーディオ (S/PDIF) (High Definition Audio デバイス) 248: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 248: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 249: 利用可能サンプリング精度 250: プライマリ 16bit = OK 8bit = OK 250: セカンダリ 16bit = OK 8bit = OK 251: 利用可能チャンネル 252: プライマリ MONO = OK STEREO = OK 252: セカンダリ MONO = OK STEREO = OK 253:DirectSound の初期化は正常に終了しました 255:DirectDraw オブジェクトの取得を行います.... 成功 258:引き続き初期化処理... 初期化に成功しました 268:IDirect3D9Ex オブジェクトを取得します.... 成功 271:IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します 569:成功 570:Driver:nvd3dum.dll Description:NVIDIA GeForce GTS 250 571:画面のフォーマットは D3DFMT_X8R8G8B8 です 571:Zバッファのフォーマットは D3DFMT_D16 です 572:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です 573:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 574:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です 574:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 575:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です 576:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 577:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です 577:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です 578:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です 579:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です 579:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です 580:描画用 16bit カラーフォーマットは D_D3DFMT_R5G5B5 です 581:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 582:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 582:最大テクスチャサイズ 幅:8192 高さ:8192 583:テクスチャステージテンポラリレジスタ:使用可 584:減算合成のハードウェア対応:ネイティブ 585:頂点シェーダーバージョンコード:300 585:ピクセルシェーダーバージョンコード:300 597:バックバッファロック転送の時間:537nsec 一時的な描画可能バッファを使用した転送の時間:465nsec 603:バックバッファロックを使用しません 607:Zバッファを作成します.... 成功 617:プログラマブルシェーダーを使用します 676:フォントの初期化を行います 678:フォントの初期化は正常に終了しました 680:文字コードバッファの初期化を行います... 完了しました 5257:Direct3DDevice9 の解放 3 5306:Direct3D9 DLL の解放 4 5308:DirectInput 関連の終了処理... 完了 5309:DirectInput関係初期化処理 5310: DirectInput7 の取得中... 成功 5312: 引き続き初期化処理... 初期化成功 5315: ジョイパッドの初期化... 5321: ジョイパッドの初期化は正常に終了しました 5322: マウスデバイスの初期化... 初期化成功 5324: キーボードデバイスの初期化... 初期化成功 5327:DirectInput 関連の初期化は正常に終了しました 5329:DirectDraw オブジェクトの取得を行います.... 成功 5331:引き続き初期化処理... 初期化に成功しました 5342:IDirect3D9Ex オブジェクトを取得します.... 成功 5346:IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します 5618:成功 5620:Driver:nvd3dum.dll Description:NVIDIA GeForce GTS 250 5620:画面のフォーマットは D3DFMT_X8R8G8B8 です 5621:Zバッファのフォーマットは D3DFMT_D16 です 5622:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です 5623:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 5624:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です 5625:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 5626:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です 5626:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 5627:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です 5628:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です 5629:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です 5630:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です 5631:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です 5632:描画用 16bit カラーフォーマットは D_D3DFMT_R5G5B5 です 5633:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 5634:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 5635:最大テクスチャサイズ 幅:8192 高さ:8192 5635:テクスチャステージテンポラリレジスタ:使用可 5636:減算合成のハードウェア対応:ネイティブ 5637:頂点シェーダーバージョンコード:300 5638:ピクセルシェーダーバージョンコード:300 5648:バックバッファロック転送の時間:512nsec 一時的な描画可能バッファを使用した転送の時間:447nsec 5649:バックバッファロックを使用しません 5650:Zバッファを作成します.... 成功 5653:プログラマブルシェーダーを使用します 5718:グラフィックを復帰します 12520:ウインドウを閉じようとしています 12533:ウインドウが破棄されようとしています 12549:ソフトを終了する準備が整いました 12579:フォントの初期化を行います 12581:フォントの初期化は正常に終了しました 12582:Direct3DDevice9 の解放 3 12611:Direct3D9 DLL の解放 4 12613:DirectInput 関連の終了処理... 完了 12686:DirectSound の終了処理は正常に終了しました 12689: 12691:Alloc memory dump 12693: Total size:0(0.000kb) Alloc num:0 12696:
Re: CreateGraphFromSoftImageについて ( No.5 )
名前:sss 日時:2011/05/05 11:41

Windows7(x64)の環境で試したところ、 いっちさんの実行バイナリでも再現しました。 過去のバージョンを試したところ、3.03では問題なく 3.04では再現しました。 また、2010/08/10にダウンロードした DxLibVCTest.exe(3.03a)でも再現しました。 この辺りの修正で、何か変わったんですかね・・・
Re: CreateGraphFromSoftImageについて ( No.6 )
名前:いっち 日時:2011/05/05 12:26

> CPLさん Log.txtのご提供ありがとうございます。ただ、私では解決できませんので他の方からの回答をお待ち下さい。 > その代わりに、テストコードをフルスクリーンモードで起動させてからアプリケーションを切り替えると、XPでも同じ現象が確認できるようです。 グラフィックデバイスのリセット(?)が発生した際にメモリから作成したグラフィックハンドルをDXライブラリが復元しないのは仕様です。 DXライブラリのユーザーが SetRestoreGraphCallback 等でコールバックを用意して復元する必要があります。 > sssさん 検証ありがとうございます。 > 過去のバージョンを試したところ、3.03では問題なく 3.04では再現しました。 となると、おそらくは > Vista以降では Direct3D9Ex を使用して画面出力遅延を抑える処理を行うように処理を変更。 あたりの影響ではないかと思います。 もしかすると Vista 以降の環境ではウィンドウの最小化時にもなんらかのコールバックを呼ぶ必要があるのかもしれません。
Re: CreateGraphFromSoftImageについて ( No.7 )
名前:管理人 日時:2011/05/08 02:19

最小化しただけでデバイスロストが発生するとなると、CreateGraphFromSoftImage を 活用するのが難しくなりますね・・・ というわけで、使用メモリが増えてしまいますが、LoadGraph で作成したグラフィックハンドルと同じように CreateGraphFromSoftImage で作成したグラフィックハンドルの内容も自動で復帰するようにしてみましたので よろしければこちらのバージョンをお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Gnu C++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 自動復帰のために CreateGraphFromSoftImage で渡された時点でのイメージデータを メモリにバックアップするようになっていますので、その分以前よりメモリの使用量が増えます CreateGraphFromSoftImage でグラフィックハンドルを作成したあと描画してすぐ DeleteGraph で 削除してしまうような用途の場合だとメモリ確保とバックアップのためのメモリ転送の処理分が 無駄になるので、バックアップをしないようにするための関数も用意しました // 画像を作成する際に使用した画像データのバックアップをしてデバイスロスト時に使用するかどうかのフラグをセットする // ( TRUE:バックアップをする( デフォルト ) FALSE:バックアップをしない ) int SetUseGraphBaseDataBackup( int Flag ) ; 必要でしたらお使いください > > 過去のバージョンを試したところ、3.03では問題なく 3.04では再現しました。 > となると、おそらくは > > Vista以降では Direct3D9Ex を使用して画面出力遅延を抑える処理を行うように処理を変更。 > あたりの影響ではないかと思います。 確認していませんが、その可能性が高いと思います ただ、自分の手元の Windows7(x64) では現象が発生しないんですよね・・・ もし既存のデバイスロスト検出処理で検出できない場合はこのバージョンでも不具合が解消されないかもしれません
Re: CreateGraphFromSoftImageについて ( No.8 )
名前:いっち 日時:2011/05/08 12:03

管理人さん> ご対応ありがとうございます。 CreateGraphFromSoftImage だけでなく CreateGraphFromBmp やそれらからの DerivationGraph でも自動的に復帰することを確認しています。 また SetChangeScreenModeGraphicsSystemResetFlag と組み合わせた SetUseASyncChangeWindowModeFunction でも問題なく動作しました。 (これでデバイスロスト時に復帰作業が必要になるのは GetColor ぐらいでしょうか?) ただ SetUseGraphBaseDataBackup に FALSE を指定した場合、LoadGraph で読み込んだ画像も復帰しなくなるのは仕様でしょうか? (つまり従来と同じ挙動をさせることが出来なくなっています。) > LoadGraph で作成したグラフィックハンドルと同じようにCreateGraphFromSoftImage で作成したグラフィックハンドルの内容も自動で復帰するようにしてみました 実を言うと「どっちにしろコールバックは必要そうだし自動復帰しなくても・・・」と思っていたのですが、実際に試してみると便利でした。ごめんなさい。
Re: CreateGraphFromSoftImageについて ( No.9 )
名前:CPL 日時:2011/05/09 02:00

ありがとうございます。 新しいバージョンで試してみたところ、たしかに問題が修正されていることが確認できました。 いっちさんも仰っていますが、前バージョンの挙動に戻せないのは少し気になるところです。 多少、テスト版から仕様が変わっても構わないので、DXライブラリがよりよいライブラリになるよう期待しています。
Re: CreateGraphFromSoftImageについて ( No.10 )
名前:管理人 日時:2011/05/21 14:49

> ただ SetUseGraphBaseDataBackup に FALSE を指定した場合、LoadGraph で読み込んだ画像も復帰しなくなるのは仕様でしょうか? > (つまり従来と同じ挙動をさせることが出来なくなっています。) 仕様となります SetUseGraphBaseDataBackup 関数は SetDrawValidGraphCreateFlag関数のように 「LoadGraph などの関数を呼び出す前に呼んでおく関数」なので、 バックアップしたい画像を作成する前に SetUseGraphBaseDataBackup( TRUE ) ; を実行して、バックアップしたくない画像を作成する前に SetUseGraphBaseDataBackup( FALSE ) ; を実行するなどして、画像毎にバックアップを取るか取らないかを選択できます このような仕様の場合、ファイルから読み込んだ場合のみ必ずバックアップをとる( 自動復帰可能にする ) のは仕様的にきれいではないので、ファイルから読み込んだ場合も SetUseGraphBaseDataBackup 関数の影響を 受けるようにしました 因みに SetUseGraphBaseDataBackup 関数はバックアップを取りたくない画像を作成するときに SetUseGraphBaseDataBackup( FALSE ) ; TempScreen = MakeScreen( 640, 480 ) ; SetUseGraphBaseDataBackup( TRUE ) ; こんな風に画像作成関数をはさむような形で使うことを想定しています
Re: CreateGraphFromSoftImageについて ( No.11 )
名前:いっち 日時:2011/05/21 17:15

> こんな風に画像作成関数をはさむような形で使うことを想定しています なるほど。了解しました。解説ありがとうございます。

Page: 1 |