プラスプラス開発者ブログ

岩手県盛岡市のシステム開発会社「株式会社プラスプラス」の開発者ブログです。

3tene フェイストラッキングの最適化

さむいーさむいー。
冬眠に入れず寒さで出勤拒否したくなる「軽く熊」です。

最近はいろいろと忙しくてブログを更新できていなかったので
今回も最適化について書いてみようと思います。

あっ、ブログ書いてるからって別に暇なわけではないですよ。
忙しいんだからね。勘違いしないでよね!


本来の担当はスマホアプリ開発なわけですが、
やっぱり3teneの改修作業が来たりします。

今回もフェイストラッキングの最適化です。
フェイストラッキングを有効にすると
フレーム数が60fpsから40fps程度に落ちしまう…。
VR動く高スペックマシンを使っているのにおかしいでしょ?」
との事。ごもっとも。

とりあえず解析してみると画像認識の処理時間がメインスレッドで
16msecもかかっている
ので当然60fpsは出るわけありません。
画像認識はミドルウェアで実装されているのでここを修正するのは困難です。
ではどうするか?

答えはマルチスレッド化。

今はマルチコアCPU時代ですからメインスレッドで処理されている画像処理を
別スレッドで処理させれば効率は非常に良くなります。

ただし、マルチスレッド化するにあたっていくつか注意事項がッ!
・画像認識はスレッドセーフ(マルチスレッド対応)になっているか?
OpenGL 等のグラフィック API はコンテキスト操作しないとマルチスレッドで扱えない。
・扱うデータは排他制御が必要。
・スレッド間のデータ受け渡しオーバーヘッドを考慮する。

最適化は闇雲作業しても作業に見合う効果は無かったりします。
認識処理全体をマルチスレッド化するのは面倒だし、非効率なので
処理が重い認識処理のメソッド2つだけを別スレッドで処理します。

データの排他制御が出来ていれば認識結果が正しいのを確認し、
グラフィック処理を考慮したコードを記述します。

受け渡しデータのオーバーヘッドが最小になれば最適化は完了です。
画像認識のレイテンシは増加しますが、スループット
描画フレームは向上する
ので体感で大きな問題はありませんでした。

フェイストラッキングを有効にしても
フレーム数が60fpsから下がらなくなったのでした。

うぇーい。Mission completed.