OculusGoで大量のオブジェクトを動かしてみた

08a7d188d046f35b2501e686616f71bd?s=47 mao
July 25, 2018

 OculusGoで大量のオブジェクトを動かしてみた

【Gotanda.unity #7】及び【札幌HoloLens ミートアップ vol.2 ~夏編~】にて登壇したときの発表資料です。
※「おまけ」については【Gotanda.unity #7】の発表時にて追加

● Gotanda.unity #7 in 株式会社ミクシィ @渋谷
https://gotanda-unity.connpass.com/event/92616/?utm_campaign=event_participate_to_follower&utm_medium=twitter&utm_source=notifications

● 札幌HoloLens ミートアップ vol.2 ~夏編~ LT資料
https://hololens.connpass.com/event/90368/

▼ スライド中のリンク

・今回実装したやつ
https://twitter.com/TEST_H_/status/1019018416798162944

▼ 検証用リポジトリ
https://github.com/mao-test-h/DokabenLogoVR

08a7d188d046f35b2501e686616f71bd?s=128

mao

July 25, 2018
Tweet

Transcript

  1. 6.
  2. 7.

    実装について ・ 仕様 - ドカベンロゴをランダムな位置に配置 + アニメーション + ビル ボードっぽいこと

    ・ 実装について - Unity2018からの新機能であるJobSystem + ECS + Burst Compilerで実装
  3. 8.

    実装について ・ 前提 - ECSはPureECSで実装 → エントリーポイント/Camera/Canvas以外は   基本的にGameObjectやMonoBehaviourは未使用 - 基本的にどの実装もECS

    + JobSystemを併用して実装 → ECSだけとかでは無い - 上記に合わせてBurst Compilerも基本的には有効化 → その為、記載している処理速度は有効化した上での数値
  4. 9.

    実装について 今回はLTなので細かい所までは話さない想定です。(時間がが) (多分)詳細な技術情報は以下のQiitaの記事に纏まっているので そちらを参照してみてください。 ※以下のでググると出てくるはず... ・ 【Unity】ドカベンOPのロゴアニメーションをシェーダーで実装してみた ・ 【Unity】ComputeShader +

    GPU Instancingで大量のドカベンOPのロゴアニメーションを動かしてみた ・ 【Unity】C# JobSystemで大量のドカベンロゴをアニメーションさせてみた ・ 【Unity】ECS + JobSystemで10万個のドカベンロゴをアニメーションさせてみた
  5. 12.

    親子構造 ・ 結果 - 1万個を動かした時点で48〜50fpsな印象。ちょっとゴリラな感じ。 ※計測時のProfilerの負荷も加味して - WorkerThreadに回っている回転処理の負荷だけで重い時で12〜16ms →MainThread側にも処理がまわっており、その時の負荷で大体5~10msの間 -

    その他にもECSのTransformが持つ親子構造周りと思われる処理でも ちょくちょくと負荷が掛かっている感。(※状況にもよるが0〜3ms以内) まだ調べきれていない点もあるが、 何となく頭打ち感があったので一旦別のアプローチへ。 (後半へ続く)
  6. 14.

    行列演算で最適化 ・ 親子構造の廃止 - 何となく負荷が掛かっていた親子構造周りの処理負荷を無くしたい。。 - かと言って既存のTransformのSystem周りを改造するのも大分ゴリラかと思われた。 ・ 新Mathライブラリの負荷?(※回転処理が重い話) -

    どこで負荷が掛かっている?中身を追う必要がありそう。。 とりあえずは任意点周りの回転行列を算出し、 TransformMatrixに掛け合わせてみることに。 → 別れていた処理を一つのSystemに纏めてみた
  7. 17.

    三角関数テーブルで最適化 ・ 結果 - 2万個を動かしても60fps近くをキープできるように(少しブレる) - 回転行列演算部分についてもWorkerThreadで平均1〜3msぐらいに収まり、 重いときでも6msぐらいに。 やはりn万個を同時に動かすとなると、 場合によっては毎回その数分計算→負荷になるかと思われるので、

    物によっては事前計算した物に置き換えることで最適化出来そうな気がした。 ※ 別件としてUnite2017に聞いた情報だと三角関数はルックアップテーブル化すると聞いた覚えがある。   今回の検証結果を踏まえての推測だと、恐らくは多分大量に処理する前提のため..?
  8. 18.
  9. 20.

    TransformSystemで負荷を下げつつ回す ・ 結果 - 1万個を動かした時点で60fpsに近いぐらい(こちらも少しブレる) - 2万個を動かしたら30fps近くに 結果としては親子構造を使うよりは軽くなった印象。 → 2万個動かした時点で重いのは回転処理の内部で

      三角関数が使われているのが原因かと思われる。 ※ 行列演算の最適化前が1万個の時点で重かったのはそもそものロジックが影響していた説... ※ ちなみに頂点を動かした版で軸指定回転行列演算側の計算負荷を下げる検証も念の為試してみたが、   そんなに変わらない印象。
  10. 21.