こんにちは、今回はマップ作成におけるクライアントの計算負荷対策についてのお話です。
負荷を抑えつつ魅力的なマップを作りたい、恐らく多くの人がそう思うと思います。
どんな幻境においても需要のある話だと思いますから良ければ参考にしてください。
![]()

クライアントの計算負荷について
クライアントの計算負荷というのは、私たちが使っている端末、つまりPCやスマホ、PS5側での処理の負荷のことです。
この負荷が高いと処理落ち(カクつき)が発生したり、最悪アプリが落ちたりといったことが起こります。
故に可能な限り低く抑えることが幻境を快適にプレイするために重要になります。
![]()
なおクライアントの負荷要求レベルを上げることは簡単です。
ステージ設定の中に負荷設定に関する項目がありますから、これを「低」から「中」や「高」に変えるだけです。

負荷要求レベルの変更方法
ただ原神の公式番組でも似たような話がありましたが、自己満足ともいえる技術の追求によってローエンドやミドルエンドの端末を切り捨てることは良いことではないですから、少なくとも私が作成している「あの頃の風の行方」シリーズにおいては負荷要求レベルは「低」で提供することを貫いています。
![]()
私自身スマホで幻境漁りをすることも多いため、負荷要求レベル「高」の幻境なんてそれだけで足切りです。
同じように要求が高いと見向きもしない、プレイしたくてもできないという人も多いのではないでしょうか。
とにかく私にとっては負荷要求を上げるというのは最終手段ですから、どう負荷を下げられるかということを常に模索しながら開発を続けています。
![]()

現状の負荷を確認する
最適化云々の前に、まずは自身が作成している幻境の現状を正しく把握する事が大切です。
負荷計算ツールの使い方については私が書くまでもなくドキュメントに詳しい説明があるので、まずはこちらを確認ください。
https://act.hoyoverse.com/ys/ugc/tutorial/detail/mho2hirgodxi
![]()
負荷計算ツールの使い方については把握できたでしょうか?
とりあえず重要な概念である静的負荷と動的負荷について簡単に記載しておきます。
- 静的負荷:編集中のステージの状態から推定される負荷
- 動的負荷:ノードグラフから生成されるエンティティや特殊効果も含めた負荷
クリエイターが最終的に気にする必要があるのは「動的負荷」の方です。
静的負荷はあくまでステージの状態から推定されたものでしかないため、最終的には実際のプレイで計測された動的負荷の結果に基づいて最適化を行う必要があります。
![]()
ここで実際に幻境を作っている人なら静的負荷については簡単に確認ができる一方、動的負荷については確認が難しいことが分かると思います。
というのも動的負荷については実際にテスト時に警告以上の状態にならないとレポートが出力されず、負荷がかかっていない状態ではその実体を把握できないからです。
下の画像は負荷テストを実行した結果なのですが、負荷がかかっていないとこのように何も表示されず動的負荷の詳細について確認できません。

動的負荷は負荷がかからないと詳細を確認できない
でも実際にテストして警告以上の状態になっていないなら問題ないのでは?
そんなことはありません。
例えば星々の幻境ではマルチプレイのシミュレーション機能はなく、マルチプレイのテストを行うには実際のプレイヤーを招待する必要があります。
最大8人プレイの幻境を作る際に、毎回テストで自分以外に7人を招待しながら開発できるクリエイターがどれほどいるでしょうか・・・。
つまり1人でテストプレイをしている際に警告状態に達していなくても、8人でプレイしたら警告もしくはエラーになることは十分ありえるということです。
そのため仮に開発中に動的負荷が警告以上の状態になっていなくても、残りどの程度の余裕があるのかは常に把握しながら開発を進めるべきです。
![]()
動的負荷を確認するための方法ですが、やり方は簡単でステージに意図的に負荷がかかるようにするだけです。
方法は何でも構わないのですが、私のお勧めは「魔偶剣鬼」を配置することです。
魔偶剣鬼の計算負荷は約50ほどなので、数体密集して配置させれば簡単にそのエリアの負荷を上げることができます。

重いオブジェクトを配置することであえて負荷がかかるようにする
この状態でテストプレイをし意図的に警告もしくはエラーを発生させることで、動的負荷のレポートを出力できます。

レポートを出力することで各要素の詳細について確認が可能になる

負荷の高い動的要素とゲーム特性による見積もり
動的負荷のレポートを出力することで静的負荷計算ツールでは見れなかった要素がいくつか確認できるようになりました。
クリエイターの方は、実際のプレイ時にはこれらの負荷が追加でかかることを想定しながらマップ作成にどこまでリソースを割けるかを考えると良いでしょう。
![]()
まずは代表的な重い動的要素について記載します。
![]()
キャラクター:
キャラクターは静的負荷計算ツールでは確認できない重いオブジェクトの代表格です。
キャラクターは一人あたり約40の計算負荷となります。
つまり最大8人プレイの幻境の場合40 x 8で320の計算負荷となります。
負荷要求「低」の幻境の場合上限が1000ですから、8人プレイを想定すると1/3ほどがキャラクターの処理だけで持っていかれるというのはなかなか衝撃的ですね。
![]()
環境設定:
環境設定もかなり負荷がかかる要素の一つです。
こちらについてはまた後述しますが、時間帯によって差はありつつも最大で130くらいの負荷がかかると思ってください。
![]()
ゲームの特性によって様々ですが、ノードグラフから動的に作成されるものについてある程度予想がつくなら、それらについても追加の負荷として考慮に入れておくべきでしょう。
例として私の「あの頃の風の行方」では次のような見積もりを行っています。
![]()
風の行方ではレンジャーはオブジェクトに偽装したりおとりのオブジェクトを生成できます。
ゲーム内で最も重い偽装もしくはおとりのオブジェクトが、ここではレポートの結果から10の計算負荷だったとします。
レンジャーは一人あたり3つのおとりを生成できるため、自身の偽装と合わせて一人あたり4つのオブジェクトを同時に存在させられます。
最大の8人プレイ時にはレンジャーは7人となりますから、以上のことからプレイ時に発生する可能性のある偽装およびおとりのオブジェクトに関する計算負荷は(10 x 4) x 7で最大280となります。
![]()
つまり私の「あの頃の風の行方」では8人プレイを前提とするなら、1000 - (320 + 130 + 280)で270しかマップ作成に割けないということになります。
実際にはここで考慮されていないエフェクトの表示などもありますから、もっと少なくなるはずです。
しかし風の行方はかくれんぼが遊び方のベースとしてあるので、キャラクター8人が一箇所に集まることは非常に稀です(それこそ最初のロード時くらい)。
キャラクターが一箇所に集まらなければキャラクターの計算負荷は下がるのでそういったことも考えるともう少し余裕があったりもしますが、どんな状況でも安定してプレイできる幻境を目指すならこのように最大の負荷がかかるパターンを想定しつつマップ作成を進めていく必要がありますね。
![]()

クライアントの計算負荷を下げるための方法
それでは負荷計算ツールで確認できる静的負荷や動的負荷の値を下げるための方法を紹介します。
![]()
エンティティの数を減らす
これはもう当たり前のことですが、エンティティの数が少なければ当然負荷は少なくなります。
クライアントの計算負荷を下げる必要が出たら、まずは不要なエンティティを削除できないか検討してみましょう。
![]()
最優先で確認すべきは見えない位置に存在するエンティティです。
複雑なマップを作成している際、エンティティを重ね置きすることが多々あると思います。
このときエンティティが他のエンティティに完全に埋もれてしまいあってもなくても関係ない状態になっていたら、そのエンティティは真っ先に削除すべきです。
![]()
例えばスメールステージではこのように岩のモデルを複数重ねることでベースの地形を作っていますが、重ねる途中でエンティティが完全に埋もれて存在意義を失っていたものが実際に複数ありました・・・。

岩に完全に埋もれている不要なエンティティは削除すべき
エンティティを一箇所に密集させない
ドキュメントにもあるように負荷はエリアごとに計算されます。
なのでステージ内でエンティティが一箇所に密集しないように意識するとよいでしょう。
とはいえこれは美観との兼ね合いもありますし、どうしても沢山のエンティティを一箇所に置きたいという場合もあるので難しいですよね。
![]()
ちなみに私は稲妻ステージで地面に石畳を敷いています。
石畳は隙間なく敷き詰めたかったので、この場合大量のエンティティを密集させながら配置する必要が出てきます。
![]()
ここで負荷対策として何をしたかというと、エンティティのサイズを2倍にして配置が必要な面積をカバーしました。
普通なら石畳のエンティティが4つ必要だったところ、エンティティのサイズを2倍にすることで1つで足りるようにしました。
これによりエリアあたりのエンティティ数も、エンティティの全体数も減らすことができました。

エンティティのサイズを2倍にすることで数を抑えつつ面積をカバーしている
なおエンティティは拡大すると基本的にモデルのテクスチャがぼやけてしまい美観が著しく損なわれるため、そこについてはトレードオフというかやり過ぎ厳禁だと思っています。
基本的にというのはモデルの種類によっては拡大してもテクスチャがぼやけないものもあるためです。
そのようなモデルを探して採用するというのも大事かもしれませんね。
![]()
負荷の低いモデルを使用する
同じようなモデルでも物によっては負荷のサイズが大きく異なるものが存在します。
マップ内で大量に配置しなければならないエンティティがあるなら最も負荷の少ないモデルを選定すべきでしょう。
![]()
例えば現在作成中の図書館ステージでは壁を大量に配置する必要がありました。
具体的には10枚の壁を配置したのですが、当初は色合いや質感を元に選定した「壁」オブジェクトを使用していました。
しかしこちらの計算負荷は5.58で、単純計算でもマップ全体で55.8の負荷がかかる想定になります。
当然重すぎということで、最終的に「石製の壁パーツ」に差し替えられました。
上下の部分が邪魔ですが、地面に埋めたり他のもので隠したりしつつ上手いこと利用しています。

「壁」の計算負荷は5.58

「石製の壁パーツ」の計算負荷は1.81
他にもこちらのテーブルも8個配置予定でした。
しかし8個も置くと重いため別の軽いモデルに差し替えています。

計算負荷は4.05

計算負荷は1.89
こちらはドアの外枠です。
既存のモデルを拡大縮小したうえで組み合わせているのですが、モデルを異なる比率で拡大縮小すると模様などのテクスチャが不自然になるため、当初はなるべく模様が入っていないモデルを採用していました。
しかしこちらについても7個配置が必要だったため、少しでも軽くするため別のモデルに差し替えました。

計算負荷は11.27

計算負荷は6.67
また地形エンティティについても同様です。
地形エディタから作成された地形エンティティはかなり重く、例えばモンドステージの場合55.40の計算負荷となります。
まだこの頃は最適化の知見についてほとんどなかったので地形エディタから地形を作成していましたが、キャラクターを行動させるための地面を作成したいだけなら、床なり岩なりのエンティティを拡大したものを配置した方が確実に負荷は小さくなるでしょう。

地形エディタから作成された地形エンティティは比較的重め
ただの景観であれば動的エンティティは静的エンティティにする
マップ上に置いておくだけでよい景観オブジェクトであれば静的エンティティで十分です。
例えば宝箱など、プレイヤーが空けられる必要はなく単なる景観としてそこにあるだけなら、これは静的エンティティとして作成すべきでしょう。

実際に稲妻ステージに配置されている静的エンティティの宝箱
なお、動的エンティティ/静的エンティティの切り替えは プレハブライブラリ から行えます。
つまり動的エンティティとして提供されているモデルを静的エンティティとして利用するには、一度プレハブとして定義する必要があるということです(というのは実は嘘で、プレハブとして作成しなくても動的エンティティ/静的エンティティを切り替える方法はあるのですが、これはハック的な操作であり正規の方法かも不明なのでここで言及することは控えておきます)。
![]()
実際に動的エンティティと静的エンティティをステージに配置して負荷がどのように変わるのかを確認してみましょう。
![]()
まずは同じモデルを参照する動的エンティティと静的エンティティを作成します。
今回は比較的重い「木製の塔」を使ってみます。
計算負荷は23.93ですが、この段階では動的エンティティでも静的エンティティでも値は変わらない点に注意してください。

動的エンティティの「木製の塔」の計算負荷は23.93

静的エンティティの「木製の塔」の計算負荷も23.93
次にそれぞれのエンティティを配置します(動的負荷のレポートを確認するために魔偶剣鬼も配置します)。
エンティティはプレイヤーからの距離によって負荷が変わるため、プレイヤーから見て同じ距離になるように配置します。
この段階で静的負荷計算ツール上ではそれぞれのエンティティに差が出るようになり、動的エンティティの方は2.39、静的エンティティの方は0.12となります。

同じモデル、同じ距離でも、動的/静的によって配置時の負荷が変わる
最後にこの状態でテストプレイを行い動的負荷がどうなるのか確認します。
静的負荷計算ツール上の値とも異なりますが、動的エンティティの方は7.18、静的エンティティの方は3.93となり、やはり静的エンティティの方が軽くなることが確認できます。

シーンによって変化はあるが、概ね動的エンティティよりも静的エンティティの計算負荷の方が少なくなる
各所で表示される値がバラバラで何を信じたら・・・という話ですが、初めに述べたようにクリエイターが最終的に気にする必要があるのは動的負荷の値です。
これが負荷要求レベル「低」の場合、上限の1000を超えないように様々な調整を行う必要があります。
![]()
ステージの時間帯を環境設定の負荷が低くなる時間帯に固定する
先に述べた通り環境設定も比較的重いので、この負荷を軽減できれば軽減した分の負荷をマップ作成に当てることができます。
環境設定は時間帯によって負荷が変わります。
以下にステージを作成した際にデフォルトで用意されている環境設定の時間ポイントを変えた際の計算負荷を示します。

ステージ作成時にデフォルトで作成されている環境設定
- 00:00:52.21
- 01:00:54.13
- 02:00:57.17
- 03:00:59.70
- 04:00:71.74
- 05:00:92.46
- 06:00:117.85
- 07:00:127.94
- 08:00:131.33
- 09:00:131.38
- 10:00:129.37
- 11:00:126.88
- 12:00:121.33
- 13:00:112.89
- 14:00:104.92
- 15:00:98.32
- 16:00:93.00
- 17:00:89.49
- 18:00:86.94
- 19:00:85.38
- 20:00:85.66
- 21:00:85.68
- 22:00:85.78
- 23:00:85.76
これらの内容から夜(0時)に固定するのが最適ということになりますが、当然夜にしたら真っ暗になってしまうためそこは幻境の内容と相談し昼間にする必要があるなら明るい時間帯の中で最も負荷の小さくなるタイミングで固定するなどの妥協は必要になります。
昼間で固定するなら15時から16時辺りがお勧めです。
![]()
ちなみに環境設定には環境要素として「スター」や「銀河」、「雲」などがありますが、計算負荷はこれらの要素の有無とは無関係です。
なので夜に星をキラキラさせたら重いとかそういったことはありません。
実際にスター・銀河・雲の有効/無効を切り替えて動的負荷を見てみた際の結果です。
このように設定の有無に関わらず0時に設定すれば、計算負荷は同様に52.21となっていることが分かると思います。

スター・銀河・雲が無効の状態の計算負荷は52.21

スター・銀河・雲が有効の状態の計算負荷も52.21
なお環境設定はプレイヤーに適用しないこともでき、その場合また別のデフォルト設定が適用されるのですが、この状態での環境設定の計算負荷は88.34になります。
しかしこの環境設定は謎に霧がかかったような表示になるため個人的にはお勧めできません。
そういったことが気にならないという方はこの方法も一つの手段としてありだと思います。

効果発動対象を「なし」にすることで環境設定の適用を回避可能

環境設定を適用しなかった場合、霧がかかったような表示になってしまうが計算負荷は88.34まで下がる

比較として環境設定を適用した状態(10:00)ではこのような表示になり、計算負荷は129.37となる
ちなみに「あの頃の風の行方」ではゲームの特性上時間帯の固定はしたくなく、このテクニックについては現在実装されているステージには取り入れていません(上方に潜んでいるレンジャーの居場所が影の位置でバレるようにしたく、影の位置に変化を出すために時間帯の変化を取り入れています)。
しかし現在作成中の図書館ステージでは屋内ということもあり太陽の移動に伴う影の変化がないですから、この時間帯固定のテクニックを使用し、負荷のかかる時間帯でのプレイが発生しないよう検討中です。
![]()
ステージのプレイ可能人数を減らす
これは最終手段ですし、これをやるくらいなら端末の負荷要求を上げても良いと思いますが、一応手段の一つとして記載しておきます。
先に述べた通りキャラクターの計算負荷は一人あたり約40なので人数を減らしていくとそれだけ負荷に余裕が生まれ、軽減された分をマップ作成に割くことが可能になります。

PvP用の幻境でも無理に8人マルチに対応する必要はないかもしれない

以上です。
余談ですが前回の記事でも紹介したように、現在 「あの頃の風の行方!」 の第4ステージの作成中です。
こんな感じにあれこれ考えながら調整を繰り返しているため時間がかかっています。
リリースまでもうしばらくお待ちいただけたら幸いです。
![]()

