動いてほしくないShaderが35MBのメモリを使うようになり、回避できなくなりました。
これが原因で30フレームに一度GCが走り、処理落ちします。もーね。
メモを兼ねて記事を書いておこうかと思います。ちなみに私は根本解決案が浮かびません。回避する予定です。
これはレアケースのはずです。同じケースは検索して1例しか見つからなかったので(そっちも解決してませんでした)
書いておくと、もしかしたら誰かの役に立ちますかね?という事です。
起きてること
気が付いたら全体的に処理遅延が起きるようになった。だが、全体的に重くなる変更は心当たりがない。
とりあえずProfilerを見てみる。
- 特に何も処理していない状態(UIと背景のスクロール程度)でスパイクが出るようになっている(以前はなかった)
- プロジェクトを丸ごと以前に戻すとスパイクも消える
- およそ30フレームに一度スパイクが出ている
- スパイクの時、Hierarchyでは57%が「Gfx.WaitForPresent」とほとんどを占めている(=原因はScriptでもないっぽい)
特別に何も処理してない状態でこれなので、プレイ中はもっと重くなる。
Gfx.WaitForPresent?
ということで次等を試したが、効果なかった。
メモリ?
Memoryを見ると、GCが走ってる。
プレイしてない今は背景をループさせているだけなのになぜ?
怪しいのでメモリも調べてみる
- 「Particles/Standard Surface」で35MB使っている
- 「Asset has been edited and not yet saved to disk」と、参照が切れている
とても怪しい。
というか、このプロジェクトは2DのSTGで、背景のスクロール(3つの絵)だけでしかシェーダーを使ってないのにぜ59.1MBもメモリを使っている?
どこからこれがでてきた?
- 背景の3つのマテリアルのみでシェーダーを使用している(今は、他でシェーダーを使用していない) なのでこれ関連であろう。
- offsetを変更してスクロールさせている
- エディタ内で動かすと、offsetの変更により.metaファイルも変わる
- .metaファイルが変わった後、この35MBのメモリ使用が出現する場合がある
- 一度これが出現すると、このプロジェクトでは出現し続ける
削除できない
- この、シェーダーを使用してるアセットを削除しても 「Particles/Standard Surfaceで35MB」が残り続ける(そういえば、参照切れてるみたいだし・・・)
他にやってみた事
・Reinport
→特に変わらず
・次で不要アセットの削除
→特に変わらず
経緯
過去の疑わしい事。
1.Unity2017.1からUnity2018.2にバージョンアップした。
2017.1の時点では、シェーダー全てでのメモリ使用量は479KBだけだった(上の画像では59MB)
2017.1の時点では特に参照が切れている物もない。バージョンアップで何かあったか?
2.この背景のマテリアルを数回別バージョン(別ファイル)に差し替えした。
そこで何かがあったか?
ただ、参照が切れてるシェーダーがメモリを使う理由になってない。
結局どうする?
記事を書いている時点では決めていない。
<案>
Unity自体の不具合(バージョンアップ)が関連していそう。他の事例で、35MBという数字まで本事例と一致していたため。
なので、これ以上調べても真正面から対応できる気がしない。なので新規プロジェクト作ってアセットを全部入れ直そうと考えている。
シェーダーを使ってるマテリアルは怪しいので作り直す。
教訓
Unityのバージョンアップは、同じプロジェクトでは最小限にしておけ(まあ、そうだよね)