【Unity】Unite2018 Day3 レポート
2018/05/09(水) Unite 3日目行ってきました。
1日目と2日目のレポートはこちら yutt1.hatenablog.com yutt1.hatenablog.com
3日目はあまり下調べしてなかったので、勉強になりそうだと思ったセッション中心に聞いて回りました。
後でTL見たら、どうやらTimeline系のセッションがとてもよかったらしく時間のあるときに確認しようかと思います。
聞いた講演を中心に勉強になったものを書いていきます。
- 「さては非同期だなオメー!async/await完全に理解しよう」
- 「60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計」
- 「そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説」
- 他の要確認セッション
- Day3感想
- 配信アーカイブ
「さては非同期だなオメー!async/await完全に理解しよう」
www.slideshare.net
Unity2017から.NET4.Xが使えるようになり、C#6.0に対応しました。
そこで非同期構文が簡単に書けるasync/await構文についてのセッションです。
私もasync/awaitはTypeScriptで勉強しようとして全く理解できなかったのですが、このセッションを聞いて完全(?)に理解しました。
async/awaitキーワード
キーワード | 説明 | コルーチンでいうと |
---|---|---|
async |
awaitを使うメソッドにつける必要があるキーワード | - |
await |
非同期(async)メソッドを呼び出し、 その完了まで実行を中断するキーワード | yield return |
Task<T> |
awaitするためのクラス。GetAwaiterを実装している | IEnumrator |
私は非同期にしたい関数にasyncつける〜とか思っていたのですが全く違いました(笑)
async/awaitは非同期の処理を待つための仕組みなんですね。
コルーチンとの対応の説明を聞いてすんなり納得しました!
コルーチンより嬉しいこと
コルーチンを使っている方はわかると思いますが、
・コルーチンでは非同期で処理した結果(返り値)を受取るのが難しい。(IEnumrator.Current
でアクセスするしかない)
・コルーチンはネストしていくと扱いが難しくなるため、実装が複雑になる。
・非同期処理内ではUnity APIを使用できない。
とあまり柔軟な書き方ができないです。
Task+awaitではそれが可能になるため嬉しいということですね!
セッションではこの他にスレッドを管理するSynchronizationContext
についての説明もされてました。
あまり深くは言及されませんでしたが、UniRxなどを使って実装する時などは、実行スレッドを意識する必要があるので確認しておくとよさそうです!
「60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計」
www.slideshare.net
スマートフォンゲーム「アカとブルー」は大量の弾幕が飛び交うSTGなのですが、それを60fpsで実現するために行った最適化実装について解説されました。
ただ、正直Unityのパフォーマンスを引き出す実装というよりかは、Unityの機能をなるべく使わないという実装のため、初心者の方はAdvancedな内容として見たほうがよいです。
最適化の基本
最適化 | 理由 |
---|---|
起動元の一つ以外でStart() やUpdate() を実装しない。 |
UnityはStart() やUpdate() が空実装であっても呼んでしまうのでコストがかかるため。 |
Monobehavour いらないなら付けない |
Transform やGameObject の参照コストが発生するため。 |
calss < struct List <Array 多次元配列[,] < ジャグ配列[][] |
参照速度が早いため。但しList<struct> のforeach など値渡しのオーバーヘッドには注意。 |
オブジェクトプーリング | 生成コストやメモリアローケートを抑えるため。 |
コンポーネントキャッシュ | Unity2017時点では参照コストは低くなったが、まだキャッシュした方が良い。 |
定数キャッシュ | Vector3.zero などは生成コストが発生するため |
この他に、Vector3
の計算系は重いため独自実装を行ったとのことでした。
ちなみにオブジェクトプーリングの実装は非常に勉強になるので、一度確認すると良いです。 github.com
さらにそれを解説した本も出ていて、私も発売日に買って読みましたが、Githubと合わせて読むと理解が深まります。 bootlegstore.stores.jp
アーケードスタイルSTGを重視したCollision実装
Unityのコリジョン判定では、メインスレッドと同期しないため人の目に写ったものと現象と厳密には異なります。
アカとブルーではゲームデザインを重視したため、接触判定を実装したが、その要求がないなら自前実装する必要ないとのこと。
1パスでSprite描画できるP-MAPブレンド
通常、爆発系のエフェクトなどは、半透明+加算合成によって複数のテクスチャを合成して作られます。
半透明と加算はスプライトのバッチングは行われないため、複数描画した場合、その数分SetPassCallが増加します。
この問題に対して、事前乗算という手法を用いると大量に描画しても1Passで描画できるというものです。
詳しくは↓
[Unity]加算と半透明を1パスにするP-MAPブレンド実用例 - Qiita
私はこれは知らなかった手法であり、嬉しい発見でした!
他にも幾つかゴリゴリな最適化実装について解説されてます。
「そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説」
www.slideshare.net
新機能であるAddresstable AssetsとResource Managerについての解説セッションです。
今まで複雑だったAssetBundleの取扱いがとても楽になるのはもちろん、単純にリソース管理においても効率化できそうでとても楽しみです!
現在はPreview版で、2018.2から利用可能になるとのことです。
リソース管理の進化点
この新たなリソース管理フローはResources管理のような簡単さを目指したとのことでした。
Addresstable Assetsと一言で表してもツールとしてはラベルやグループなど新たな概念を扱うため、スライドも合わせて確認すると良いと思います。
機能 | 説明 |
---|---|
AssetReference | アセットのアドレスをInspectorから簡単に指定できるためのクラス |
参照カウント | 参照カウントによってリソースやインスタンスのロードや破棄ができる |
グループ | アセットの配置場所やパッキング方法、ロード方法を決めるカテゴリ |
コンテンツカタログ | アドレス、ラベル、グループの対応を保持するJsonデータ |
ラベル | アドレスに付与するタグ的な機能 |
プロファイル | ロード場所やビルド場所を、develop, test, releaseなど用途毎に設定できる |
プレイモード | エディター実行時のリソースのデータロード仕方を指定できる |
RM Profiler | アセットバンドル、アドレス付きアセットのロードとアンロード、参照カウント数、ロード方式を可視化 |
Resource Managerの仕組み
Addressable Assetsがアセットにアドレスを付与することで、アドレスによるロードや管理が出来るようにするシステムでした。
それに対し、Resource Managerはアセットを様々な場所から、非同期でロード・インスタンス化・管理・アンロードを出来るようにするシステムになります。
Resouce ManagerにはResource LocationとProviderという仕組みが用意されており、これがリソースの扱いをかなり柔軟にしてくれます。
機能 | 説明 |
---|---|
Resource Location | リソースの所在地や依存関係情報を提供 |
Resource Provider | リソースのロード・アンロード機能を提供 |
SceneProvider | シーンのロード・アンロード機能を提供 |
Instance Provider | インスタンスの生成・管理機能を提供 |
このProviderの嬉しいところは独自管理方法にしたい際などに、各種Providerにその処理を実装することで実現できることです。
とても楽しみな機能ですが、その分フローをしっかり理解する必要があるので、要チェックですね!
他の要確認セッション
運営中コンテンツにおける大型アップデート成功のための考え方とUnity最適化手法
【Unite 2018 Tokyo】スクリプトによるTimelineがっつり拡張入門
https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyotimeline-96459645
【Unite 2018 Tokyo】スクリプタブルレンダーパイプライン入門
【Unite 2018 Tokyo】C# Job SystemとECS(Entity Component System)解説
Day3感想
Day2と同様に既存の実装において新しい発見はあまりなかったです。
ただ、TimelineやAddresstable Assetsなど機能面での発見が多く、改めてチェックする必要がありました!
以上Uniteレポートでしたノシ
配信アーカイブ
https://www.twitch.tv/videos/259277629
・新機能Shader Graphを使えばプログラミング無しにシェーダーが作れるようになります!
・スクリプトによるTimelineがっつり拡張入門
・60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
・Windows Mixed Reality 最新アプリ開発情報 ~HoloLens からVRまで~
・Unityの開発サイクルとバグへの取り組みについて
・カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
・そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
・Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~