本件について、問題自体はすでに解決済みであり、DXライブラリへの修正依頼や技術的な質問を行う意図はありません。
(そもそも DX ライブラリが Steam Deck を公式にサポートしているわけでもないと思われます。)
しかし、修正にかなり手こずったうえ、依然として不明点の多い事象であるため、後続の開発者の助けになればと思い、ここに記録として共有させていただきます。
■ 発生環境
- DXライブラリ Ver3.24d
- Steam Deck
私の作成したゲームアプリケーションが、上記環境において、基本的には問題なく動作するものの、
特定のシーンで画面が真っ黒のまま進行しなくなるという報告が複数寄せられていました。
■ 解決に至った変更点
以下の修正により、現象は解消しました。
【BEFORE】
短尺サウンドを、ループしないBGMとして演奏していた。
(当作において「ループしないBGM」とは、おおむね以下のような処理)
SetCreateSoundDataType(DX_SOUNDDATATYPE_FILE);
ChangeVolumeSoundMem(pal, bgm);
PlaySoundMem(bgm, DX_PLAYTYPE_BACK, false);
【AFTER】
当該サウンドを効果音として再生するようにした。
(当作において「効果音」とは、おおむね以下のような処理)
SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMNOPRESS );
PlaySoundMem(bgm, DX_PLAYTYPE_BACK, true);
→解決したとの報告
■ なぜこの修正を行ったか
私は Steam Deck を所持していないため、実機確認ができず、推測しながら修正するしかありませんでした。
黒画面が発生する「特定のシーン」の直前で行っていた処理は、
ループしない20-30秒ほどのサウンドを DX_PLAYTYPE_BACK で再生していたという点でした。
元々すべてのBGM再生には PlaySoundMem(bgm, DX_PLAYTYPE_LOOP , false)を使用していましたが、
この短尺サウンド(ジングル)だけは PlaySoundMem(bgm, DX_PLAYTYPE_BACK, false)を使っていました。
■ 推測:原因について
このゲームではシーン切り替え時に非同期読み込みを行いつつ、
GetASyncLoadNum() が 0 になるまで待つ
という仕組みを利用しています。
推測ではありますが、
PlaySoundMem(bgm, DX_PLAYTYPE_BACK, false)でサウンドしつつリソースの非同期読み込みをしたときに、
GetASyncLoadNum() が 0 にならなくなっていた可能性があります。
ただし、なぜこの現象が、それ以外すべてのシーンは問題なく動いていたらしい Steam Deck 環境でのみ発生するのかについては謎です。
■ 最後に
繰り返しになりますが、本件はあくまで「解決記録」を共有するものであり、
管理人様への調査依頼や修正依頼を目的としたものではありません。
同様の現象に遭遇した方の一助になれば幸いです。