新作ゲーム開発、まず実機パフォーマンスの確認
- BTA(Kelorin Jo)
- 2021年3月17日
- 読了時間: 6分
更新日:2021年4月9日
うまくいく目星がつくまでずっと黙ってましたが、新作ゲームはスクールシミュレータ作ります。

舞台は、モバイルを想定して最適化した町モデル・カモメ町forUnityでたたき台を作るため、南国…
沖縄風にしようって発想になりました。
マップデザインを島にしました。山の山腹と麓に、ぐるっと建物を配置してます。山頂に学校
モバイルでテレインは使えないというから、山はBlenderの山生成アドオンで作って

カモメ町だけではどう見ても日本に見えなかったので、昭和町モデル…は、モバイル最適化してないので直接は使えないので、沖縄風建築を新規作成します。
沖縄風ってのは、瓦屋根とかごつい建物とか。
他の町モデルからもすぐにモバイル用に改造できるものを選んで投入していきます

キャラモデルも、ローポリかつ独自の体型変化に対応できるような構造にするために新造。アセットストアでは日本風キャラモデルかつ男女揃って見た目もイケてるものが極めて少ないから、キャラデザをSKIMAで依頼して、それをモデリングしました。
まだかろうじて動くだけなのでスキニングも人に依頼しないといけません…

山頂には自然に囲まれた学校を配置。小さな島の分校のイメージで。

2ヶ月ほどで大まかにマップとキャラができました。
南国である以上、草木を大量に植えたいわけですが、モバイルで実現させるため、GPU Instancerを試してみました。
これは距離カリングとオクルーションカリングの上位互換というべき機能を提供するもので、 シーン上のプレハブをコンポーネントに登録するだけで視界と距離のカリングを実装し、カメラ外のプレハブを非表示にして処理を軽くし、遠くはビルボードに自動変換もできます。テレインのツリーと言わず普通のプレハブにも使えます。
オクルーションカリングとの最も大きな違いは、プレハブがStaticでなくても適用できます。 つまり動かしたり、プレイ中に生成・削除するようなものでもカリングの恩恵に預かれます。 スキニングメッシュも使えて群衆アニメーションもできる、 遠方にある時はコライダーもオフにして計算除外にしてさらに軽くもできる、 数万オブジェクト配置しててもサクサクさせられる、と謳ってるものですが…
しかし実際ほんとに動くのか確信するため、動作確認用のAndroidタブでビルドすると…
ガックガク。アルファテクスチャだらけの草木が画面に映ると、1fps。
GPU Instancerは仕事してるはずですが、効果が感じられない…
アルファなしのローポリ木に差し替えても10fps未満。木どころか、建物ごっそり削っても上がらない。
…
ここから一週間、影やポストエフェクトをオフにしたり(URPにしたら、気軽に影のオンオフが実装できない模様)、オブジェクトを削ったり統合したりメッシュコライダーを削ったり様々な試行錯誤を試しましたが、功を奏しませんでした。
かろうじてありだったのはカメラの描画距離を下げて2-3fpsの改善程度
プロファイラーを見ると、VSyncで埋め尽くされてました。

VSyncは描画同期待ちの意味で、別に処理落ちの元凶とかではないとあるものの、なにか腑に落ちないものを感じ…
詳細を省いて結論を言うと正解は、「表示解像度を下げる」でした。
まずカメラの描画範囲…クリップ面のファーを、150-200程度に抑えます。

※ホントは建物や小物などでレイヤー別に細かく設定します。参考記事
そして、URPのプロフィールをいじって影を非表示にします。URPの低解像度影は処理増やすくせに汚いので、ないほうがマシまである
そしてスクリプトで解像度を設定します。
Screen.SetResolution(width, height, true);
width = Screen.currentResolution.width;
height = Screen.currentResolution.height;
Screen.SetResolution(width/係数 , height/係数 , true);
(係数は1~4の整数)
て感じに、係数を操作してリアルタイムで解像度を変えられるオプションをつけて、
PS1なみの粗さにしたら、22フレームまで改善しました。

しかし、この機種の最大解像度の1280*800に切り替えても、だいたい22fpsキープしてたという結果も出ました。
つまり、なぜかわからないけど、解像度を何も設定してないと無駄に重くなるようでした。
解像度を固定してないと、内部でものすごいムダな処理が発生して遅延するみたいな?
※なおScreen.SetResolutionなど解像度絡みの処理はエディタ上での見た目は全く変わらず、ビルドして実機で確認するまで効いてるかはわかりません。
(それすっげえ大事なことだろうに、説明してない記事が多すぎませんかね…)
高フレームが確保できたところで、非表示にしてた草木を戻し、色々設定を変えて検証したところ、
1・ドローコール+バッチ数を300以下に抑える
2・アルファテクスチャをなるべく使わない(+なるべく重ねない)
3・メッシュのあるゲームオブジェクトがアクティブ状態で3000個以下の状態
という条件を満たした上で解像度を最適化したら、22フレーム以上に達するのがわかりました。
後にゲームオブジェクトが2000以下だと、ドロー数が300以上あっても30fps出せるとかもわかりました。
カモメ町モデルは、はじめからマテリアルをみっちり統合して、アルファも一部の窓ガラス以外殆ど使わず、かつローレゾテクスチャでも絵がつぶれにくい作りにしてあるので1と2は問題なしです。3もメッシュ統合したら確実に達成できます。
で、2と3の条件に真っ向仇なす草木モデルは、数十本はやしただけで11-14フレームまで落とされてしまいました。

草木はゲームの見栄え以外では重要ではないので、ボタン切り替えで表示を切り替えるようにして、非表示にしたら22フレームに戻りました。
それ以外の建物とかを非表示にしても、fpsにはほぼ影響なしでした。
※GPUIに登録した草木プレハブは、Hierarchy上で非表示にしても関係無しでシーンに表示されてしまいます。GPUIコンポーネントを非アクティブにすることで、プレハブがまとめて消せました。(再びアクティブにすればとくに不具合なくすべて再表示できます)

統合済みゲームオブジェクトが2800個+草など統合してない(=GPUIに登録した)ゲームオブジェクトが1000個、
ぐらいの内訳で11-14フレームでした。
GPUIと草を非アクティブにしたら22フレーム。でした。
GPUIは、画面に映らないゲームオブジェクトを非表示にして実質数十個分の処理に留めるはずですが、ステージ端の方を向いて画面に草木が全く写ってない状態でもfpsは上がらなかったので、ネックは描画でなくアクティブなオブジェクトの数が3000超えたのがアウトだったと思われます。
草木をアニメーションさせるとか草刈りできるようにするとかの仕様でない限り、メッシュ統合のほうが軽くなりそうでした。
追記: アセットストアのレビューをよく見たら、「URPやHDRPだとすっげ遅くなる」みたいなことが書いてありました。 検証動画もはられてあって。 https://youtu.be/pBjw64hu37E 要はこれは「GPUに処理を肩代わりさせる系アセット」であり、SRPもその一種であり、 あの処理もこの処理もGPU任せにしたらそりゃGPUがパンクするわってことでしょうか…?
で、ここまでの話は、あくまでAndroidタブレットを基準にした話です…。
iPhoneでもビルドしたところ(今回はビーチボールと違ってすんなり異常なく動作できました)、こっちは何もせずともiPhone7plusでフルHDでも30フレーム超え楽勝でした。

iPhone6以降を基準にした想定だと、上の数字よりドローコール+200,ゲームオブジェクト数+2000はいけそうです。
Androidタブどんだけ性能弱いの…
おかんのもってたスマホがS20で、スコア51万、iPhone7plusは26万
手持ちのAndroidタブ、P80Xは9万。
最新のタブですら、ベンチマークで近年のスマホに5-10倍のスコア差。桁違いの貧弱。
解像度も低い。画面がでかくて安い代償が大きすぎる。
こんなもんに合わせて3Dゲーム作るのは自殺行為とわかりました。オブジェクト数が少なければ戦えるけど、物量が必要な箱庭ゲームには無理じゃね。
(昔3Dがヌルヌル動くGeForceタブレットを持ってたから、タブレットの方がでかくて性能いいような思い込みがあったんですが)
しかしこのあと、想定してたモバイルの限界をまるごと覆すアセットを見つけてしまうのでした。
Comments