18.7K Views
October 28, 19
スライド概要
発表者: 野津翔太郎さま(株式会社ユークス)
本スライドは2019年9月20日に行われた勉強会「 UE4を用いたTPS制作事例 〜Earth Defense Force: Iron Rainの場合〜」の講演資料となります。ユークス様、このような貴重な情報を一般に公開していただきまことにありがとうございます!
※講演資料内にGif動画などが埋め込まれてる可能性がございます。以下のリンクからオリジナルのスライドをご参照していただくことをおすすめいたします。
https://epicgames.box.com/s/p7voa4v3i8aw6yl4wii7wi005pxwt99s
ダウンロードのためのパスワードは ""EDFIREpic""です。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
UE4を用いたTPS制作事例 EDF:IR レベル構成について 株式会社ユークス テクニカルディレクター 野津 翔太郎 ©2019 YUKE'S ©2019 D3 PUBLISHER
はじめに ・4.19.2がリリースバージョンです ・本日お話する内容が、先日リリースされた4.23でも同じ動作をするかは 保証できませんのでご了承ください ・参考情報程度ですが、開発期間中に4.20.2までは動作確認しました ・原則としてエンジンは改造していません。必要最低限のバグ修正やCLの 取り込み、一部エディタの機能調整のみ施しました ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ・本タイトルは大きく「メインメニュー」「インゲーム」の2つに分かれます ・また、インゲームはミッション形式となっており、メインメニューにて選択した ミッションをインゲームで遊び、クリアなり死亡なりした際にまたメインメ ニューに戻る、という構成でゲームが進行します ・ミッションは非連続で、必ずメインメニューを挟みます ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ゲームフロー ・メインメニュー ・出撃ローディングスクリーン 出撃 ミッションやギア、武器等を選択 ゲームに必要なものを全て読む ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ゲームフロー ・インゲーム ・帰還ローディングスクリーン クリア 死亡 選択されたミッションでプレイ メニューに必要なものを全て読む ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ・メインとなるパーシスタントレベルは2種類 ・メインメニュー :帰還ローディング ⇒ メインメニュー ・ミッション :出撃ローディング ⇒ インゲーム ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ・EDF:IRでは54ミッションを作成した ・全てのミッションでユニークなエンバイロンメントを実装することは現実的で はなかったので、 ベースとなるロケーションおよびロケーション毎のライティン グの組み合わせ、マイナーな地形変更でバリエーションを出すように ・市街地エリア、砂漠都市、荒野、住宅街エリア、高層ビルエリア、海岸、 森林、砂漠、基地、地下道、戦艦、火山の12ロケーション ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ロケーションとライティングの組み合わせ ・市街地エリア+ 昼 ・市街地エリア+ 夜 ・市街地エリア+ 降雪昼 ・高層ビルエリア+ 昼 ・高層ビルエリア+ 夕暮れ ・森林 + 朝 etc… ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ミッションごとに組み合わせを設定 ・ミッション1:市街地エリア+ 昼 ・ミッション2:高層ビルエリア + 昼 ・ミッション3:森林 + 夜 ・ミッション4:市街地エリア+ 降雪昼 ・ミッション5:市街地エリア+ 昼 ・ミッション6:高層ビルエリア+ 夕暮れ etc… ©2019 YUKE'S ©2019 D3 PUBLISHER
↑昼 夕暮れ↑ ←夜 ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ロケーション単位の制作 ・ロケーション毎に必要なアセットをすべて含む パーシスタントレベルを用意し、アーティストや レベルデザイナーにはそちらで作業をして貰う ・サブレベル数やサブレベル名に制限はなく、 建物やプロップ、プレイエリアかどうかなどで 適宜自由に分割していた ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ロケーション単位の制作 ・ここでは3D空間上の場所が重複しても良いので、表示のオンオフを切り 替えてとにかく全て配置している ©2019 YUKE'S ©2019 D3 PUBLISHER
バリエーションサンプル1 ©2019 YUKE'S ©2019 D3 PUBLISHER
バリエーションサンプル2 ©2019 YUKE'S ©2019 D3 PUBLISHER
バリエーションサンプル1&2 同時表示 ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ロケーション単位の制作 ・地面や建物やプロップはもちろんのこと、サウンドの高さ補正をかけるため のポイントや、マップ作成用のエリア指定ボリュームなど、ミッションではなくロ ケーションを基準にして設定すべきものはここで配置する ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ロケーション単位の制作 ・ライティングを設定するサブレベルは、実際はライト以外のアクターも含む ・ライト、フォグ、天球、ポストプロセスボリュームが基本構成 ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ロケーション単位の制作 ・追加で、朝もやのようなVFXを配置したり、街灯のような夜にのみ必要な ライトを置いたりする ・ライトは全てMovableとなり ライトマップは使用しないので ライトシナリオ設定はなし ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ミッションごとの制作 ・ミッションごとにパーシスタントレベルを用意 ・ロケーション用に配置したサブレベルのうち、 そのミッションに必要なサブレベルのみ登録する ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ミッションごとの制作 ・ここではロケーション用サブレベルに配置したアクターは触らない ・エネミーのジェネレータやイベントボリューム等のミッション独自のアクターを ミッション用サブレベルを作成し配置する ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ミッションごとの制作 ・パーシスタントレベルには、原則アクター配置禁止 ・OpenLevel時にヒッチするのを回避するため ・しかし、サブレベルにはNavMeshを置けないため、NavMesh関連のア クターのみパーシスタントレベルに配置 ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ロード方法 ・ロードすべきサブレベルは、別途用意しているミッションパラメータに設定さ れている ・ミッション開始前に、パラメータから取得したサブレベルのリストをもって Load Stream Levelにてレベルロードを行う ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ■ロード方法 ・サブレベルをパーシスタントレベルに設定し、更にその名前を別途リストで 持つのは冗長ではあるが、パーシスタントレベルにぶら下がっているサブレベ ルはパーシスタントレベルをロードするまでわからないため仕方がない ・こちらはどんぶつさんのQiitaの記事の内容で解決するかも? https://qiita.com/donbutsu17/items/e129d638285d4b77df30 ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ・レベルのロード処理はブループリントで行っている ・ゲームモードでは行っておらず、別途ゲームマネージャというブループリント を作成し、そこで行う ・ゲームモードにやらせているのは、ミッション開始時にゲームマネージャをス ポーンするだけ ©2019 YUKE'S ©2019 D3 PUBLISHER
EDF:IRのレベル構成について ・ゲームマネージャではロード処理とフェード、字幕、シネスコ、ムービー等、 全体で使用するウィジェットの管理を行う ・HUDやポーズメニューなどプレイヤーごとに必要なウィジェットはプレイ ヤーごとに個別に持たせる ・ゲームマネージャもほぼ何もしておらず、ロードが終わった後は、ウィジェッ トへの操作を受け付けるのみ ©2019 YUKE'S ©2019 D3 PUBLISHER
Loading Tips ©2019 YUKE'S ©2019 D3 PUBLISHER
Loading Tips ・ゲームがまともに動き出した当時(TGS2017出展時点)、インゲームへ移 行する際の出撃ローディング時間はなんと84秒にも(ほんとごめんなさい) ・ユーザビリティの低下もさることながら、コンソールのレギュレーションにも抵 触しているのでいろいろな意味でまずい ・当然高速化対象になったので、その際に施した対策をご紹介 ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■重いアセットのシェイプアップ ・まずはシンプルに重いアセットの削減対応 ・loadtimes.dumpreport コマンドを実行することで、ロード時間にイ ンパクトがあるアセットが一撃で判明する ・このコマンドは、 loadtimes.reset コマンドが実行された時点を基準に、 そこから新たにロードされたファイルのロード時間を降順でリストアップしてく れるコマンド ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■重いデータのシェイプアップ ・最重アセットはおそらくレベル、次点でウィジェットやテクスチャがくるはず ・テクスチャは、No Streamになっているものをいかに減らすかがポイント ・UIやVFXのテクスチャはNo StreamをOffにし辛いので、アーティストと 相談して圧縮形式を変更したり解像度をダウンさせたりする ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■重いデータのシェイプアップ ・レベルは配置物を減らす必要があり、ハードルが高い ・ケーススタディとして、昔からバージョンをまたいで使っているようなレベルに ついてはゴミが残りやすいようで、配置されているアクターをコピーし新規で 作成したレベルに配置しなおすだけでロード時間が数秒減ったこともあった ・原因不明な重さがある場合は是非試して頂ければ ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事前ロード ・馬鹿正直にロードをするとどうしても時間がかかるため、メインメニューにい る時点でロードを開始したい ・本作の場合、読むべきアセットはこの 画面の時点ですべて判明している ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事前ロード ・ミッションに必要なサブレベルのロードに一番時間がかかる → サブレベルを事前に裏でロード! ・ミッションを決定したらすぐさま裏で ロードを開始する機構を実装 ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事前ロード ・事前ロードを利用するには、Asset ManagerでPrimary Assetを 登録する必要がある ・プロジェクト設定から設定可能 ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事前ロード ・指定ディレクトリ以下のアセットに 設定した属性を付与してくれる ・画像のMapタイプはデフォルトで 存在しているもので、レベルを事前 ロードしたい場合はこの設定を そのまま流用可能 ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事前ロード ・ロード/アンロードはブループリントで ・Async Load Primary Assetで任意の タイミングで非同期ロードを開始 ・要らなくなったらUnload Primary Assetでアンロード ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事前ロード注意点 ・事前ロードということで、ミッション確定後に十分な時間メインメニューに滞 在することが条件にはなるが、最大時にはレベルをロードする時間がまるま るカットされることになるのでかなり影響が大きい ・事前にロードするということでメモリを圧迫する点には注意 ・本作では、事前ロードするレベルをミッションごとに細かく設定した ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ・Asset Managerやそれにまつわるアセットの管理については、 EGJ岡田様の二大名著 ■UE4のモバイル開発におけるコンテンツアップデートの話 - Chunk IDとの激闘編 https://www.slideshare.net/EpicGamesJapan/ue4-chunk-id ■徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意! https://www.slideshare.net/EpicGamesJapan/ue4-95204920 にて、とても詳しく解説されているので、必読! ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ※ 後日追記 8/15にEGJ岡田様のブログが更新されていたらしく、Asset Manager についての更に詳しい解説がされていますので追記しておきます。 ■Asset Managerのアセットの非同期ロード機能について その1 ( 非同期ロードの解 説 & レベルの裏読み編 ) https://qiita.com/EGJ-Kaz_Okada/items/f18bca3fb5c8fc1aea9c 「その1」ということなので、「その2」の公開も非常に楽しみですね! ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・事前ロードとは反対に、ローディングスクリーンが終わりインゲームが開始 してからロードを行う事後ロードも検討 ・とは言え、ゲームは始まっているので事後ロードが許容されるアセットはも のすごく限られている ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・複数あるサブレベルのうち、遠くのものは事後ロードする対応を検討 ・試してみたものの、ヒッチがひどくユーザビリティの低下が懸念された ・これはUnreal Fest East 2017にてスクウェア・エニックス様のセッショ ンでも言及されていたことで、ヒッチの改善にはエンジン改造が必要そうだっ たので、コストの観点から採用を見送った ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・事後ロード対象アセットの判断基準としては、ロードが遅れたとしても 「ゲームプレイに影響せず」「ユーザビリティにも影響しない」もの ・演出にのみ使われるアセットを候補に → Destructible Mesh!! ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・本作ではDestructible Mesh(以降、DM)を使用して建物の破壊表 現をしていたが、完全に演出用の表現でゲームの本質に関係ない部分 ・もともと建物は「詳細破壊」「簡易破壊」という機能を持っており、DMが使 われるのは前者のみのため、DMの事後ロードが終わる前に建物が破壊さ れた場合は簡易破壊を実行させることであまりコストをかけずつじつまを合 わせる対応を施すことが出来そう ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・もともとDMはハードリファレンスでブループリントに設定していたが、これを ソフトリファレンスに変更 ・ソフトリファレンスにすることで、参照はされているがロードは行われなくなる という状態を作れる ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・ハードでもソフトでも設定のインターフェースは変わらないため、入力ルー ルを追加することなく運用も可能 ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・全てのサブレベルのロードが完了し、出撃ローディングスクリーンが終了す る直前に、全てのアクターから建物のアクターのみリストアップ ・建物のアクターからDMのソフトリファレンスを取得し、リストしておく ・そして、出撃ローディングスクリーン終了と共に、ゲームマネージャにて DMのロードを開始する ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・問題に遭遇 ・ミッション開始後にストリーミング再生されるストーリ用ボイスとDMの ロードがバッティングし、DMのロードが終わるまでボイスの再生がされない 不具合が発生した ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・ロードするDMのソフトリファレンスはリストを使って1度だけロードリクエス トをかける形にしていた ・そのせいでロードが割り込めず、後から要求があったボイスが必ず待たさ れることとなっていた ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード Loading Time Line ここでリクエストしても ここまで待たされる ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・ロードリクエストを、リストではなく1つずつ発行する処理に変更 ・更にロード完了後すぐに次のリクエストを発行せず、1秒のギャップを入れ ることでストリーミングリクエストが消化される余裕を持たせた ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード Loading Time Line ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■事後ロード ・結果、DMロード分の体感時間はまるまるカットできた ・都合が良いことに、 DMはアセットサイズが大きくなりがちでロード時間も 比較的長めのアセットだったため、体感ロード時間の短縮に大きく寄与した ・どのアセットを事後ロードに持ってこれるかはゲームの内容次第になるので、 まずはプロジェクトのアセットをカテゴライズし、事後ロードにまわせるものが あるか検討して頂ければ ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■FileOpenOrder ・Unreal Pakを使用している場合、デフォルトだとエンジン任せになってい るファイルの順番を、下記のパスにてオーダーファイルを別途指定することで 任意に指定することが出来る ・ProjectRoot/Build/*Platform*/FileOpenOrder/ GameOpenOrder.log ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■FileOpenOrder ・内容はただのテキストであり、ひたすら アセットのパスが書かれているだけ ・これを使うことにより、Unreal Pakの 内容が整列され、ファイルアクセスが 高速になる可能性がある ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■FileOpenOrder Asset2 Asset3 Asset4 Good Case Asset1 Asset2 Asset3 Asset4 Unreal Pak File Order Asset1 Unreal Pak File Order Bad Case ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■FileOpenOrder ・手書きでも動作はするが、何万もあるアセットの順番の確からしさを手動 で保証するのは無理がある ・何よりアセットは日々追加されるので、手動作業は現実的ではない ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■FileOpenOrder ・実行オプション[-fileopenlog]を指定してゲームをスタンドアローンで実 行することで「実際に読まれたファイル」を記録したログファイルが得られるの で、それをそのまま使うことで実ロード順に即した形でのリストが入手できる ・ロードをなぞるだけということでCIとの相性が良いので、自動テストなどに 組み込んで運用するのがオススメ ©2019 YUKE'S ©2019 D3 PUBLISHER
出撃ローディング ■FileOpenOrder ・本作では細かいアセットが多くあったためか、このファイルを指定することで 出撃ロード時間の短縮に大きな効果があった(約19秒短縮) ・ファイル数や元の順番次第で施策後の効果の如何が大幅に変わってくる ので、ご自身のプロジェクトでまずは試して頂ければ ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ・最初はあまり問題にならなかったメインメニューも、アセット量産フェーズに 入り徐々に長くなっていき、最終的には30秒にも ・インゲームと比較するとマシだが、ユーザーとしては納得しにくい時間 ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■オンデマンドロード ・ロードしているアセットの量が多いことはわかっていた ・メインメニューから全てのギアや武器、アイテム、クリエイトパーツなどを装 備でき、それらのメッシュがプレビューできる必要があったため ・必要な全てのアセットをハードリファレンスするデータテーブルを使っていた ため、アセットが増えるにつれロード時間が伸びていった ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■オンデマンドロード ・そこで、他と同様まずはハードリファレンスをソフトリファレンスに変更 ・更に今まではオンメモリにある前提で書かれていた処理を、必要に応じて ロードする処理に書き換えた ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■オンデマンドロード ・オンデマンドロードの導入でハードリファレンスを駆逐し、帰還ローディング 時間は30秒から19秒まで大幅に減らすことができた ・逆に残った19秒について、何がそんなにかかっているのだろうか? ©2019 YUKE'S ©2019 D3 PUBLISHER
ウィジェット!! ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■ウィジェット ・loadtimes.dumpreportでプロファイルすると、大量のウィジェットが 上位に来ていた ・いくつかのウィジェットはロード時間1秒以上をたたき出していた ・19秒のうち、なんと15秒はウィジェットのロードだった ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■ウィジェット ・多方面で言われているウィジェットのロード時間問題 ・本作でも同じ問題にぶち当たり、大変難儀した ・解決方法も「UObjectを頑張って減らす!!」という情報くらいしかなく、 根本的に減らすにはエンジン改造にまで話が及んでしまっていた ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■ウィジェット ・ウィジェットの主たる作業者であるUIアーティストにUObjectを減らして ほしいというのも、指示としては曖昧で少し無理があった ・そこで、重いアセットの共通点を探し、傾向を探ってみた ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■ウィジェット ・どうやら、ウィジェットの中にウィジェットを含むものが重い ・中でも、ウィジェットの中のウィジェットにアニメーションを含むものが重い ・必要ないアニメーション、Visibilityを切り替えるだけのあまり意味のない アニメーションなどは積極的に削除したがまだ重い ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■ウィジェット ・ウィジェット内ウィジェットは内容にかかわらず配置の数だけロードされる ↑のセット×11 ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■ウィジェット ・更にこのウィジェットにもウィジェットが含まれており… ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■ウィジェット ・問題が起きていたのは 「ある程度重い(ロード時間が長い)アニメーションを含むウィジェットを あらかじめウィジェット内の階層に数多く組み込んでいる」 というケースで、同じウィジェットアセットを大量にロードしていた ・なら、動的に追加すれば回避できるのでは? ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■ウィジェット ・そこで、実行時にウィジェットブループリントからで動的配置を行うよう処 理を変更した劇的な変化が! ・1.5秒かかっていたウィジェットのロード時間がなんと0.2秒に ・他の同様の構成のウィジェットにも徹底的に手を入れることで、19秒残っ ていたロード時間がなんと8秒まで減った ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ■ウィジェット ・注意点として、実行時に動的に追加するということは、レイアウト調整作業 がUIアーティストの手から離れるということに ・今回のケースではプロジェクト終盤だったため、既にレイアウト調整を終え たものに寄せて動的配置するだけで済んだ ・この手法を使った場合の運用については、入念にワークフローを決めてか ら着手したほうが良さそう ©2019 YUKE'S ©2019 D3 PUBLISHER
帰還ローディング ・ロード時間については下記のEGJ篠山様の資料でもまとめられているので、 是非ご覧になってみてください ■UE4におけるLoadingとGCのProfilingと最適化手法 https://www.slideshare.net/EpicGamesJapan/ue4loadinggcprofiling ©2019 YUKE'S ©2019 D3 PUBLISHER
LoadingTips まとめ ・最初は最大で84+30秒もあったロード時間が、32+8秒まで縮まった ・劇的な改善はできたものの、まだまだ快適とは言えない状況 ・ただ、思ったよりはやれることが多かった ・ソフトリファレンスは積極的に使っていきたい ・ロード時間短縮手法についてはまだあまり情報が多いとは言えないので、 今後もいろいろ色々試していきたい ©2019 YUKE'S ©2019 D3 PUBLISHER
ご清聴ありがとうございました! ©2019 YUKE'S ©2019 D3 PUBLISHER