トップページ > 記事閲覧
テクスチャの読み込みの非同期読み込みに失敗することがある
名前:lltcggie 日時: 2015/11/21 17:23

こんにちは。 DXライブラリを使用させていただくか検討している中で、テクスチャの読み込みの非同期読み込みに失敗することがあるバグを発見したので報告させていただきます。 症状 ログに「テクスチャに画像を転送するためのメモリの確保に失敗しました[Graphics_D3D11_BltBmpOrBaseImageToGraph3_NoMipMapBlt]」と表示され、テクスチャの読み込みに失敗することがある。 条件 1. Direct3D11を使用 2. テクスチャを非同期読み込みで読み込もうとする 3. テクスチャの非同期読み込み前に、Graphics_D3D11_GetD3DFormatColorData()を呼び出す関数をメインスレッドで呼ばない 原因 Graphics_D3D11_GetD3DFormatColorData()が未初期化の状態で複数スレッドから同時アクセスすると、初期化が複数回実行される。 またGraphics_D3D11_GetD3DFormatColorData()から返されるカラーフォーマット情報は、初期化中にアクセスすると内容が0クリアされているタイミングがある。 その結果、Graphics_D3D11_BltBmpOrBaseImageToGraph3_NoMipMapBlt()内のDestColor->PixelByteが0になる(DestColorが初期化される)タイミングでTempBufferPitchを計算すると0となる。 そのため、DXALLOC()で0バイトのメモリを確保することとなり、確保に失敗してエラーメッセージが表示される。 解決策 Graphics_D3D11_Device_Create()の最後に以下のコードを入れることで対処できることを確認 { volatile COLORDATA *ColorData; ColorData = Graphics_D3D11_GetD3DFormatColorData(GD3D11.Device.Caps.ScreenFormat); } 備考 Direct3D9ではメインスレッドのGraphics_D3D9_Device_Create()内でGraphics_D3D9_GetD3DFormatColorData()を呼び出しているので、この症状は発生しない。
メンテ

Page: 1 |

Re: テクスチャの読み込みの非同期読み込みに失敗することがある ( No.1 )
名前:管理人 日時:2015/11/22 20:07

ご報告ありがとうございます Graphics_D3D11_GetD3DFormatColorData 関数内の InitializeFlag を TRUE にするタイミングを 変更するだけでも解決できそうでしたが、lltcggieさんのお書き込みのように Graphics_D3D11_Device_Create の 最後で呼んでおくのがより確実なので、その通りに修正させていただきました こちらに修正版をアップしましたので、よろしければお使いください 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.2 )
名前:lltcggie(解決) 日時:2015/11/23 15:37

対応していただきありがとうございます。 無事症状が解決していることを確認できました。 その後検討した結果、これからDXライブラリを使わせていただくことになりました。 これからもよろしくお願いします。
メンテ

Page: 1 |

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

   クッキー保存