Tipsオフィシャル記事DEVELOPERローエンドのモバイル端末で大容量ゲームを動かすヒントDEVELOPER詳細ローエンドのモバイル端末で大容量ゲームを動かすヒント<このページで学べる内容>ローエンドのハードウェアで大容量のモバイルゲームを動作させる方法について、有用なテクニックをご紹介いたします。クライアントアーキテクトを務めている人物です(アセットストアのパブリッシャーでもあります)。War』の開発に使用されました。デバイスでもスムーズに動作させるという大胆な目標を掲げました。以内に抑えなければなりませんでした。氏のチームがそれをどうやって実現したのかをご覧ください。Dead』の世界で繰り広げられる、激しいマルチプレイヤーオンラインストラテジーゲームです。舞台とした巨大かつ詳細なフリースクロール型の世界は、何千体もの「ウォーカー」(ゾンビ)で溢れかえっていて、一触即発の状況です。つの区域がレンダリングされています。ゲーム内のマップは、手動配置コンテンツとプロシージャルコンテンツを組み合わせて作成されています。非常に簡単な仕組みの説明:手動配置コンテンツとプロシージャルシステムがマップコンパイラーでコンパイルされます。各ブロックについて、システムがプロシージャルコンテンツを生成してから、手動配置データのブール値を生成します。システム用のナビゲーション情報をコンパイルします。最終結果はプレハブストリーム形式で保存されます。これはスタジオ独自のプレハブシステムです。最後に、全データがアセットバンドルを使用してプレイヤーにストリーミングされます。カスタムプレハブソリューション(「ストリーム」)は、設計時と実行時の両方で使用されており、ネスティングをサポートしています。配列を格納し、構築と配信に使用されます。編集時にプレハブストリームで追加コードを使用することで、ランダム化などのアクションが可能になります。特定のブロックについて、プレハブストリームは複数の要素をランダム化し、微妙なバリエーションを生み出すことができます。家や乗物などのアイテムは、同じアイテムでもバリエーションが生まれるように、ミックスやマッチングが可能な小さなブロックから作成しています。つの詳細レベルに分けられます。一部のオブジェクトをローエンドデバイスで非表示にできるように、オブジェクトは高、中、低の各レイヤーに割り当てることが可能です。コンパイルがすべて完了すると、レイヤーはフラット化されるため、利用者への配信時には階層はなくなっています。実行時に、プレハブストリームはグラフィックエンジンの下位レベルの描画リストと同様の働きをします(どのメッシュをどのマテリアルで描画するかを示します)。位置、つまり、特定のプレハブをどこに配置するかを指定する位置のリストを使用します。つ)にパックすることが可能です。その結果、利用者にストリーミングされるシーンデータのサイズが大幅に削減されます。War』のキャラクターは、間近で表示されることはありません。ピクセルしかなく、アニメーションセットも限られています。ローエンドのデバイスでドローコールがうまく機能しなかったため、キャラクターをバッチ処理する必要がありました。通常の手順ならば、キャラクターにテクスチャを適用し、頂点シェーダーでサンプリングして、すべてのアニメーションをシェーダーで処理します。頂点シェーダーでのサンプリングをサポートしていないため、別の解決策が必要でした。そこで、開発チームではアニメーションをメッシュフリップブックに変換しました。メッシュとなるよう、すべてのフレームを固有のメッシュとしてベイクしました。各キャラクターのメッシュをスワップしてアニメーション化しました。この方法を使用すると、多くのメモリが必要になります。4)密度の高いナビゲーションシステムナビゲーションデータはマップコンパイラーで計算されます。レイキャスティングを使用し、キャラクターの移動可能範囲内のオープンスペースの位置を把握します。マップコンパイラーでは、キャラクターがその下を歩けるように、高架橋などのオブジェクトも考慮されます。ビットのデータとなります。データに収めています。使用、仮想関数、オブジェクト指向のオーバーヘッドを避けることが大事です。関数はインライン化し、余分なものを取り除くことをお勧めします。パーティクルシステムなどのコードを作成するときと同様です。パーティクルシステムでは、パーティクルの配列を素早く送信し、すべてを一度にアップデートします。ゾンビなど、何千ものオブジェクトを使用する場合、通常はこのようにしてコードを作成すべきです。一定の順序でメモリに素早くアクセスしてデータを処理することを得意としています。そのため、データを適切に配置した巨大なブロックを用意し、それらすべてに対して同じルーチンを実行することが重要です。これはシェーダーの処理と似ています。シェーダーはピクセルをブロック単位で処理します。処理時間を短くすることができます。ビットのデータグリッドに対するレイキャスティングを、ほぼ何の制約もなく実行しています。データがすべてキャッシュに格納されているためです。つのプロセッサーで実行しても同じです。可能な限りデータ構造がコンパクト化されていないならば、複数のプロセッサーに非効率的な構造をただコピーしているにすぎません。いった場合は、償却解析を検討してみてください。多くの場合、スレッド化よりも簡単です。コードをスレッド化する必要がある場合は、コードを効率化して償却を可能にしてからスレッド化するほうがはるかに容易です。色空間を使用しました。圧縮形式のこの色空間は、高解像度の輝度値と低解像度の彩度(CbCR)値を提供します。つの汎用テレインタイプを用意しました。茶色にした場合は土のように見え、緑色にした場合は草のように見えます。頂点カラーチャンネル(RGBA)を使用してスプラット加重マスクを追加しました。輝度チャンネルをハイトマップと高さベースのブレンドに使用することで、美しい遷移を作成しました。最後に、低解像度の彩度レイヤーを輝度ハイトマップに適用し、見栄えの良いテレインを実現しました。水メッシュは、テレインメッシュの複製です。深度マップを使用する必要はありませんでした。その代わりに、頂点を水の高さに移動させることで(vertexHeight=waterHeight)、「ただで」デプスバッファを用意しました。最終的に生じる差が深さになります。この方法によって容量が大幅に節約されました。つのテクスチャサンプルです。レンダリングは、モバイルでは負荷が大きすぎるため、開発チームでは、球状ライティング近似法(SLA)という方法を使用しました。ライティング環境をレンダリングし、拡散とスペキュラライティングの効果を実現しました。