トップページ > 記事閲覧
フルスクリーンと非同期読み込み
名前:S.S. 日時: 2015/03/16 23:50

初めまして。 大変素晴らしいライブラリのご提供ありがとうございます。 DxLibを使ったゲーム制作で、画像などを非同期で読み込みつつローディング画面を表示させている時に気づいたのですが、フルスクリーンと非同期読み込みを併用したときにアクセス違反(0xC0000005)が起こる現象について報告させていただきます。 現象は、フルスクリーンで非同期読み込みを有効(SetUseASyncLoadFlag(TRUE))にしている時プログラムが、CreateGraphFromMemでメモリ上の画像を読み込んでいる途中でアクティブでなくなると発生するようです。 コールスタックによると、 DxLib::Direct3DDevice9_CreateTexture_ASyncCallback(struct DxLib::ASYNCLOAD_MAINTHREAD_REQUESTINFO *) で発生しているそうです。 呼び出し元の関数はまちまちですが、再現用のコードでは、最初のGetKeyInputで止まりました。 因みに、製作中のゲームはProcessMessage内で止まります。 開発環境(IDE)はVisual Studio 2013です 色々なパソコン(win7と8.1)で試しましたが、どれでも発生しました。 再現用のコードは若干長くなってしまったため、アップローダーにあげました。 どっとうpろだ.org の 217975 です。
メンテ

Page: 1 |

Re: フルスクリーンと非同期読み込み ( No.1 )
名前:S.S. 日時:2015/03/16 23:52

横長になってしまいましたね... 大変失礼いたしました。
メンテ
Re: フルスクリーンと非同期読み込み ( No.2 )
名前:管理人 日時:2015/03/17 00:39

ご情報&再現用のコードをアップしていただきありがとうございます なるべく早く対応したいと思いますが、現在やるべきことがちょっと溜まっているので 次の週末中に完了できるかどうか・・・という状況です 申し訳ありませんが少しお時間をください m(_ _;m
メンテ
Re: フルスクリーンと非同期読み込み ( No.3 )
名前:S.S. 日時:2015/03/17 05:21

他のスレッドを拝見しました。 なるほど大規模な変更ですか。 これはまた大変お忙しいときに返信ありがとうございます。 更新楽しみにしています。
メンテ
Re: フルスクリーンと非同期読み込み ( No.4 )
名前:管理人 日時:2015/03/23 00:12

お待たせしました アップしていただいた再現用のコードでエラーを確認できました、ありがとうございます 修正版をアップしましたので、よろしければお使いください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 「大規模な変更」については、DXライブラリ内部の処理での文字コードの扱いを 整理するというだけで、とりあえず Visual Studio で使用する分にはデメリットは あってもメリットはありません (- -; Visual Studio はソースファイルの文字コード形式が Shift-JIS でも UTF-16LE でも UTF-8 でも 文字列リテラル( ソース中に書き込んだ "Hello C world" 等の文字列 )の文字コード形式は Shift-JIS、"" の前に L をつけたワイド文字( wchar_t )タイプの文字列リテラル( L"Hello C World" 等 )は UTF-16LE として扱ってくれる親切設計なのですが、gnu C++ の古いバージョンや別の Cコンパイラでは ソースファイルの文字コード形式そのままでの形式の文字列リテラルになったり、ワイド文字は UTF-16LE ではなく UTF-32LE であったりなど様々です 今までDXライブラリ内部では Visual Studio の親切設計に頼ってあまり文字コードについて 考慮してこなかったのですが( そのため Dev-Cpp 用のDXライブラリが出力する Log.txt は 文字化けしてしまったりしていました )今後のことも考えて今回文字コードの扱いを整理した、というわけです なので、整理する前から親切設計のお陰で問題なく動作していた Visual Studio を 使用されている方にとっては、今回の変更に伴って発生したバグによるデメリットはあっても、 メリットは無い、という状態です・・・ (- -;; 週末の間にできるだけテストはしましたが、まだ十分なテストはできていない状態なので、 申し訳ありませんがエラーが発生しましたら教えてください m(_ _;m
メンテ
Re: フルスクリーンと非同期読み込み ( No.5 )
名前:S.S. 日時:2015/03/30 09:54

返信遅れて大変申し訳ありません! ずっとリンクがクリック済みの表示になっていたので確認したと思い込み 最終更新の欄が管理人さんだということに気付きませんでした まだ動作の確認をしていないので 動作確認後に(解決)をつけて書き込みたいと思います
メンテ
Re: フルスクリーンと非同期読み込み ( No.6 )
名前:S.S. 日時:2015/03/30 13:32

とりあえず制作中のゲームで試したところ 同じ条件において、 今度はDxLib::DXGISwapChain_ResizeBuffersで アクセス違反が発生しました。 短いコードでは試していないので 細かい条件はこれから調べてみたいと思います
メンテ
Re: フルスクリーンと非同期読み込み ( No.7 )
名前:管理人 日時:2015/04/01 00:43

すみません、今度は私が「今日のS.S.さんの書き込みはもう確認したはず」と思って No.6 のお書き込みを見落としていました orz DxLib::DXGISwapChain_ResizeBuffers でのアクセス違反ですが、頂いたサンプルでは 私の環境では発生しませんでした アクセス違反の引き金となりそうな箇所はあったのですが、そこを変更してエラーが 発生しないようになっても根本の原因は分からないままになってしまいそうなので、 大変お手数で申し訳ありませんが S.S.さんの検証を待たせていただきたいと思います m(_ _;m
メンテ
Re: フルスクリーンと非同期読み込み ( No.8 )
名前:S.S. 日時:2015/04/01 01:36

この前アップしたコードにいろいろ付け足して試したところ どうやらSetAlwaisRunFlug(TRUE)との併用で発生するようです 手元のwin8.1でしか試していないので 管理人さんのPCでも試していただけると幸いです
メンテ
Re: フルスクリーンと非同期読み込み ( No.9 )
名前:管理人 日時:2015/04/04 21:41

ご情報ありがとうございます 私の手元でも SetAlwaysRunFlag( TRUE ) との併用でアクセス違反の発生を確認できました 修正版をアップしましたので、何度も申し訳ありませんが、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: フルスクリーンと非同期読み込み ( No.10 )
名前:S.S. 日時:2015/04/05 00:18

試してみましたが、またまた違う場所で起こってしまいました... スタックコールは以下の通りで Direct3DSurface9_UnlockRect_ASyncCallbackで起こっています KernelBase.dll!_RaiseException@16() 不明 msvcrt.dll!__purecall() 不明 ⇒ DxLibTest.exe!DxLib::Direct3DSurface9_UnlockRect_ASyncCallback(struct DxLib::ASYNCLOAD_MAINTHREAD_REQUESTINFO *) C++ DxLibTest.exe!DxLib::ProcessASyncLoadRequestMainThread(void) C++ DxLibTest.exe!DxLib::NS_ProcessMessage(void) C++ DxLibTest.exe!DxLib::UpdateKeyboardInputState(int) C++ DxLibTest.exe!DxLib::CheckHitKey(int) C++ > DxLibTest.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstancem, char * lpCmdLine, int nCmdShow) 行 243 C++ DxLibTest.exe!__tmainCRTStartup() 行 251 C DxLibTest.exe!WinMainCRTStartup() 行 165 C kernel32.dll!@BaseThreadInitThunk@12() 不明 ntdll.dll!__RtlUserThreadStart() 不明 ntdll.dll!__RtlUserThreadStart@8() 不明
メンテ
Re: フルスクリーンと非同期読み込み ( No.11 )
名前:S.S. 日時:2015/04/05 00:59

失礼しました 前回のエラーの原因は お恥ずかしながら 参照するフォルダの更新を忘れていただけでした・・・ ---------------------------------------------------------- 同日04/05 01:00 追記 ところで、スクリーンが切り替わった直後のScreenFlipが失敗するのは 仕様なのでしょうか...?
メンテ
Re: フルスクリーンと非同期読み込み ( No.12 )
名前:管理人 日時:2015/04/05 16:13

はい、仕様です ソフトが非アクティブになってフルスクリーンモードから一旦デスクトップ画面に戻っている間に 描画関係の関数を使用した場合は、ScreenFlip に限らず全ての描画関係の関数が失敗します ( 描画に使用している API である Direct3D を一旦全て解放してしまっているので・・・ ) 今回の修正で「読み込み関数が実行されている場合は読み込みが終了するまで非アクティブに ならないようにする」ようにしたのと、本件以前から SetAlwaysRunFlag( TRUE ) ; を実行していない状態では色々な関数で「再びアクティブになるまで処理が止まる」ようになっているので この仕様に触れる機会は少ないですが・・・
メンテ
Re: フルスクリーンと非同期読み込み ( No.13 )
名前:S.S.(解決) 日時:2015/04/05 17:26

なるほど SetAlwaysRunFlag( TRUE )には特にこだわりが有るわけではないので 非アクティブ時には止まるようにしたいと思います 大変お世話になりました
メンテ

Page: 1 |

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

   クッキー保存