新しいLive2D公式コミュニティ(日本向け)が公開されました!
ぜひご利用ください!
Live2D公式コミュニティ

■このコミュニティの今後について
このコミュニティ(forum.live2d.com)につきましては、しばらくの間新コミュニティと並行して運営しますが、2022年内を目処に閉鎖する予定です。
閉鎖時期や内容については決定次第お知らせいたします。
海外向けコミュニティについては変更ございません。
Live2Dに関するユーザーのみなさま同士の交流・ご質問・不具合の報告・提案・要望などについて是非お寄せください。
※Live2D公式スタッフからの発言や回答については確約できないことを予めご了承ください。

Live2D ヘルプ

Cubism Editorダウンロード / 動作環境
Cubism SDKダウンロード / 対応表
Cubism 製品利用ライセンス(SDK含)

Cubism 製品のライセンスについてのお問い合わせはこちら
nizima 及び nizima 製品についてのお問い合わせはこちら
【各最新OSの対応状況について】
Cubism Editorは 4.1.02 正式版以降でWindows 11 及び macOS Monterey に対応しております。ぜひ最新版をご利用ください。
※macOSをお使いの方でOSアップデートする際は必ずCubism Editorのライセンスを解除してください。
Cubism EditorをインストールしているmacOSをアップグレードしたい
Cubism SDKについては各SDKのREADMEまたはNOTICEをご確認ください。

【Mac各機種への対応状況について】
現在、Cubism EditorはApple M1チップ搭載機種には対応しておりません。
詳細は 動作環境 をご参照ください。
関連するお問い合わせへの対応はこの文章をもって代えさせていただきます。
Cubism 製品のマニュアル・チュートリアルはこちら
 
Cubism Editorマニュアル    Cubism Editorチュートリアル    Cubism SDKマニュアル    Cubism SDKチュートリアル

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からロードするとメモリリークが発生することでしょうか?

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

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