LoginSignup
1
0

More than 3 years have passed since last update.

OculusGoでPhotonVoiceRecorderが原因の急激なパフォーマンス低下

Last updated at Posted at 2019-05-30

事象

OculusGo でボイスチャットが出来るアプリを作っていたが、今まで正常に動いていたアプリが突然 2FPS になってしまった。今までは70FPSぐらい安定して出ていたのになぜ...、しかも特に高負荷な処理は無い。

結論

結論から言うと、発生条件は OculusRoom 起動して終了せずに自作アプリを動かした時。
根本原因までは突き止められなかったが、おそらく OculusRoom の Parties で使われる共有マイクが有効になった状態で自作アプリが立ち上がり、マイクへのアクセスが競合していた為では無いかと考えられる。

暫定的だが解決策はOculusGo の再起動
(OculusRoom を後から終了したり、Parties を解散してもパフォーマンスは低下したままだった)

本当は共有マイクを無効化すれば良いとは思うが、知識不足でその方法まで辿り着けなかった。
下記は Parties が原因だろうという結論に辿り着くまでの道のり。

PhotonVoiceが原因

ひとまず Profiler を見て、様々なチューニングを施していたがどれも成果は上がらなかった。
image

どこか原因なのか調べる為に負荷が高そうなコードをコメントアウトしていった。
すると、 PhotonVoiceRecorder をアタッチしている部分が原因である事が分かった。
更に調べると、PhotonVoiceRecorderMicrophoneTypePhoton に設定している時のみこの事象が発生する事がわかった。

なぜボイスチャットのスクリプトが原因でここまで負荷が掛かっているのか。
全く検討もつかなかったが、ふと OculusGo を再起動すると何事も無かったかのように 70FPS に戻った。

🤔🤔🤔

OculusRoomが影響してた

ここでふと頭に思い浮かんだのは「OculusRoom」だった。
OculusRoom 起動後に「友達を招待」を押してからアプリを終了せずに、別アプリを起動。
この状態では、OculusRoom のマイクアクセスが別アプリ起動中にも続いてるのでは無いかと考えた。

これを検証する為に再起動後に OculusRoom を実行し、終了せずに自作アプリを動かすと予想通りフレームレートは低下した。

OculusRoom のプロセスが動き続けてるのが原因かと考えたが、そんなことは無かった。

# OculusRoom 立ち上げ中
$ adb shell ps | grep room
u0_a50    3022  584   2703116 807956 SyS_epoll_ 0000000000 S com.oculus.rooms

# 自作アプリ立ち上げ中
$ adb shell ps | grep room

OculusPartiesの共有マイクに問題ありそう

ひとまず OculusRoom が原因だと分かったので色々ググってみると、OculusRoom の「Parties」という機能にたどり着いた。

たとえば、友人のグループは、Homeでパーティーを開き、一緒に遊びたいゲームについてチャットすることができます。その後、アプリを起動すると、そのアプリ内でもチャットセッションは継続されます。マルチプレイヤーアプリにボイスチャット機能もある場合は、パーティーチャットを無効にします。 (※ Parties - Oculus より引用)

さらにドキュメントを読むと、Parties で使われるマイクを「Shared Microphone」と呼び、Unity で管理出来るようだった。

早速Shared Microphone が原因なのか調べようとしたが、Platform.Microphone.Destroy() が見つからない。代わりに MicrophoneInput.cs が見つかったが、これは非推奨で Oculus.Platform.Voip を使えとの事。

This file is deprecated. Use the high level voip system instead: https://developer.oculus.com/documentation/platform/latest/concepts/dg-cc-voip/ (※ OculusIntegrationのMicrophone.csより)

Oculus.Platform.Voip には stop というメソッドがあったが、引数の userID が分からず断念。
(ドキュメントもどこを見れば良いか分からなかった)

Platform.cs
  public static partial class Voip
  {
    ...
    public static void Stop(UInt64 userID)
    {
      if (Core.IsInitialized())
      {
        CAPI.ovr_Voip_Stop(userID);
      }
    }
    ...

参考: https://developer.oculus.com/documentation/platform/latest/concepts/dg-cc-voip/

まとめ

Oculusの技術周りにあまり強くない為、根本原因に辿り着けなかった。
ただ、OculusRoom 実行後に自作アプリが PhotonVoice によって激重になる事は分かった。

どなたか原因や解決策が分かる方がいらっしゃいましたらご教示頂けると幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0