見出し画像

【非公式】大規模ワールドクラフトの軽量化とか、軽量化を想定したクラフトアイテム製作のあれこれとかの雑記です

【* 2023年11月4日 初版作成 *】
【* 2024年3月31日 TextViewのアイテム容量影響と読込速度について追記 *】
「cluster」というプラットフォームで、ワールドクラフト機能を使って大規模なワールドをつくるときの軽量化で注意している事とか、軽量化を想定してクラフトアイテムをつくるときに気を付けている事とか、その辺りの雑記です。
書籍とかに相当する内容ではなくて、個人的に調べたり試したりして気づいた事とか推測して実践してることを書いています。内容を保証するものではなくて、どうしたらいいか見当つかない時に参考にする程度で、お読み頂けたらと思います。


▼ワールドクラフトの軽量化って?

ワールドクラフトの基本的な仕様は公式資料を見て頂くとして、
軽量化を考える対象については、大きく3つ観点があると思います。
 (1) アイテム容量 … 101%以上でアップロード不可になる
 (2) 描画負荷 … 重くなりすぎると体験や操作性に影響がでる
 (3) 読込速度 … 入場後の待ち時間に影響。イベント会場用では要注意。

この2つ、比例しているわけではなくて、それぞれ独立した指標と考えた方が良さそうです。(1) アイテム容量 は、極論100%以内におさまればOK。
(2) 描画負荷 は、上がれば上がるほど実影響も大きくなるので、大規模なワールドをつくる上では可能な限り節約した方が良さそうです。

だんだんワールドクラフトで可能な事が増えてきて、軽量化を考えることは避けられなくなってきています。そもそも軽量を目指しているプラットフォームでもあるので、重いワールドばかりになっては良くないかもです。
アイテム容量と描画負荷をうまく節約して軽量化することで、快適に遊べる大規模なワールドをアップロードできるようになるかなと思います。


余談ですが、「ワールド入場時の読込時間」は、アイテムの個数や種類で増えていくようです。大規模ワールドで長時間読込は避けようがなさそう。ただ、読み込んでしまえば体験や操作性に影響するものではないので、あまり気にしなくて良いかもしれません。
イベント会場用ともなると、あまり長いと来場した人が困惑する可能性はあると思うので広すぎるワールドはアナウンス等に気を配った方がいいかもしれません。ワールドクラフトは『読込中である事が明示されない』ので…。

ちなみに読込時間も、アイテム容量とは比例していないみたいです。これは触ってたら何となく察しました。Script Itemを大量に使ったワールド等では、アイテム容量が100%近くでも読込時間は速い…といったことが起きるみたい。以上、余談でした。

▼アイテム容量 節約のあれこれ

実影響と比例しない指標とは言え、大規模なワールドともなると、途中で101%以上にならないように気を付けないといけないです。せっかく考えた構想が台無しになったり、組み立てた場所を泣く泣く消したりしないといけなくなります。なので、アイテム容量が増える仕組みを把握して、無駄遣いしないの大事だと思いました。公式資料があればそちらを正にするとして、いくつか把握している増加条件を列挙しておきます。
 (1) アイテムを置くと容量が極少量増えます(1%未満)
 (2) Script Itemを置くと容量が固定1%増えます
 (3) ワールド内のアイテム種類が増えると容量がわりと増えます(1%未満)
 (4) TextViewの付いたアイテムを置くと容量が[付けた数×1]%増えます

(1)~(4)は加算方式っぽくて、まだ置いてない種類の・Script Itemを・新たに置いた時に増加量は最大になる感じでした。新規ワールドにScript Itemを置くと固定1%ではなく2%増えるのはその為と思われます。

これらを踏まえてアイテム容量を節約しようとすると、次のような事を気を付ける必要がありそうです。
・なるべく大きなパーツを使って、置くアイテムの絶対数を減らす
・無くていいScript Itemは使わない(アイテム毎 固定1%上乗せは大きい…)
・同じアイテムで統一できるところは、なるべく統一する
・TextViewが付いてるアイテムは必要に迫られない限り使わない

置いているアイテム数が増えれば増えるほど、アイテム容量も増えます。アイテム数は少ない方がいいので、理由もなく小さいアイテムの大量設置は避けた方が良いです。広い範囲に敷き詰めるなら、綺麗に1mの倍数になる最大のサイズ「4m」のアイテムを使うのが妥当だと思います。

ただし、扉や窓の上下等、4mでは対応できず代用パーツの種類が多くなる場合、アイテム種類数による増加分と相談になります。例えば極端な話、小さな物置小屋の壁に、そこでしか使わない種類の壁を4m・2m・1mと組み合わせて使うくらいなら、1mの1種類で敷き詰めた方がマシになります。
超レアケースな上に、後述する描画負荷の事も踏まえると大きなパーツの方が良いのですけどね…何があるかわからないので仕組みの話です。

あと、いくらアイテム数が減るといっても、Script Itemで床を展開するようなアイテムでは、固定1%が上乗せされてしまい逆効果になります。展開するタイプのアイテムは、アイテム容量に余裕あることがわかっていて、作業を楽にしたい場合の選択肢として捉えておいた方が良いです。

ただし、例外はあります。波打つ水面や、風に揺れる草原みたいな「そもそもScript Itemであることが必須」のアイテムについては固定1%上乗せが確定しているので、可能な限りそのアイテムの中で展開して広い範囲をカバーできるアイテムの方が節約になります。

正直、単純な話ではないので、状況に合わせて最適を選べるように練習するしかないかもしれません。

▼描画負荷 節約のあれこれ

ワールドクラフトはUnityがベースなので、描画負荷の節約についてはUnityの記事が参考になりました。「Unity ゲーム 最適化」みたいなキーワードでWeb検索するとそれらしい記事は見つかると思います。技術的な細かいところはそれらの記事を読んでもらえたらと思います。
ただ、ワールドクラフトを使ったワールドづくりは「アップロードされたクラフトアイテムを使う」という仕様がつきまといます。なので、負荷対策として検討できるものは、Unityよりも限定的みたいです。

それを踏まえて、
ワールドクラフトの組み立て段階で対策できるのは下記になると思います。
・大きなパーツを使ってアイテムの数を減らす(厳密にはメッシュ数)
・emission付の光るアイテム等 負荷が上がる物は、必要な分を計画的に使う
・一人称/三人称の視界に一度に映るアイテムが集中しすぎないワールド構成を検討する

ここで言うメッシュはアイテムの部品みたいなもので、この単位で質感を割り当てできたり、光る設定ができたり、Scriptで動かしたりできます。このメッシュ毎に描画処理を呼び出すので、メッシュ数が描画負荷に影響する感じです。1アイテムに少なくともメッシュが1以上含まれるので、必然的にアイテム数が少なくて済む組み方が負荷軽減に繋がります。

ただ、結局のところメッシュ数なので、仮に「縦4m・横4m」に見えるアイテムだとしても、「縦1m・横1m」のメッシュを16個並べた「縦4m・横4m」のアイテムだった場合は、メッシュ数は16という事になります。
これはもう見た目で解りようもないので、そういう事もある程度のお話になりますけどね…。

メッシュの数だけでなく設定によっても負荷は変わるみたいです。
「100の光らないメッシュ」と「100の光るメッシュ」では、後者の方が負荷は高くなるみたい。まあ、光る為の計算が増える事になるのでそれはそう。

例えばですね? 顔・耳・目・口・両手・両足・尻尾・胴体が全部違うメッシュで作られた猫のようなアイテムで、それも光る設定が付けてあって、一箇所に大量設置されていて…その方角を視界におさめようものならカックカクになるわけです。

私が造った悪い例のワールドをご紹介しておきます。

描画負荷の元凶

"複数"の"光るメッシュ"を含むアイテムが"大量設置"されています。ワールドに入って正面の方角に、この場所が位置している構成も大失敗です。ワールドに入った途端、不可避の激重に襲われます。後ろに振り返ると軽くなるのは、この元凶が視界から外れるからですね。

ざっくりこんなイメージです

そもそも描画処理が動くのは「カメラに端っこでも映っているもの」というUnityの仕様があるみたいです。実際ワールドクラフトでも、遠目でたくさんのアイテムが視界に入る場所で描画負荷が高くなる現象が見受けられます。
そういう場所はワールド進行のメインルートから外したり、描画限界を超えるくらい移動させて回避したり、ワールド構成を考える段階から気にしておいた方が良いかもしれません。

▼自作アイテムで工夫できる負荷対策

ここからは、BlenderやUnityを使って自作アイテムを作ってる人向けです。
負荷対策として、私がどんな工夫をしているか紹介していきます。

で、振り返りですが、ワールドクラフトを使ったワールドづくりは「アップロードされたクラフトアイテムを使う」という仕様がつきまといます。なので、負荷対策として検討できるものは、Unityよりも限定的。

例えば「マテリアルの統一」とかは個々アイテムに埋込でどうしようもないですし、「テクスチャの圧縮」とかはそもそもアップロード時点で自動圧縮されてます。対策できそうなものを記載していきますね。

【アイテム内部のバッチ処理をひたすらがんばる】
 クラフトアイテムは限られた範囲でつくるので、基本的にメッシュとメッシュは近距離です。近距離のメッシュはバッチ処理による恩恵を得やすいので、積極的に統合しましょう。ただし、マテリアルが異なるものはメッシュを分ける必要があるのと、Scriptで動かす単位はメッシュが独立している必要があります。逆に言うと、マテリアルが同じで動かさないものは全部統合しないと、無駄な描画負荷が生まれてるよ…ということです。

光るものと木製のもの、それぞれ同じマテリアルのグループでメッシュを統合。
動かす部位がないなら、見た目が離れていても全部統合した方が良いです。
先にマテリアルを設定していた場合、マテリアルが増殖するので1つに再設定します。

 それと若干観点はズレますが、近くに置く予定の細かいアイテムは、1つのアイテムに包含してメッシュを統合した方が良いです。もちろん、クラフトアイテムの各種制限が許す範囲です。

机の上のもの、まとめてみた! ドヤァ

 4m×4m×4m(厳密にはもう少し猶予あり)の範囲からはみ出る物は1つのアイテムにまとめられないですし、マテリアルは2種類までなので「光る・光らない」「金属・プラスチック」といったたくさんの質感が混ざってしまうようならまとめられません。質感は大丈夫でも、解像度の高いテクスチャが必要な部位をまとめすぎると、マテリアル2種類=テクスチャ2枚分では入りきらなくなる恐れもあります。どのくらいまとめるかの加減については、経験を積んで慣れるしかないです。
 極力まとめてアイテム数を減らせるようになれば、描画負荷だけでなく、アイテム容量の節約にもなって幸せになれます。

↓ 参考になりそうなアイテム紹介(色んな向きで見たい時は試し置きで)
電車一般車両2分の1
┗ 窓と、それ以外でメッシュは2つです。扉もメッシュ統合しているので、開け閉めして乗車・降車するScriptは仕込めない仕様です。その代わり、ひたすら軽いです。
大きなテレビと録画用HDD
┗ テレビも、台も、チューナーも、録画用HDDも、メッシュ統合した1つのアイテムです。自分でつくって使う想定なら、描画負荷もアイテム容量も節約できるので良い感じ。ストアに並べるだけなら、個々でアイテムにして汎用的な方が好まれそうですけどね。ここは優先目的しだいな感じです。

【敷き詰め想定のアイテムは4mサイズの選択肢を用意する】
 床・壁・ブロック等のたくさん敷き詰めるアイテムは、1個あたりの節約が置いた数だけ影響していきます。先に書いたバッチ処理はアイテム1個の中での節約ですが、大きいサイズを用意しておけば置いた数による掛け算が減るので、結果としてワールド単位で見たときの節約になります。綺麗に1mの倍数になる最大は4mサイズですから、このサイズのバリエーションは作っておいた方が良いです。

既に他のところで貼った画像ですが再掲!
ワールドクラフトする身としては、4m×4mのバリエーションは必ずほしいです!

 ただ、家の壁等は窓や扉が付いていて小回りのきくサイズも欲しくなります。なので、そういう場合は4mサイズ・2mサイズ・1mサイズのバリエーション…可能なら、それらを組み合わせた時に模様や凹凸が綺麗に繋がるようなものを用意すると良いでしょう。

こちらも再掲です。
細かいところつくろうとすると、2mや1mのバリエーションもほしくなるのよね…

 例外として、既に存在しているアイテムとの組合せを想定している場合は、そのアイテムと同じ単位になるバリエーションが必要になります。

↓ 参考になりそうなアイテム紹介(色んな向きで見たい時は試し置きで)
乾いた地面
┗ 4mサイズの地面です。屋外の広い範囲に敷き詰めてもアイテム数は少なくて済みます。1mサイズと比べて、16分の1もの節約になります。
組合せ崖パーツ
┗ 単純なブロックの形ではないですが、4m×4m×4mの立方体サイズです。屋外の広い範囲に敷き詰めても、アイテム数は少なくて済みます。
立方体の個々の面に違う役割(凹凸)を付けておくと、1つのアイテムの回転・重ね配置だけで複雑な地形が再現できるメリットも。こういった設計にしておけば、アイテム種類の節約にもなってさらに嬉しいですね。
アスファルトの床3x3
┗ これは4mではなく3mです。公式のクラフトアイテムに道路パーツがあるのですが、アスファルトが1mしかなくて、軽量化の為に3m版をつくりました。アスファルト以外の道路パーツが3m単位なので、同じ単位に揃えて無駄なく配置できるようにしています。

【Script Itemは固定1%上乗せに勝る価値があるかで検討する】
 
Script Itemを使えば色々な演出ができます。ワールドも華やかになります。ですが、何でもかんでも「私が考える最強の演出」をしていたら、アイテム容量なんてすぐに尽き果てます。
 完全には難しいですが、ワールドの検討段階でざっくり容量計画は立てましょう。例えば、区画1は30%以内、区画2は70%以内みたいな感じです。物語形式であれば「より詳しく伝えなければいけない区画を優先」みたいな感じです。で、その容量の中でScript Itemを何に何個使うかは、早い段階で決めてしまった方が良いです。
 これ実践したみたところ、各区画ができた時点で想定より多いか少ないかも可視化されますし、アイテム容量が不足しない為の調整がスムースになりました。つくって置く予定だったScript Itemを優先度の低いものからカットするとかですね。

 じゃあどんな演出のためなら固定1%上乗せに勝る価値があるの? って話なのですが、もうこれは個人の感覚の領域なので各々考えて答えを出しましょう。考えることが重要ということです。
 ただ、明らかに破綻している場合は別です。アイテム容量を削減したいのに逆に増える結果になるとか、描画負荷を削減したいのに効果がないとか、手間を減らして時間短縮したいのに扱い難いとか、そういうのやめましょう。それらを誤った説明でストアに並べようものなら、さらに質が悪いというか…たぶんNGです。気をつけようね(自戒も込めて)

【Script Itemは可能な限り1つのアイテムにまとめて設計する】
 
大事です…とても大事。とにかく数を減らしたいので1つでも多く、同じアイテムの中に詰め込みたいわけです。
 例えば、同じ形の猫さんが横に並んで5匹、くるくる回転し続ける状況を作り上げるとします。これらは同じテクスチャ、同じマテリアルです。この場合、アイテムは1個で設計した方がアイテム容量の節約になります。マテリアルは2種類までの制限に引っかからないし、動作に関しては回転させる対象の単位でメッシュを分ければいい話。
 猫が1m間隔で並んでいるとかで4m×4m×4mのサイズ制限に引っかかるなら、初期化処理の中なりでメッシュの位置を移動させれば良いです。サイズ制限はアップロード時の話なので、ワールドクラフトで配置する段階、実行されるScriptで移動させれば限界突破できます。

 ただ、やりがちなミスがあります。「Script Itemをまとめる」のであって「Scriptが付いてないアイテムをScript Itemにまとめる」のではないです。
これしてしまうと、存在しなかった固定1%上乗せが発生する事になるので、アイテム容量節約になりません。メッシュも減らないので、描画負荷も下がりません。大規模ワールドではアイテム容量の無駄遣いが致命的になることもあるので、そういうのやめましょう。

Scriptどう書くの? …については、記事の趣旨と違いますし、既に詳しく解説してるようなサイトもあるので触れません。すみません。

【変動しない文字表示は可能な限りテクスチャで設計する】
これ知らないでTextView使いまくると痛い目みます。
TextViewはSubNodeに付けるものですが、これ付けた数だけ固定%上乗せされます。10個のSubNodeに付けると、10%増えるとかいう次元の話です。
とても便利だし、メッシュ種類やメッシュ数にカウントされない限界突破能力も兼ね備えてる機能ですが…代償もとても大きいです。
例えばテクスチャに絵として埋め込んだ場合、文字列は固定の文章になってしまうので、Scriptの処理結果で文字列を変動させたい場合はTexitViewを選択する…みたいな基準になりそうですね。
メッシュ種類数が足りないから、テクスチャ領域が足りないからという理由で採用するのもありかもしれないですが、いずれにしても『必要に迫られない限りは使わない』が正解になりそうな気がします。

当記事の内容は以上になります。
『お し ま い』

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