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