🔧

clusterのワールドを軽量化しよう

2020/12/16に公開

これはCluster Creator Kit Advent Calendar 2020 15日目の記事です
数分遅れで16日に投稿しています
サーセン

https://adventar.org/calendars/5175


あんた誰?

Dolphiiiinです(ほかに書くことはない)

Twitter

さて今回はワールドの重さの話です
clusterではハイスペックなPCを使用している人もいればスマホの人もいます
そんな中でネックになってしまうのが、ワールドの重さです
実際に自分のワールドでパソコンだと入れるのに重くてスマホで入れないという事故がよくありました

clusterのワールドサイズ

ワールドサイズが大きすぎると、ロード時間が長くなってしまい、ユーザーに対してのストレスになってしまうこともあります。RAMの消費量が増えてしまうため、場合によっては処理落ちしてしまうと言うこともあります
(自分が知っている中で最もサイズが大きかったのは、837MBでした)
とりあえず80MBを目標にして制作するのがおすすめです

今回軽量化するワールド

今回はアセットのFPS Hangarのサンプルシーンをワールドとしてアップロードしたものを軽量化していきます
まずワールドサイズは、79MBとまずまずの容量でしょう
しかしながら、一部の人は読み込みが困難な場合があるかもしれません

まずは開発者モードを有効にしてFPS値を見てみましょう

(単純にPCのスペックが低いというのもありますが...)5.6FPSとただ歩くだけでも操作が困難なほどです
さらにこれがゲームだとすると、圧倒的なクソゲーと化するでしょう...

ワールドのサイズを削減する

テクスチャ

経験上テクスチャがワールドサイズの大部分を占めている場合が多いです
WizTreeというソフトを使用して、プロジェクト内のファイルサイズを調べてみましょう


今回の場合 .tgaつまりテクスチャ用の画像ファイルが大多数のようです

テクスチャを圧縮する

基本的には画像の解像度を下げるソフトを使用するのが効果的なのですが、面倒くさいので他の方法を使います


UnityのProject画面の検索にt:Textureと打つことで、テクスチャのみを絞り込むことができます
圧縮するテクスチャを選択して、インスペクターを開きます

圧縮するには、

  • MaxSizeの値を落とす
  • Compressionを落とす
  • UseCrunchCompressionで強く圧縮する

ことでできます

自分はいつもとりあえずサイズ重視で圧縮したいので、UseCrunchCompressionをオンにして0に設定しています
(これがいいのか悪いのかは知らない)
設定したらApplyで適用しておきましょう

一旦これでアップロードしてみます
アップロードしたところ、79MBあったワールドサイズが18MBにまで削減できました
とりあえずワールドサイズはこれで十分でしょう

ワールドの最適化

次はワールドのFPS値の改善を行っていきます
Unityのプレビュー画面から、Statsを見ていきましょう

SetPass Callsを見てみます
現在のところでは635となっています

目標としてはこの値を100まで下げたいところです

ワールドのライティング

このワールドでは数多くのライトが設置されています
ライトを事前に計算しておくベイクをして軽量化をしてみましょう

始めにベイクするライトのModeBakedに設定します

一つ一つ選択して変更するのもいいですが、今回はLight Explorerを使用します

Unityのメニューから
Window=>Rendering=>LightExplorer
で開きます


変更するライトを一括選択して、Bakedに設定します


次にオブジェクトにStaicを設定します

動かさないオブジェクトのインスペクターを開き

Staicにチェックを入れます

これでベイクを行っていきます

Window=>Rendering=>Lighting Settingから設定画面を出します
詳しい設定項目については割愛します...


今回はこのような設定でベイクします

画面下のGenerate Lightingを押すことで、ベイクが開始します
気長に待ちましょう
このライトベイクが完了した時点で、もう一度プレビューで確認してみます
SetPass Calls635から172に改善しました
FPS値も向上しています

オクルージョンカリング

Unityの機能として、オクルージョンカリングというものがあります
普段プレイヤーの視線の向きの関係なしにワールド全体が描画されます
オクルージョンカリングを使用することで、プレイヤーの視線に入っているオブジェクトのみを描画することで、負荷を下げることが期待できます

cluster公式がいい感じの記事書いてくれたのでおすすめです
https://creator.cluster.mu/2022/03/24/occlusionculling/

旧解説

オクルージョンカリングのウィンドウを出しましょう
Window=>Rendering=>Occlusionより表示できます

Visualizationの項目からBakeを押してオクルージョンカリングをベイクします

オクルージョンカリングの画面を表示した状態でプレビューをすることで、Sceneの画面で実際の動作を確認できます

https://gyazo.com/fd16eec51435a4d3a994e99fea8524cf

オクルージョンカリングをすることによって、SetPass Callsの値がまたさらに低くなり40となりました
これで目標の100*を下回ることができました やったね!

さらに軽量化する

まださらに軽量化したい場合は、MeshBaker、Mesh Simplifyという有料ツールで軽量化したり...
探せばもっと軽量化の手段があるので、探してみるのもいいでしょう

おまけ

今日からUnity Asset Storeでアセットが最大50%OFFになる年末年始セールが開催されています
アセットは持っていて損はないし、ゲームジャムでも結構役立つのでチェックしておきましょう!


Cluster Creator Kit Advent Calendar 2020 12/25の記事はこれで以上です
明日今日はガルペノさんのclusterゲームワールドに求められる3要素です!

Dolphiiiin

Discussion