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

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

3tene Mac 版の最適化

そろそろ冬眠準備中の「軽く熊」です。

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


初期リリース前の3tene(Mac版)はフェイストラッキングを使う
フレーム数が5fpsまで落ちて使い物にならない状態だったので
リリースする為に最適化して欲しいとの作業依頼が来たのでした。

処理落ちはWebカメラの画像が解像度を下げて取得できないので、
取得した高解像度画像をそのまま認識処理に渡している
原因はわかっているのですが対策できないとの事。

単純に縮小処理を入れれば良いと考えるわけですが
Webカメラから取得した画像は直でテクスチャに転送される実装だったので
そんな簡単な問題ではありませんでした。
※Webカメラ映像を3D空間に表示するのには適していますが、
 画像認識とは相性が悪い実装です。


テクスチャをレンダリングする時に縮小するのであれば
ハードウェアのアクセラレーションが使われるので高速ですが、
VRAM内のテクスチャ縮小には当然使われません。

テクスチャの縮小を用意された機能で実装するとデータの流れは
VRAM 読み込み → Main 縮小処理 → VRAM 書き戻し → Main 再読み込み → 画像認識
と無駄な転送が大量に発生しているようで1fps程度しか改善されませんでした。

という事でテクスチャからピクセル情報を取り出してfor文を回して
縮小を行うコードを記述しました。
テクスチャに転送された画像のピクセルフォーマットは固定ではないので
それらを考慮してのコーディングは非常に面倒です。

なんだかかんだで実装後のデータの流れは
VRAM ピクセル読み込み → Main 自作の縮小処理 → 画像認識
と無駄が無くなり、なんとか30fps程度までフレーム数が向上し、
リリースする目途が付いたのでした。

めでたし、めでたし。

シリーズ記事
3tene Mac 版の最適化 ← この記事だよ!
3tene フェイストラッキングの最適化
3teneバグ潰しライフ
3teneバグ潰しライフ2
3teneバグ潰しライフ3
3teneバグ潰しライフ LeapMotion編