VR/ARコンテンツ 軽量化(モバイルやスタンドアロン型HMD向け)を学ぶ

VR/ARシーンを作っているとシーンのサイズが膨らみ、描画負荷がどんどんと高くなっていきがちです。

実際にVRやARでシーンを見ようとすると、高負荷が原因でシーンを正しく表示できなかったり、メモリ不足でアプリケーションが強制終了してしまうことがよくあります。

こういった負荷の問題は、マシンスペックが十分ではないスタンドアロン型のHMDやスマートフォンARでより起きやすい傾向にあります。

こうした負荷の問題は後回しにされてしまいがちですが、作品をより多くの人に快適に見てもらうためには非常に重要です。シーンの軽量化を行っても作品自体の見た目はほとんど変わらないこともよくあるので、可能な限り軽量化に取り組むようにしましょう。

この記事ではSTYLYでVR/ARシーンを制作するうえで負荷が高くなりがちなポイントを一つ一つ理解していき、適切なシーン軽量化方法を学んでいきます。

負荷が大きくなることで引き起こされる不都合

さて、前項でも紹介したように、シーンの負荷が大きくなるとさまざまな不具合が引き起こされる可能性があります。以下に列挙する現象が起きる場合はシーンの負荷が高くなっている可能性が高いため、シーンの軽量化を行う必要があるといえるでしょう。

負荷の高まりで引き起こされる症状

補足

フレームレートの低下
(画面がガクガクする)

VR/ARともに起きやすい現象です

アプリケーションの強制終了

ARの場合、スマホのメモリ容量が小さいため特に起きやすい現象です。
シーンのサイズを小さくする必要があります

画面のちらつき

 

描画のバグ

 

ロード時間が長くなる

特にSTYLY mobileの場合、モバイル通信でデータをダウンロードすることも多いため、
シーンのデータは可能な限り小さく保つ必要があります

VR/ARシーンの確認に高スペックなPCやスマートフォンを使っている場合、負荷が高いシーンでも上記のような不具合が起きない場合があります。

しかし多くの人に作品を見てもらうことを考えているなら、大多数のユーザーのPCやスマートフォンは必ずしも高スペックではないことを意識したほうが良いといえます。

STYLYで作品を制作することに慣れてきたら、シーンの軽量化を常に意識するようにすると良いでしょう。ポイントさえ押さえれば、そこまで意識せずともシーンを軽量化しつつ制作することができるようになります。

負荷が大きくなる原因とは?

Unityで制作するシーンの負荷が大きくなる原因はさまざまですが、ここではSTYLYでVR/ARシーンを制作する際に気を付けるべきポイントを下表にまとめました。

シーンが重くなってしまったら、以下の表に該当する部分がないか確認してみましょう。

カテゴリ

負荷の原因

配置するオブジェクトの数

配置するオブジェクトの数が多すぎる

素材の問題

3Dオブジェクトの頂点数が多すぎる

テクスチャの解像度が大きすぎる

動画データが大きすぎる

Unityの高負荷な機能の使用

ライトや影の多用

Rigidbodyを使った物理挙動の多用

動画を再生する機能の多用

パーティクルを高負荷な設定で多用

その他にも高負荷な機能は多くあります

PlayMakerの問題

FSMの不適切な構造
(一度に大量のロジックを動かし続けるなど)

「create gameobject」のような高負荷なアクションの多用

上記以外にもさまざまな原因が存在します。

軽量化の際に見直すポイント一覧

どのようにシーンを軽量化すべきかはケースバイケースなので、一概にこうすべきであると論ずることは難しいといえます。しかしUnity初心者が陥りやすいポイントはある程度絞られるので、「どこから手を付ければ良いかわからない」という場合は、以下の表を参考に軽量化を行ってみてください。

※下表の「見直すべきポイント」に記載している例はあくまで参考のもので、PCVRで作品を鑑賞してもらう分には問題なかったり、スマホARで作品を見てもらう場合はもっとシビアなこともあります。

あくまで、目安として捉えていただければと思います。

※作品のどの部分を際立たせたいかによって、軽量化すべき部分は変わってきます。例えばフォトグラメトリで制作した非常に高精細な3Dモデルを観せたい場合は、ポリゴン数の削減やテクスチャの圧縮とは違う部分で工夫するべきです。

自分が作品のどの部分を際立たせたいかを意識しながら、軽量化する部分を精査する必要があるでしょう。

ポイント

見直すポイント

解決方法

効果

明らかに不適切な箇所を解消する

3Dオブジェクトのポリゴン数やテクスチャサイズがあまりに大きすぎる

大きすぎる素材データの使用は負荷が高いので避けましょう

ライトの数が多すぎる

Lightは負荷が高いので、無制限に使用することは避けましょう

Rigidbodyを使った物理挙動を多用しすぎている

Rigidbodyで大量のオブジェクトを動かすのは負荷が高いので、無制限に使用することは避けましょう

大量のパーティクルを一度に発生させるなど、パーティクルを高負荷な設定で多用している

無理のあるパーティクルの使い方は高い負荷になります。適切な使い方を心がけましょう

場合による

明らかに無理のあるPlayMakerの使い方をしている

不適切なPlayMakerの使い方は負荷が高いので避けましょう
より適切なロジックの組み方で、低負荷で同じ仕組みを実現できる場合もあります

場合による

シーンに配置されるオブジェクトの数を減らす

大量のオブジェクトをシーンに配置している

シーンのオブジェクト数を減らしましょう。作品の表現上、どうしても表示するオブジェクトの数を減らしたくなければ、一つ一つのオブジェクトのデータを小さくすることで解決できる場合もあります

作品の見た目や機能が変わらない範囲で軽量化を行う

見た目が変わらない範囲で素材を軽量化
・メッシュ
・テクスチャ
・動画

見た目を損なわない範囲で素材の軽量化を行います。見た目はほとんど変わらないのに大きく軽量化できる場合が多々あります

上記の軽量化対策を行っても改善されない場合は、下記の対策が必要です。

作品の見栄えを多少落としてでも、負荷を小さくしていく

素材をさらに軽量化する

作品の見た目を多少落としてでも、さらに負荷を小さくする必要があります

負荷の高い機能の使用をやめる
・Light/Rigidbody

オブジェクトの数を大幅に減らす

実現可能な表現に切り替える

最後の手段として、負荷の高い表現を切り捨ててしまうことも考える必要があります。現在のVR/AR技術にはどうしても限界があるので、その範囲内で制作できるように作品の表現や内容を変更する必要があるかもしれません

 

配置するオブジェクトの数を見直す

配置するオブジェクトの数を減らすのは、最もシンプルで明快な軽量化の方法です。

ただし、作品の表現上、表示するオブジェクトの数を減らしたくない場合もあると思います。そのような場合は一つ一つのオブジェクトのデータを小さくすることで解決できる場合もあるので、まずは素材の軽量化にトライすることをおすすめします。

<Tips>Rigidbodyで物理挙動させたオブジェクト

Rigidbodyはシーン内のオブジェクトを現実の物理法則に則って動作させることができる機能です。物が落ちたり、物と物が衝突する様子をシミュレーションできます。

Rigidbodyを使用して物理挙動するオブジェクトがシーン内に大量にある場合、シーンの負荷は高まりがちです。

素材を軽量化する

初めてUnityを触る場合、素材の大きさが不適切なことが原因で負荷が高くなってしまうことが多々あります。

軽量化の最初のステップとして、各種素材類が適切なデータの大きさになっているか確認しましょう。

メッシュの軽量化

メッシュは3Dオブジェクトの形状を定義するファイルで、軽量化を考えるうえでポリゴン数が大切になってきます。

ポリゴン数が多いほどなめらかな3Dモデルとなりますがその分巨大なデータとなり、シーンに与える負荷が大きくなってしまいます。

Image6

左:ポリゴン数が多いメッシュデータ、右:ポリゴン数を削減したメッシュデータ


あまりにもポリゴン数が多いとパフォーマンスに影響が出るため、作品として許容できる範囲でポリゴン数を削減していく必要があります。

メッシュデータの軽量化(ポリゴン数の削減)は、Unityの標準機能で行うことができません。メッシュデータの軽量化を行うためには、BlenderやSymplygonといった外部ソフトを使用する必要があります(あるいは、Unity上でメッシュデータの軽量化を行うことができるAssetもUnity Asset Storeで販売されています)。

<Tips>Blenderを利用してメッシュデータを軽量化する

Blenderは無料で使用できる3Dモデリングツールです。このソフトを使って3Dモデルのポリゴン数を削減し、軽量化することができます。

まずはBlender公式サイトからBlenderをダウンロードしましょう。

Blenderを開いたら、まずはシーンに配置されている不要なオブジェクトを削除しましょう。

Image9

次に、ポリゴン数を削減する3Dモデルをインポートします。

File > Importと開き、インポートする3Dモデルの形式を選択します。ウィンドウが開いたら、3Dモデルを保存してあるフォルダを開き、3Dモデルを選択します。

Image7

3Dモデルをインポートできたら、表示形式を「Wireframe」に切り替えると作業しやすくなります。右上の表示切替ボタンから「Wireframe」表示を選択しましょう。

Image11

次に、編集する3Dモデルを選択した状態で、EditorからModifier Propertiesを開きます。Add modifierのプルタブを開きDecimateを選択し、Ratioに適切な数値を入力します。

Ratio 1.0は100%を意味しており、これより小さい値を入力することでポリゴン数を削減できます。

(例)Ratio 0.5ならポリゴン数を50%まで削減

   Ratio 0.1ならポリゴン数を10%まで削減

Image3

しばらく待つと処理が終わり、3Dモデルのポリゴン数が削減されます。

Wireframeを見てみると、実際にポリゴン数が大きく減少していることが分かります。

Image5

削減前


Image1

削減後


テクスチャデータの軽量化

テクスチャは画像データのことで、3Dモデルに張り付けたり、UIのデザインを構成するために使ったりします。軽量化を考えるうえで特に解像度を考慮する必要があります。

当然解像度が高いほど画像が滑らかになりますが、高すぎる解像度は負荷の原因となります。

Image10

左:8192*8192(42MB)のテクスチャ、右 1024*1024(0.7MB)のテクスチャ


作品のクオリティを上げたいがために、解像度を高く設定してしまいがちです。しかし、例えばスマートフォンのARで作品を体験する場合、そもそも画面が小さいためテクスチャの解像度が高かろうが低かろうが見た目はさほど変わらないこともあります。

特にアセットストアで買ったアセットを使う際は、大抵の場合ハイエンド向けにテクスチャ解像度が大きく設定されているので、適切な解像度に変更する必要があります。

テクスチャの解像度の切り替えは、Unityのインスペクターウィンドウ(以下、インスペクターと呼ぶ)から実行できます。Project Windowで解像度を変更したいテクスチャを選択し、インスペクターを開きます。

Max sizeという項目があるので、プルダウンメニューを開き適切な解像度を選択してApplyボタンを押してください。

Image14

<Tips>テクスチャの無駄を削ぎ落とす

初めてUnityを触り自作で画像データを加工/作成すると、データの無駄が生まれがちです。

例えば以下の透過画像データを例にとると、文字の周りの空白部分に無駄が生まれています。

Image2

上の画像をの無駄な余白を切り詰めるだけでもパフォーマンスの向上が望めます。テクスチャデータを作成するときはなるべく無駄が出ないように心がけましょう。

Image4

<Tips>Mip Mapの設定をオフにする

Unityには元の解像度のテクスチャの縮小版を複数生成し、距離に応じてテクスチャの解像度を適切に変化させる機能があります。このテクスチャ群をMip Mapと呼びます。

カメラから遠いものをキレイに描画したり、負荷を減らしたりするために使用する機能です。しかしARのように小さい画面で描画する場合はむしろテクスチャサイズを大きくしてしまい、負荷につながることもあります。

特にこだわりがなければMip Mapの設定をオフにすることで、容量を削減できます。

Mip Mapの設定はUnityのインスペクターから実行することができます。プロジェクトウィンドウで変更したいテクスチャのMip Mapの設定を選択し、インスペクターを開きます。

Generate Mip Mapsという項目のチェックボックスがデフォルトでオンになっているので、チェックボックスを外してApplyボタンを押してください。

Image13

Unityの高負荷な機能の使用を見直す

Unityにはシーンのクオリティを引き上げるさまざまな機能がありますが、それら一つ一つがシーンの負荷を高めることに気を付けなければなりません。

ライトや影

ライトや影はシーンの臨場感を高める重要な要素ですが、多用すると非常に高い負荷がかかります。特にリアルタイムの影の描画は高負荷です。シーンのどの部分を際立たせたいか考えながら効果的にライトの設計を行う必要があります。

ライトの負荷が高いと感じたら、以下の点を見直す必要があります。

カテゴリ

 

ライトの数

ライトの多用は高い負荷になるので、使用するライトの数を減らすのが負荷を軽くするもっとも簡単な方法です。
配置するライトが本当に必要なものかどうか常に精査しましょう

影の使用

リアルタイムの影の描画は高い負荷をもたらします。ライトごとに影の有無を選択できるので、
本当に影が必要なライトにだけ影を適用しましょう

ベイクの使用

リアルタイムのライティングは高い負荷が伴うので、Unityにはベイクというオプションが用意されています。
ベイクとは、リアルタイムにライティングを計算して描画するのではなく、事前に計算した結果に基づいてライティングを行う機能のことです。これにより負荷の軽減が望めます。
動的にライティングを行う必要がなければベイクの使用も視野に入れましょう。

PlayMakerの使い方を見直す

高負荷なアクションが毎フレーム走るようなFSMの構造を控える

こちらは極端な例ですが、このFSMは何度も「Find Game Object」アクションが実行される構造になっています。シーンに配置されるオブジェクトの数が少なければ大した負荷にはなりませんが、シーンに大量のオブジェクトが配置されている場合は高い負荷を生み出します。

Image12

Cubeに追従するSphere


このFSMの構造を以下のように変えると、同じ結果をもたらしながら「Find Game Object」のアクションの実行を一度に抑えられるので、負荷を軽減することができます。

Image8

Cubeに追従するSphere


PlayMakerでFSMを組むときは、一つ一つのアクションが負荷を生み出すことに留意して、無駄のない構造を心がける必要があります。

高負荷なアクションの一例

カテゴリ

 

Create Game Object

Create Game Objectはシーンに新たなゲームオブジェクトを生成するアクションです。
シーンに新しいオブジェクトを生成するのは高い負荷をもたらすので、別の手段で代替できるなら代替することが望ましいです。

例えば、シーンにあらかじめオブジェクトを配置しておいて、
それをFSMでコントロールするので代替できるのなら、そちらの方がはるかに低負荷です。

Find Game Object

Find Game Objectはシーン内のオブジェクトを検索するアクションです。
大量のオブジェクトが配置されている場合は高い負荷を生み出します。

以上でシーンの軽量化の基本編は終了です。

適切にシーンの軽量化を行うことで、より多くの方に快適に作品を見てもらえるようになります。最初は難しいと感じるかもしれませんが、ポイントさえつかめばそこまで意識せずともシーンを軽量化しつつ制作することができるようになります。

より発展的な内容として、以下にUnity公式ドキュメントへのリンクを載せています。

これらを読み、Unityの描画の仕組みを深く理解すれば、シーンの軽量化の押さえるべきポイントをより理解できると思います。

グラフィックスパフォーマンスの最適化-
シーンのパフォーマンスを向上させるための手法がまとめられた公式ドキュメントです

レンダリング統計ウィンドウ
 シーンにどのくらいの負荷がかかっているのか、

 数値として確認できるレンダリング統計ウィンドウに関するドキュメントです。