スポンサーリンク

【Unity】TextComponentのバグを発見!?【Text】※7月22日更新

2019年6月24日Unity, 開発

いきなりですが、Unityのバグを発見しました。
既知のバグならすみません。。。
※Unity2017で確認しました。

バグの内容を超簡単に説明すると

Textコンポーネントを使用していると異常終了する可能性があります。
該当のシーンに何度も遷移すると、アプリがメモリリークします。

現在わかっていること

  • Unityのプロファイラーで確認してもメモリリークしているかどうか判断できませんでした(キャプチャに残しておらずすみません。後日画像貼ります)
  • 端末をMacに接続して対象のアプリのメモリを確認した場合、増加が確認できました(キャプチャに残しておらずすみません。後日画像貼ります)
  • 端末で実際にTextコンポーネントを使用しているシーンを何度も表示すると異常終了して落ちました(長い文字列ではなく、大量のTextコンポーネントを使用して確認)

バグの内容を少しちゃんと説明すると

最初に、オープンソースとして開示されている
UnityのTextクラスのプログラムの外部リンクを以下に貼ります。
https://bitbucket.org/Unity-Technologies/ui/src/2019.1/UnityEngine.UI/UI/Core/Text.cs
※プログラムが長いのでリンクにしています。

そして、今回悪さをしていると思われるのが
【Text】クラスで使用されている【TextGenerator】クラスです。
【TextGenerator】クラスは【IDisposable】インターフェースを実装しています。
なので、【Usingステートメント】または【Dispose()】メソッドを呼び出す必要があるのに
UnityのTextクラスではそれが行われていません。
一応、TextGeneratorとIDisposableの定義を以下に記述します。

TextGenerator

IDisposable

ちょっと疑問

TextGeneratorクラスはIDisposableインターフェースを実装しているのに、
Dispose()メソッドが実装されていないけどどういうことなんだろう・・・?
※このへんの仕様詳しい方教えていただけたら助かります。m(__)m
TextGeneratorのインスタンスからDispose()メソッド呼び出せるのかな?
と思い実際にやってみましたがダメでした。。。 な〜ぜ〜だ〜。。。泣
以下、証拠画像


何か単純な勘違いしている可能性があるので、
UnityのTextGeneratorクラスのリファレンスを見てきてみた。

Unity公式リファレンスのサンプルコードで
UsingステートメントやDispose()メソッドが記載されていないだと!?
IDisposableインターフェース実装しているんじゃなかったのか!?

念には念を、と思い
Unity公式リファレンスのTextGeneratorクラスのPublic関数一覧を見てみた。

IDisposableインターフェース実装しているのに
定義の中にもDispose()メソッドが記載されていないだと!?
いったいどういうことだってばよ!?

※このへん詳しい方おられましたら、お問い合わせから連絡いただけると泣いて喜びますm(__)m
このへんのことが今回のTextコンポーネントのメモリリークバグにつながっているのかな〜?
とりあえず、
現在開発中のアプリでTextコンポーネントを使用している方は、メモリリーク気をつけてください!

何かこの件で発展があれば改めてこの記事を更新します。
Unity公式に問い合わせてみようかなー。

7月22日更新

Unityに問い合わせた結果、Unity2017で再現することを確認していただきバグだと判断してもらえました。
また、Unity2019では再現しないようです。

投票率が高いものから修正するとのことなので、
もしよろしければ以下から、バグ修正依頼のButtonをクリックしていただけたら助かります。
Unityアカウントが必要です。
↓外部リンク(Unity)
Unity Issue Tracker

スポンサーリンク