トップページ > 過去ログ > 記事閲覧
[報告] VirtualBox上で実行するとDxLib_In
名前:bitbug 日時: 2012/05/13 09:13

お世話になっております。 PC仮想化ソフトのVirtualBox上でDXライブラリを使ったアプリケーションを実行すると、 DxLib_Init()の延長でハングアップする現象が出るようです。 (元は某掲示板のゲーム製作技術板の「DXライブラリ 総合スレッド その12」で出ていた話題です) VirtualBox固有の問題だと思うので、特殊なケースだとは思いますが一応ご報告。 こちらの環境: ホスト/ゲスト共にWindows XP Pro. SP3 (DirectX 9.0c) コンパイラ: Visual Studio 2008 Express DXライブラリ: 3.05 (最新の3.07fにしても解決せず) VirtualBox: 4.1.14 3Dアクセラレーションと2Dビデオアクセラレーションは有効。 VirtualBox Guest Additionsのビデオドライバインストール済。 現象: DXライブラリのサンプル(*)をDebugビルドして実行すると、ウィンドウが表示された後、 無反応になる。 *: homepage2.nifty.com/natupaji/DxLib/program/dxprogram_3DAction.html ウィンドウは出るけどそのまま固まって応答なしになります。 Log.txtには、下記のメッセージが出たところで終わっています。 「IDirect3DDevice9 オブジェクトを取得します...ハードウェア頂点演算を使用します」 ChangeWindowMode(TRUE)して、SetGraphMode()で指定したサイズのウィンドウが出るので、 そこまでは動いているようです。固まってる状態でタスクマネージャで見ると状態=応答なし。 DXライブラリ使用アプリ以外のプログラム、たとえばdxdiagではDirect3D 7のテストが下記 エラーで失敗する以外は正常動作します(バウンスする□やXロゴの立方体が正しく表示される)。 | ステップ 40 (バック バッファを1つ持つフリッピング プライマリ サーフェスを作成中): HRESULT = 0x88760064(エラー コード)」 SetWaitVSyncFlag(FALSE);も入れてみたけど解決せず。 Log.txtも「IDirect3DDevice9 オブジェクトを取得します...」で終わるのも変わらず。 Debug/Releseビルド共に同じ現象でした。 DXライブラリ(Ver3.05)のソースにログ出力を埋め込んでコンパイルして試したところ、 DxGraphics2.cppの4134〜4168行の"// 1フレームの時間を取得しておく"のブロック中 で呼び出しているGetRasterStatus()×4のうち、2番目のfor(;;)ループ (// VBlank が終わるのを待つ)が無限ループしてるようです。 とりあえず回避策としてコメントアウトして GRH.FrameTime=16; にしたら動きました。(16という値は1000(ms)/60(fps)=16.666...から) 以上、ご報告まで。

Page: 1 |

Re: [報告] VirtualBox上で実行するとDxLib_In ( No.1 )
名前:bitbug 日時:2012/05/13 09:14

済みません。題名が途中で切れてしまいました。 正しくは、 [報告] VirtualBox上で実行するとDxLib_Init()でハングアップ です。
Re: [報告] VirtualBox上で実行するとDxLib_In ( No.2 )
名前:管理人 日時:2012/05/16 00:43

ご報告ありがとうございます VirtualBox は使ったことがないのですが、ご報告内容から判断すると垂直同期状態の 取得ができていないみたいです ( 垂直同期を検出するまでループ、ということろで無限ループになっているようですので ) 件の箇所で0.5秒以上垂直同期が検出できなかったら GRH.FrameTime を 16 にするように 処理を変更しました( 現在 GRH.FrameTime は使用していないので0でも問題ないのですが一応 ) その変更を加えたバージョンをアップしましたので、よろしければお試ください 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/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
Re: [報告] VirtualBox上で実行するとDxLib_In ( No.3 )
名前:bitbug 日時:2012/05/17 06:50

ご返信ありがとうございます。 平日はなかなか時間が取れないので、この週末に試してご報告いたします。
Re: [報告] VirtualBox上で実行するとDxLib_In ( No.4 )
名前:bitbug(解決) 日時:2012/05/19 08:27

上げていただいたバイナリの方ではうまくいかなかったので、ソースをコンパイルして見た所、 最初の「// VBlank が検出できなかったらテストをスキップする」の所ではスキップされず、 else節に入ってしまい「// VBlank が終わるのを待つ」のfor(;;)ループのところでも無限 ループしてしまうようなので、そこでも同様のスキップ処理を入れたら動きました。 具体的には以下のようにしてみました(//FIXのコメント部分)。とりあえずこれで回避できそうです、ありがとうございました。 // VBlank が検出できなかったらテストをスキップする if( Raster.InVBlank == FALSE ) { GRH.FrameTime = 16 ; } else { // VBlank が終わるのを待つ for(;;) { GRH.Direct3DSwapChain9Object->GetRasterStatus( &Raster ) ; if( Raster.InVBlank == FALSE || WinData.Win32Func.timeGetTimeFunc() - Time > 500 ) break ; //FIX } // ここでもVBlank が検出できてなかったらテストをスキップする //FIX if (Raster.InVBlank == TRUE) //FIX { GRH.FrameTime = 16 ; } else { // カウント取得 Time = WinData.Win32Func.timeGetTimeFunc() ; // VBlank がくるのを待つ for(;;) { GRH.Direct3DSwapChain9Object->GetRasterStatus( &Raster ) ; if( Raster.InVBlank == TRUE ) break ; } // VBlank が終わるのを待つ for(;;) { GRH.Direct3DSwapChain9Object->GetRasterStatus( &Raster ) ; if( Raster.InVBlank == FALSE ) break ; } // 経過時間を保存 GRH.FrameTime = WinData.Win32Func.timeGetTimeFunc() - Time ; } }
Re: [報告] VirtualBox上で実行するとDxLib_In ( No.5 )
名前:管理人 日時:2012/05/20 14:52

ご検証ありがとうございます 垂直同期が検出できない( 常に OFF )かと思ったら、逆で常に垂直同期が来ている( 常に ON )状態だったのですね (・・; 載せていただいたプログラムを少しだけ変更してライブラリの方に反映させていただきました その状態で作成したライブラリファイルをアップしましたので、 もしご必要でしたらお使いください 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/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
Re: [報告] VirtualBox上で実行するとDxLib_In ( No.6 )
名前:bitbug(解決) 日時:2012/05/21 10:24

取り急ぎ、上げていただいたソースでDxGraphics2.cppだけ差し替えてリビルドして実行。 問題なく動作することを確認しました。 特殊な環境での現象にもかかわらずご対応いただき、ありがとうございました。

Page: 1 |