swigでpython bindingのメモ
ポリゴン読み込みライブラリのswigを使ったpythonバインディング実験が完了した。
これを使ってBlenderのmqo, pmd, vmdのインポータのデータ読み取り部分を置き換えての動作も確認できたので、今回は予定通りswigを採用することにする。使ってみて気付いたことなどをメモ。
遅くなってしまった
フルpythonで書いていたインポータより遅くなった。C++で書いているのでデータの読み込みは一瞬で終わるのだが、読み込んだデータをpythonとやりとりするのが遅い。
たぶん、
%template(VertexVector) std::vector<meshio::pmd::Vertex>;
こういうのがよろしくない。
これをpython側でfor文で回したときに意図しないnewとかが呼ばれている気がする。
ポインタじゃなくて実体の入った巨大vector(頂点配列やモーションで使う)を使う場合はカスタムのコードを書く必要がありそうだ。
関連してpython側で
assert(vertices[0]==vertices[0])
とやるとC++で別々の実体がnewされて上記がFalseになっているようだ。
(__eq__を定義していない場合にポインタで比較すると仮定。未調査)
リファレンスで取得してポインタで保持するような細工が要るんでないか。