PerformanceTuningUniRxでメモリリークするケースとAddToやTakeUntilDestroyの重要性についてまとめました。CompositeDisposableでメモリリークを防ぐ必ずOnCompoletedするなら問題ないけどAddToした方が安心SubjectやReactivePropertyもメモリリークするObservable作成時にTakeUntilDestroyを義務付けるのが安全かもUnty2018.4.6メモリリークの例まずは悪い例として、以下のようなソースコードを書いてみます。}}IntervalFrameは指定したフレーム数の間隔でOnNextを呼び続けるObservableです。明示的にDisposeしなければOnCompletedは呼ばれずOnNextが呼ばれ続けます。これを適当なGameObjectにアタッチして再生します。再生後、そのGameObjectを削除してみます。すると、GameObjectを破棄したにもかかわらずConsoleにログが出力され続けることが確認できます。GameObjectが破棄されたとしても終了していないObservableは生き続けます。これは例えば下記のようなケースで大きな問題を起こします。}}上記の例ではテクスチャを100個生成し、OnNextの中でそれを参照しています。この状態でGameObjectを削除するとObservableが残り、その中で参照しているテクスチャ100個も当然残ったままになります。して立派にメモリリークが完成しました。このようなソースコードは行く行くはアプリのクラッシュに繋がります。AddToでメモリリークを防ぐ前節のようなメモリリークは、下記のようにAddToを使うことで防げます。}}このように書くと、このコンポーネントが破棄された時にObservableも破棄されます。(もちろんその後にResources.UnloadUnusedAssets()を呼ばないとテクスチャはメモリからなくなりませんが)ちなみにGameObjectに対してAddToすることもできます。GameObjectが破棄されたらこのObservableも破棄するこの場合はGameObjectが破棄されたらObservableも破棄されます。TakeUntilDestroyでメモリリークを防ぐもう一つの方法として、下記のようにTakeUntilDestroyオペレータを使う方法があります。}}このように書くと、コンポーネントが破棄された時にObservableのOnCompletedを呼んでからObservableを破棄します。CompositeDisposableでメモリリークを防ぐ前節までのようにコンポーネントやGameObjectにObservableの生存期間を合わせるほかに、CompositeDisposableを使って任意のタイミングでObservableを破棄する方法があります。}}上記のようにCompositeDisposableに対してAddToすることで、そのCompositeDisposableが破棄された時(Dispose()やClear()が呼ばれた時)にObservableを破棄します。上記の例ではOnDisableのタイミングでObservableが破棄されます。OnCompoletedするなら問題ないけどAddToした方が安心なお、以下のように必ずOnCompletedするようなObservableの場合はリークしません。}}が、AddToしておくほうが安心ではあるでしょう。SubjectやReactivePropertyもメモリリークする上記のようなメモリリークはSubjectやReactivePropertyについても同様です。下記のようなソースコードはメモリリークを引き起こします。}}このようなケースでは、まずはしっかりSubjectがいらなくなった時点でDisposeする必要があります。}}また購読側でもAddToなどでしっかり購読期間を管理しておく必要があります。Debug.Log(textures.Length)).AddTo(this);Observable作成時にTakeUntilDestroyを義務付けるのが安全かもこのようにUniRxによるメモリリークは起こりやすく防ぎづらいです。大規模な開発になってくると各自が購読する処理をすべてチェックするのはなかなか難しそうです。そこで、Observableを作成する側で必ずObservableの生存期間を制御することを徹底すれば最悪メモリリークは防げます。_subject.TakeUntilDestroy(gameObject);}大規模開発においてはこのようなルール作りから考えることでメモリリークを防ぐことができそうです。»プロフィールUnityエンジニア。グラフィックスへの興味が強めです。Blur(渦巻ブラー)のポストエフェクトを実装する月別アーカイブはてなブログをはじめよう!halya_11さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。