さむいーさむいー。
冬眠に入れず寒さで出勤拒否したくなる「軽く熊」です。
最近はいろいろと忙しくてブログを更新できていなかったので
今回も最適化について書いてみようと思います。
あっ、ブログ書いてるからって別に暇なわけではないですよ。
忙しいんだからね。勘違いしないでよね!
本来の担当はスマホアプリ開発なわけですが、
やっぱり3teneの改修作業が来たりします。
今回もフェイストラッキングの最適化です。
フェイストラッキングを有効にすると
フレーム数が60fpsから40fps程度に落ちしまう…。
「VR動く高スペックマシンを使っているのにおかしいでしょ?」
との事。ごもっとも。
とりあえず解析してみると画像認識の処理時間がメインスレッドで
16msecもかかっているので当然60fpsは出るわけありません。
画像認識はミドルウェアで実装されているのでここを修正するのは困難です。
ではどうするか?
答えはマルチスレッド化。
今はマルチコアCPU時代ですからメインスレッドで処理されている画像処理を
別スレッドで処理させれば効率は非常に良くなります。
ただし、マルチスレッド化するにあたっていくつか注意事項がッ!
・画像認識はスレッドセーフ(マルチスレッド対応)になっているか?
・OpenGL 等のグラフィック API はコンテキスト操作しないとマルチスレッドで扱えない。
・扱うデータは排他制御が必要。
・スレッド間のデータ受け渡しオーバーヘッドを考慮する。
最適化は闇雲作業しても作業に見合う効果は無かったりします。
認識処理全体をマルチスレッド化するのは面倒だし、非効率なので
処理が重い認識処理のメソッド2つだけを別スレッドで処理します。
データの排他制御が可能かどうかを確認。←インスタンスとかね。
さらに認識結果が正しいのを確認したら、
グラフィック処理を考慮したマルチスレッドのコードを記述します。
受け渡しデータのオーバーヘッドが最小になれば最適化は完了です。
画像認識のレイテンシは増加しますが、スループットと
描画フレームは向上するので体感で大きな問題はありませんでした。
フェイストラッキングを有効にしても
フレーム数が60fpsから下がらなくなったのでした。
うぇーい。Mission completed.
シリーズ記事
3tene Mac 版の最適化
3tene フェイストラッキングの最適化 ← この記事だよ!
3teneバグ潰しライフ
3teneバグ潰しライフ2
3teneバグ潰しライフ3
3teneバグ潰しライフ LeapMotion編