UnitySDKをアップデートしたらAssetBundle使用時にメモリリークする

【Cubism SDKのバージョン】Cubism 4 SDK for Unity R7
【Unityバージョン】2021.3.16f1
【ご利用のPC環境】Windows11
【機種名】ROG Zephyrus G14
【CPU】AMD Ryzen 9 5900HS
【グラフィックボード】NVIDIA GeForce RTX 3060 Laptop GPU
【メモリ】32GB

【実機確認したiOS端末の機種】iPad mini (第5世代)
【iOSバージョン】16.5.1

お世話になっております。

UnityにてAssetBundleを使用しているため、下記マニュアルの手順に従いメモリリーク対策を行っておりました。

ですが、Cubism 4 SDK for Unity R7にアップデートしたところ、スマートフォンなどでの実機確認の際、2体モデルを表示してしばらくするとメモリリークが発生し、アプリが落ちる不具合が起こるようになりました。

アップデート以前は3体以上モデルを表示しても動作しており、かつ「R7を使用し、AssetBundleを不使用」とするとメモリリークは発生しなくなりました。

R7でマスクの仕様が変わったためだと思われますので、最新バージョンにも対応したメモリリーク対策についてご教示いただくことは可能でしょうか。

お手数をおかけしますが、よろしくお願いいたします。

@cucu

いつも弊社製品をご愛顧くださり誠にありがとうございます。
Live2Dスタッフでございます。

使用しているCubismMaskTextureのインスタンスを選択状態にして、Inspectorの上部にCurrent using system: Subdivisions (Legacy)と表示されているかを確認していただけますでしょうか?
もし表示されているのであれば、Size (In Pixels)およびRenderTextureCountに設定されている値を教えてください。
また、RenderTextureCountの値を0にしてメモリリークが発生するかもご確認ください。

お手数ですが、ご確認よろしくお願いいたします。

よろしくお願いいたします。

ご返信いただき誠にありがとうございます。
ご質問いただいた点に関して、「GlobalMaskTexture.asset」の内容を記載いたします。

・「Current using system: Subdivisions (Legacy)」が表示されているか
⇒表示されています。

・Size (In Pixels)およびRenderTextureCountに設定されている値を教えてください
⇒下記の通りです。
Size: 2048
Subdivisions: 5
RenderTextureCount: 0

・RenderTextureCountの値を0にしてメモリリークが発生するか
⇒発生します。RenderTextureCountはずっと0のままで変更したことはありません。

以上となります。
お手数をおかけしますが、よろしくお願いいたします。

@cucu

回答ありがとうございます。

こちらの現象につきましては調査させていただきます。
もし可能であれば、検証のため、現象が再現する最小のプロジェクトを提供していただけませんでしょうか?
プロジェクトは以下のページにアップロードしてください。

よろしくお願いいたします。

お世話になっております。
ご調査いただけるとのこと、誠にありがとうございます。

現象が再現する最小のプロジェクトに関してですが、不具合再現の確認にスマートフォンへのビルドが必要なため、多忙も相まって難航しております。

取り急ぎ、アセットバンドルの生成は「宴」を使用して行っていることを共有させていただきます。

「宴」のアセットバンドルに関するマニュアルは下記ページにございます。

お手数をおかけしますが、よろしくお願いいたします。

@cucu

調査のために以下の内容についてお教えいただけませんでしょうか?

  • 何がメモリリークしているのか
  • CubismMaskControllerのMask Textureにマスク用テクスチャを設定しているか
  • 宴でCubismモデルをどのように扱っているか
  • Unityエディタ上で再現するか
  • スマートフォンへの書き出し設定

よろしくお願いいたします。

ご返信いただきありがとうございます。大変お手数おかけします。

UnityのProfiler画面を録画した動画を用意し、アップロードさせていただきました。
比較できるよう、AssetBundle使用時と未使用時両方のProfilerを録画しております。

非エンジニアで知識が乏しく申し訳ないのですが、ご質問への回答は下記のようになります。

■何がメモリリークしているのか
Profilerによると、Object statsで「Materials」「Animation Clips」のCountが数倍になっており、「Texture」の容量も2倍ほどになっているようです。
(AudioはAssetBundle無の方が大きいですが、おそらく使用曲の違いで関係ないと思われます)
実機確認時も、Live2Dのモーションを再生するタイミングでアプリが落ちることが多かったと記憶しております。

■CubismMaskControllerのMask Textureにマスク用テクスチャを設定しているか
「GlobalMaskTexture」を設定しており、個別のマスク用テクスチャは使用していません。
下記マニュアルでは、「Case 1: 一つのCubismMaskTextureを用いてモデルを表示する場合」の手順を行っております。

■宴でCubismモデルをどのように扱っているか
下記のキャラクター立ち絵を表示する機能で表示を行っています。

また、動画のパノラマのようなシーン以外では、宴では「テクスチャ書き込み」と称されているRenderTexture上にモデルを表示する機能を利用しています。
(通常の表示より負荷が高いとされていますが、マスクなどを行うために使用しています)

■Unityエディタ上で再現するか
Profilerを比較したところ、再現していうようです。

■スマートフォンへの書き出し設定
アップロードしたzipファイルに、Build SettingsとPlayer Settingsのスクリーンショットを同梱いたしました。
(別の設定箇所の確認も必要でしたらご連絡ください)

以上となります。
お忙しいところ恐れ入りますが、よろしくお願いいたします。

お世話になっております。
メモリリークを起こすほどの負荷は再現できなかったのですが、おそらく同じ現象が発生するであろう最小のプロジェクトを用意できました。AssetBundleは生成済の状態です。
上記のデータ便からzip形式でアップロードさせていただきました。

Profilerにて、AssetBundle使用時のみObject statsの「Materials」「Animation Clips」のCountが増大する現象を確認しております。
(前述の自作プロジェクトでCountが数倍にもなっていたのは、モーション総数が一般的なゲームよりかなり多いことが関係していそうです)

お手数をおかけしますが、よろしくお願いいたします。

@cucu

データの提供ありがとうございます。
こちらで調査させていただきます。
調査完了までしばらくお時間を頂きます。
あらかじめご了承ください。

よろしくお願いいたします。

「いいね!」 1

@cucu

提供いただいたプロジェクトで確認しましたが、現象が再現されませんでした。
現象の再現手順をお教えいただけますでしょうか?

よろしくお願いいたします。

返信が遅くなり申し訳ありません。
こちらですが、何をもって「現象が再現した」と判断されているのでしょうか?
(「スマホで確認してアプリが落ちるかどうか」など)

解決のため協力したい気持ちはあるのですが、多忙で試行錯誤する時間がとれないのと、知識が乏しくどうすれば良いのかがわからないという状態です……。

一旦、当分の間はAssetBundleは使用しないようにするつもりでいます。

@cucu

現象の再現確認につきましては、プラットフォームのプロファイラーで確認しております。

UnityのAssetBundleは、一度読み込んだアセットは明示的に解放しない限り残り続けます。
そのため、読み込んだアセットを削除せず、使用するごとに新たに読み込んでいるというように、使い方によってメモリリークが発生する可能性があります。
まずUnity自体の使用方法について調べていただくのがよろしいかと思われます。

よろしくお願いいたします。