2012年7月21日土曜日

V8 エンジン搭載

# 以下,「できない」と書いてるのは「ぼくにはとてもできない」の意味

VSD for GPS に Google V8 を搭載することにした.
で,色々なサンプルをみてると,だいたい次のような流れになっている.
main(){
  V8初期化処理;
  スクリプトコンパイル;
  while( ... ){
    スクリプト実行;
  }
}
ここで注意しなければならないのは,V8 の作りとして,初期化・コンパイルで構築されたオブジェクトが生存していることが前提で,すなわち
init(){
  V8初期化処理;
  スクリプトコンパイル;
}

run(){
  スクリプト実行;
}

main(){
  init();
  while( ... ){
    run();
  }
}
みたいなことが単純にはできない.なぜなら,init() を抜けた時点で init() 内で構築されたオブジェクトが破棄されてしまうから.
ちょっと C に詳しい人なら (゚Д゚)ハァ? 何言ってんだコイツは,と思う人がいるかもしれない.でも俺が理解する限り V8 がそうなってるんです.特に HandleScope とかが独自のスタック構造になっていて,init() 内のオブジェクトを生かしたまま init() を抜けるとかができない.

で,ここで問題になってくるのが,VSD は AviUtl のプラグインだということ.大雑把に言ってプラグインとしてユーザが定義するのは 1フレーム分の画像を処理する関数で,1フレーム処理するごとにプラグイン関数を抜けて AviUtl に制御を返してやらなければならない.
ということは,プラグイン関数の中で毎回 初期化・スクリプトコンパイル・スクリプト実行 を行なってやらなければならない.数千フレームある動画をエンコすると数千回コンパイルが起こるわけでwww あほらしすぎる(;´д⊂)

んー,どうしたものか.

0 件のコメント:

コメントを投稿