YUTT UP!

Unity大好きエンジニアなブログ

【Unity】Unite2018 Day2 レポート

2018/05/08(火) Unite 2日目行ってきました。 f:id:yutt1:20180512230835j:plain

1日目のレポートはこちら yutt1.hatenablog.com

2日目からは、ホールに分かれてセッションが行われます。 朝から注目のセッションばかりでとても楽しかったです^^

ちなみに、2日目の個人的ベストセッションは【Unite Tokyo 2018】誘導ミサイル完全マスターでした!

聞いた講演を中心に勉強になったものを書いていこうかと。

ComputeShaderを駆使した1000発が飛び交う弾幕の実装「誘導ミサイル完全マスター」

www.slideshare.net

最初は、誘導ミサイルの実装をシェーダーで実装することで、高負荷な表現を行うといったAdvancedセッションです。

誘導ミサイルの計算をGPUで処理させ、演出の描画などをCPUで担う場合、どのようにしてUnityで実装するかを非常にわかりやく解説されました。

また、UnityのPhysics機能を使わず、物理学に則った説明であるため、誘導ミサイルだけでなく、物理実装全般に役立つような実践的な内容でした。

ミサイルの実装の基本

誘導ミサイル程度であれば、応用(ゆらぎや着弾時刻ずらし等)がきくため、実装にはPhysicsやLerpは使用しない方がよいとのことでした。

運動方程式に則り、シンプルに実装ができます。

追尾レーザー f:id:yutt1:20180512235231j:plain 誘導ミサイル f:id:yutt1:20180512235318j:plain

ハードウェアのための最適化実装

昔々のハードウェアでは厳しい制約があり、それを工夫により乗り越えていました。

制約 工夫
整数しか使えない 4096を1.0として扱う (固定小数点方式)
割り算が重い 掛け算の度に4096で割る (12bitシフトは高速)

それを今回の実装にも適用することで最適化をはかるというものです。

制約 ミサイル実装での工夫
整数しか使えない ⊿t(Time.deltaTime)を1として扱う
割り算が重い 2のべき乗時刻のみ速度を計算しなおす(割り算をシフト演算で行う)

ComputeShaderへの応用

ここまでC#で実装していた内容をComputeShaderで実装することでGPUで計算させ、高速化を行いました。

しかし、GPUで実装する際にはいくつか考えなければならない問題があり、一つ一つ解説されました。

  • 目標物の位置情報が必要
  • ミサイルは1つずつ発射されが、GPUは常に並列で計算する
  • 描画処理はCPUで行う
  • 目標物を失った際の処理
  • 目標物に当たった際のCPUへの通知

他にもいくつか最適化実装を行っており勉強になりました。 Githubでサンプルプロジェクトも公開されてるので要確認です。 github.com

ミリシタで13人ライブを可能にした最適化「なんとっ!ユナイト!ミリシタをささえる『AKANE大作戦』とは?」

www.slideshare.net

セッションでは、開発のスケジュールや歌い分けの実装などミリシタの裏側が軽く紹介された後に、ミリシタで行った最適化について説明されました。

ミリシタの最適化では、クオリティを下げないことをポリシーに、なるべくエンジニアで頑張るという精神で行っていったそうです。

サブメッシュ統合によるドローコール削減

基本的にDrawCallはAtals化やMaterialを共通にするこでまとめて描画されるため削減できます。しかし、SubMeshを越えてのまとめはされないという問題があります。 f:id:yutt1:20180513011624j:plain

この問題に対しDirectXOpenGLなどのネイティブな実装では、インデックスバッファーを一つにまとめ、インデックスの範囲指定で、部分 or 全体を描画するらしいです。

Unityの描画実装はブラックボックスなため実際の描画システムは分かりません。 しかし、根底はネイティブの実装と変わらないはずだということで、全 SubMesh をマージした SubMeshを追加することでSubMeshの統合を可能にしたとのこと。 f:id:yutt1:20180513012330j:plain

結果として、1体あたりドローコールは25→17に。

CommandBufferによるマテリアルLOD

描画距離によって、マテリアルの描画内容を変えることで負荷を軽減させるというもの。

これを実現するには、サブメッシュ単位のビジブル制御が必要となるのだが、CommandBufferを使用することで非常に簡単に実現できたとのこと。

どちらもネイティブ実装の知識を生かした高速化ということで、自分に足りない部分な内容で勉強になりました!

「実践的なパフォーマンス分析と最適化」

www.slideshare.net

Unityにおける最適化が網羅的に解説されました。

AnimationでのCPU最適化

個人的に興味深かったのは、UnityのアニメーションシステムはAnimation Curveの数が大きいほど最適化されるという内容でした。

内容 結果
100Animation, 12Curve Legacy 4ms
Generic 9ms
100animation, 640Curve Legacy 19ms
Generic 13ms
Humanoid 26ms

検証の結果、Animation Curve 300個以上になるとLegacyよりGenericの方が速くなるとのこと。

したがって、複雑でないAnimation(Textureのアニメーションとか)ならLegacy Animationの方がパフォーマンスが出るということでした。

他にも2018.1からAnimatorBindingが入るため、再生成時ののコストが抑えられるようになるなど、勉強になる情報が多かったです!

データドリブンな実装を!「「リトルチャンピオンズ」癖になるアクションゲームの開発事例」

www.slideshare.net

「リトルチャンピオンズ」のゲーム特性上、リプレイと途中復帰が求められるということで、実装設計やデータ設計などについて解説されました。

コマンドパターンベースなアーキテクチャ

リプレイや途中復帰などを実現するには、ユーザーが行った行動や結果を保持する必要があります。

そこで、ユーザー操作をコマンドで表現することで、リプレイや途中復帰などの際に、コマンドを流し込むことで再現させるというものでした。

f:id:yutt1:20180513015207j:plain

このアーキテクチャのよいところはロジックとデータが分離しているため、テストしやすい点にあると思いました。

また、StageEditor時にもキャラや予測線などの実装は流用できるため、インゲームに依存しない実装は勉強になりました。 if (isStageEditor)と書いてスパゲティになるのは辛いですからね(僕はやらかしました)

余談ですが、コマンドデータのセーブフォーマットが気になり質問した所、独自のバイナリでSerialize/Deserializeしてるとのことでした。JsonやMessage Packとかとの性能比較はしたわけではないが、セーブファイルの軽さを選んだとこと。

新機能UI Elements「エディター拡張マニアクス2018」

www.slideshare.net

2015年頃からの3年間で実装されたEditor拡張についてと、今後の実装予定の内容について説明されました。

内容としては、まだPreview版だけどすごく楽しみな機能が多く、その中でもUI Elementsは非常に興味深かったです。

UI Elements

現状のUnityEditorのUI構成はIMGUIというものであり、OnGUIに直感的に書いていくものです。そのためUIが複雑になるほど、コードの記述も大変になります。

現在のUnityでは出来ることが増えたため、IMGUIでのEditor拡張はメンテナンス性や拡張性が弱いです。

そこで、新たなUIシステムとしてRMGUIであるUI Elementsを開発中とのこと。

UI Elements自体はWebのHTMLと基本構造は似ており、HTMLを書くように構成できるとのこと。 f:id:yutt1:20180513020701j:plain

個人的に、描画、構成、処理とファイルを分割出来るのは拡張性、メンテナンス性が上がるため非常に良いと思いました。

楽しみなUI Elementsだが、ユーザーが使えるのは2019.xの予定とのこと!

他の要確認セッション

『崩壊3rd』開発者が語るアニメ風レンダリングの極意の極意

Day2感想

最適化系のセッション中心に回ったが、2017.xからの機能周りで出来ることが増えたというのが分かり良かったです。

グラフィック関連やVR関連のセッションが多く、そちらはあまりチェックしていないので、個人的にはもう少し発見があると嬉しかったです。

配信アーカイブ

https://www.twitch.tv/videos/258911177

・『崩壊3rd』開発者が語るアニメ風レンダリングの極意

・ユニティちゃんトゥーンシェーダー2.0使いこなしスペシャル ~こだわりの活用法を紹介します!~

・実践的なパフォーマンス分析と最適化

・パーティクル・マニアクス

・その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~

・アーティストがUnityでサクッといいビジュアルを作るテクニック講座

・Unity for ディープ・ラーニング:ツールキット『ML-Agents』のご紹介