QGraphicsViewフレームワークとパフォーマンスのポインタキャストの多く
-
26-09-2019 - |
質問
QGraphicsSceneとQGraphicsItemの便利な機能のほとんどは()などの項目として(、collidingItems()、childItems()など)あなたがqgraphicsitem_castかはstatic_castとQGraphicsItemの多くを行うことを余儀なくしているQListにを返す::タイプ(あなたがシーン内の項目の異なる種類の多くを持っている場合)のチェックは、実際のアイテムを手に入れます。私は、サブクラスキャストのやってたくさんのが望ましくコーディングスタイルではないと思っていたが、私はこのケースでは、他の実行可能な方法が存在しないと思う、またはそこには?
でありますQList<QGraphicsItem *> itemsHit = someItem->collidingItems(Qt::IntersectsItemShape);
foreach (QGraphicsItem *item, itemsHit) {
if (item->type() == QGraphicsEllipseItem::type()) {
QGraphicsEllipseItem *ellipse = qgraphicsitem_cast<QGraphicsEllipseItem *>(item);
// do something
}
else if (item->type() == MyItemSubclass::type()) {
MyItemSubClass *myItem = qgraphicsitem_cast<MyItemSubClass *>(item);
// do something
}
// etc
}
正しいタイプが既に確認されているので上記qgraphicsitem_castはstatic_castを置き換えることができます。これらの多くのすべての時間(非常にダイナミックなシーン)を行う場合、数多くの鋳造は、通常であれば、他の評価を超えてパフォーマンスに影響を与えるのだろうか?
解決
は、パフォーマンス・オーバーヘッドはほとんどプリペイドあります。それは.type()
の部材を有するのオーバーヘッドの結果です。一度item->type()
を取得するのが効率的かもしれません。あなたは、それは変わらないけど、チャンスは、コンパイラにはないです。
[編集]
あなたが本当にの種類の多くを持っている場合にも、いくつかの中間的なタイプを導入する価値がある可能性があります。例えば。 if (dynamic_cast<MyGraphicsInterMediateType*>(item)) {/* check those types */} else {/* other types */}
所属していません StackOverflow