風薙鳥 ゲーム制作日誌

SFMLでOpenAL32.dllがアクセス違反を起こす問題

SFMLでWindows向けに落ち物パズルを制作していて、問題が発覚しました。
ゲームを起動して、10分前後経過すると、OpenAL32.dllがアクセス違反を起こします。
発生までの時間はブレがありますが、毎回起こります。

落ち物パズルで使用しているSFMLのバージョンは、2.3.2です。
同じバージョンで制作していて、制作休止中のローグライクでも、同様に発生することを確認しました。
しかし、ローグライク制作中は一度も起こりませんでした。
ローグライク制作休止後の大きな変化といえば、Windows10にアップグレードしたくらいなので、そこが絡んでいる可能性があります。

少し古いSFML2.2で制作したアクションRPGでは、アクセス違反は起こりません。
しかし、2.2でも条件を満たすと発生することがわかりました。
サウンド関係のクラス(※)のインスタンスを、main関数の中で定義すると、2.2でも2.3.2でも、10分前後でアクセス違反になるようです。

※ sf::SoundBuffer、sf::Musicなど

アクションRPGでは、これらのインスタンスをグローバルなスコープで定義しているため、発生しないようです。
SFML2.3から仕様が変わり、これらのインスタンスを関数外で定義すると、例外が発生するようになりました。
それに対応するため、以降のゲームではmain関数内で定義していたので、問題が発覚しました。

暫定的な対応として、シングルトンパターンのクラスにサウンド関連のインスタンスを含むことで、アクセス違反が起こらなくなります。
シングルトンパターンのクラスでは、自身のインスタンスを自身が持つので、main関数での定義は不要です。
また、SFML2.3.2の仕様でも、例外が発生しません。

サウンド関連のインスタンスを含んだ、通常のクラスや構造体のインスタンスをmain関数で定義した場合、例外は発生しませんが、10分前後でアクセス違反が起こります。
クラスなどに内包されていようが、main関数で定義したらアウトのようです。

アクセス違反が起こる原因は不明です。
思い当たるのは、Windows8.1からWindows10へアップグレードしたことくらい。
使用しているVisual Studio 2012は、Windows10にも対応しているとのことです。

暫定的な対応はできたので、この状態で落ち物パズルの制作を続けて様子を見ます。
その過程で、何か判明したら、また報告します。