★お知らせ(2023/12/27)
いつもLive2D公式コミュニティをご利用いただき誠にありがとうございます。
本コミュニティは2023年12月27日 11:00をもって閉鎖いたしました。
今後の運営はすべて新Live2D公式クリエイターズフォーラムに移行します。
閉鎖に伴い、以下機能は利用不可となります。
・アカウントの新規作成
・トピック投稿、返信
たくさんのご利用誠にありがとうございました。

新Live2D公式クリエイターズフォーラムは以下バナーよりご利用いただけます。
Live2D公式クリエイターズフォーラム

なお、本コミュニティに投稿されたトピックはすべて残りますが、今後削除する可能性がございますので予めご了承ください。
閉鎖に関するお問い合わせにつきましてはLive2D公式クリエイターズフォーラムへご連絡ください。

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

編集済: 8月 2020 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にセットしておくことで回避が可能です。
  • 編集済: 8月 2020
    @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からロードするとメモリリークが発生することでしょうか?

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

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