Unityでソシャゲを作りたい#10 FontTextureが重すぎてメモリ不足に陥る問題対策(力ずく)

ある程度完成してきて、実機でちゃんと動くかテストしていたところ、以前から問題だったPOPUPが起動しない問題に激突しました。

以前も同様の問題を発見し、ベストフィットが原因だろうということで、こちらのサイトを参考にというか丸パクリして若干改善していました。

しかしながら、現在使用中の強い方の端末(galaxy S10 5g)ではギリ動くものの、弱い方の端末(AQUOS R)では以前文字がバグるかゲーム自体が止まる始末。

これを何とかすべくプロファイラを見てみたところ、やはりというかメモリがバカみたいに消費されてました。

初期値を何も考えずに300とかに設定すると馬鹿みたいに大きなフォントテクスチャが生成されて文字数もそれなりにあるせいで膨大な量のメモリを食うというわけでしょう。

画像1

青色の部分がテクスチャのメモリ使用部分ですが、0.8GB?は?ってなりました。

詳細を見ると一発でわかりますが

画像2

御覧の通りほぼほぼFontですね。

ただし、ご紹介したサイト様のスクリプトは結構すごくて、初期値を300にしちゃう愚行をしてもBestFitより100MB近く軽いので非常に優秀です。

しかしながらできればもっとずっと抑えたいところなので、いっそフォントサイズ手動計算しちゃえばいいんじゃねという結論に至りました。

解決案

フォントサイズの規定とかある気もしますが、知らないので、こういう時はパワーでデータとります。

標準フォントのArialにした「M」の文字をテキストコンポーネントにぶち込み、10刻みでフォントサイズを変更した際、高さいくつまでなら消えずに表示されるかを測定したところ

画像3

大体こんな感じでした。

要はフォントサイズ10の時、ちょうど消えるギリギリの高さが11って感じです。

50の時の高さが56なのを踏まえて、関係式は

画像4

こんな感じと仮定しました。

フォントサイズ150でテストしてみたところ、結果ぴったり。

ズレはあるかもしれませんが、実用上は

[枠の高さ] = [フォントサイズ]*(28/25)

で計算できそうです。

ちなみにフォント変えると結果も変わるので悪しからず。

これをもとにテキスト枠の高さからフォントサイズを返すStaticClassを用意して、標準値を0にしてフォントサイズはスクリプトから直接指定できるように改修しました

これが大当たり。

画像5

画像6

画像7

上から、先ほどと同じ画面を表示した際の、生成前、生成する瞬間、生成後のメモリです。

生成する瞬間は他のインスタンス類も生成されるのでそれなりに増えますが、前後で総使用量は0.5MBほどしか変わりません。

劇的改善です。

あーよかった。

ただし、stretchに指定した枠のサイズがうまく取れなかったので、すべて個別で枠の大きさを指定する必要がありますが、基本全部そんな感じで作ってるので僕にとってはさほど問題ではなかったです。

現状常時200MB台のメモリを食ってますが、まだ一部テキストはベストフィットなのでそこでフォントテクスチャ60MB程度、実は流れてるBGMが50MB程度メモリを食っていて、他部分で100MB弱くらいという内訳です。

一般的なゲームがどれくらい食うのか見てみましたが、

最近ベアトリスが連続出来てガチャ引くためにストイックに取り組んでいたリゼロスが最大で1.4GB程度、天下のパズドラ先生が最大で400MB程度でした。

リゼロスちょっと食いすぎじゃね?って気がしますが、まぁいいでしょう。

まぁとりあえず現状は200MBくらいならいいかな!

削減するに越したことはないので、音楽とか削れそうな部分はどんどん削っていきたいですね。

今回はひとまずこれで。

この記事が気に入ったらサポートをしてみませんか?