Cubism 製品のマニュアル・チュートリアルはこちら
 
Cubism Editorマニュアル    Cubism Editorチュートリアル    Cubism SDKマニュアル    Cubism SDKチュートリアル

AssetBundle化時のメモリリークについて

編集済:08/12 Cubism 4 SDK
Live2DモデルのプレハブをAssetBundle化して使用する時の対応について質問させていただきます。

https://docs.live2d.com/cubism-sdk-tutorials/issue-of-assetbundle/?locale=ja
こちらのマニュアルでは、AssetBundleからモデルを使用するとメモリリークが発生すると書いてありますが、実際にUnityのProfilerを見ると特に発生していないようです。

具体的にはメモリリークの原因と指摘されているGlobalMaskTextureインスタンスの複数生成が発生していないように見えます。シーン内に複数のモデルを生成しても、共通でResources/Live2D/Cubism/GlobalMaskTextureを使用しているようです。UnityのProfilerでもMask用のRenderTextureが1個だけになっております。



ハイライトされているのがMask用のRenderTextureで、上の「live2d_chara_など」はモデルを表示させるために生成したRenderTextureです。

このマニュアルの最終更新日が2017/12/19になっていますが、今でも有効なのでしょうか?
あるいは、マニュアルへの理解にずれがありましたらご教授いただきたいです。

使用しているUnityバージョンは2019.4.1f1で、Live2D SDKはCubism 4 SDK for Unity R1です。
タグ付けされた:

コメント

  • @totoroll さん

    Cubism SDK for Unityのデフォルトの状態では、Prefabの初期化時に動的に参照をセットするようにしているため、メモリリークは発生しません。
    しかし特定の条件では、あらかじめGlobalMaskTextureの参照をセットしたPrefabを使用することがあり、その場合メモリリークが発生するため、ご提示いただいたページの対応が必要になります。
    この状態でAssetBundleからPrefabをロードすると、CubismMaskController.MaskTextureにセットされているGlobalMaskTextureが別のインスタンスとして生成されるため、新たなモデルをロードするたびにRenderTextureの総数が増加します。

    GlobalMaskTextureをセットしたPrefabを使用する例として、マスクで切り取られる輪郭部分の品質を重視する場合が挙げられます。
    GlobalMaskTexture(CubismMaskTextureのインスタンス)は、一枚のRenderTextureにすべてのマスクを描画します。
    その際、それぞれのマスクが重ならないように領域をマス目上に分割し、マスクをリサイズして割り当てますが、分割数はマスクの数によって決められるため、マスクの数が多い場合はマスク一つに対する領域が小さくなるため、輪郭部分の品質が落ちます。
    また、この分割数には上限があり、表示するモデルの数などで上限を超えた場合、クリッピングが正常に表示されないことがあります。
    これは、モデルごとにCubismMaskTextureのインスタンスを用意し、Prefabにセットしておくことで回避が可能です。
  • 編集済:08/20
    @y_a_s_(Dev Staff)

    お返事ありがとうございます。

    Cubism SDK for Unityのデフォルトの状態では、Prefabの初期化時に動的に参照をセットするようにしているため、メモリリークは発生しません。

    これはCubismMaskTexture.GlobalMaskTextureでResources.Loadを使ってCubismMaskController.MaskTextureをセットしているから、AssetBundleからロードされてもGlobalMaskTextureのインスタンスが生成されず、メモリリークが発生しないことでしょうか?

    しかし特定の条件では、あらかじめGlobalMaskTextureの参照をセットしたPrefabを使用することがあり、その場合メモリリークが発生するため、ご提示いただいたページの対応が必要になります。

    これは手動でプレハブ上のCubismMaskControllerコンポーネントのMask Textureの内容を置き換えたら、AssetBundleからロードするとメモリリークが発生することでしょうか?

    もしデフォルトでメモリリークが発生しないようであれば、公式マニュアル上にその旨を記載していただきたいですね。
    マニュアル上では
    Live2Dモデルでクリッピングが設定されたモデルをAssetBundle化した後、そこからモデルをロード・アンロードを行うとメモリリークが発生します。

    と書いてあるため、AssetBundleを使うなら必ず対応する必要があるという理解になっていました。
  • @totoroll さん

    これはCubismMaskTexture.GlobalMaskTextureでResources.Loadを使ってCubismMaskController.MaskTextureをセットしているから、AssetBundleからロードされてもGlobalMaskTextureのインスタンスが生成されず、メモリリークが発生しないことでしょうか?

    はい、AssetBundleからPrefabをロードしてSceneに配置した後にマスク用のテクスチャをセットしているためです。


    これは手動でプレハブ上のCubismMaskControllerコンポーネントのMask Textureの内容を置き換えたら、AssetBundleからロードするとメモリリークが発生することでしょうか?

    もしデフォルトでメモリリークが発生しないようであれば、公式マニュアル上にその旨を記載していただきたいですね。

    ご迷惑をおかけしてしまい誠に申し訳ございません。
    近日中にドキュメントの記述を修正させていただきます。
    totoroll
コメントするにはサインインまたは登録して下さい。