MayaAPIのすゝめ 第2稿
MayaAPIのすゝめ 第2稿
前回はMayaCmdsのAPI化による高速化を紹介しました。
しかし速度的にはUIがボトルネックになりあまり実用的ではない実装となってしまっています。
今回はMayaAPIから話がずれますが、UIの高速化についてご紹介したいと思います。
もう少し早い実装で書き直してみましょう。
さて前回使ったQTableWidgetですが、機能的には全部入りでとても扱い易いウィジェットです。
何も考えずクラスを呼び出してデータセットすればあとは読み書き自在。
シグナルも基本的なものは揃っています。
が、遅い。とにかく遅い。
オールインワンなだけに内部計算も多いのかな?
巨大なデータテーブルをセット、表示するには時間がかかりすぎてしまいます。
前回の例ではたかだか5000頂点のウェイトを表示するのに7.63secもかかってしまいました。
PySideのView-Model
ではUIのボトルネックを解消するにはどうすればいいでしょうか?
PySideにはView-Modelという仕組みが用意されていてこちらを利用すればパフォーマンスが大幅に改善するようです。
初見では概念がちょっとわかりにくいのですが、
QTableWidgetがデータ管理から表示、選択まで全部入りだったのに対して、こちらはそれぞれの機能のクラスを呼び出して組み合わせるようになります。
・View(QTableView)
名前の通りデータ表示するクラスです。次項ItemModelからデータを受け取り表示します。他にはListViewやTreeView等があります。
・Model(QStandardItemModel)
こちらはデータを管理するクラスです。標準的なデータ入出力であればQStandardItemModelをよくつかいます。
他QFileSystemModelやQDirModel等用途に特化したモデルも用意されています。
(あんまり詳しくないです、すんまそ)
・SelectionModel(QItemSelectionModel)
UIの選択状態を管理するクラス。現在の選択されているセルを返したり、選択状態の変化をシグナルで伝えたりします。
・ちょーかんたんな概念図
実際にView-Modelで実装したのがこちら
Sample Editor 3 MayaAPI2.0 + QTableView + QStandar ...
具体的なコード変更箇所
60行目、TableWidgetをインスタンス化していたところがQTableViewになっています。
メンバ関数では
・table_setup(self)
ウェイトデータ取得時にQStandardItemModelをインスタンス化してデータセット
↓
ItemSelectionModelにデータ(QStandardItemModelのインスタンス)を渡しインスタンス化
↓
それぞれをViewに設定
という流れに変更
・update_weights(self)
テーブル更新時のデータ取得方法をシグナル違いに合わせて変更しています。
シグナルの引数として矩形選択データが来ますが現状1セルのみ。
この辺はまた別の機会に。
では早速計測してみましょう。
今回もよろしくオナシャスXSI男さん(5000頂点)。
!!前回と全く同じ条件でテーブル設定から表示まで
7.63sec→0.44secと17倍ほど高速化できました!!イェー!!
危うくヒャッハーしそうなほど高速化しましたがまだまだ遅いですね。
XSI男Perfect(約20000頂点)で計測してみましょう。
テーブル表示に約2.8sec
昨今ではこのくらいの頂点数は当たり前ですね、インタラクティブに操作するのであればこれくらいでも秒以下を実現しないと辛い。
SIWeightEditorでは同じモデルでデータ取得と合わせて0.3secを実現できています。
というわけで次はQStandardItemModelに変わりQAbstractTableModelでの実装をすすめていきます。
基本的にはViewModelの仕組みはそのままにStandardItemModelを置き換えるイメージです。
QAbstractTableModelはモデルとして最低限の機能しかないのでレスポンスが高速です。引き換えに自分のツールに必要な様々な機能をクラスを継承してオーバーライド、関数追加していかなければなりません。
これがまた複雑で初見殺しな仕様なので次回、詳細なサンプルをお届けしようと思います。
ではでは今日はこの辺で、再見!
追記
よく考えたら今回QItemSelectionModelの機能が生きてませんね、、これもそのうち紹介します。