Множество приведений указателей в платформе и производительности QGraphicsView - PullRequest
3 голосов
/ 10 июня 2010

Поскольку большинство вспомогательных функций QGraphicsScene и QGraphicsItem (таких как items (), collidingItems (), childItems () и т. Д.) Возвращают QList, вы вынуждены делать множество qgraphicsitem_cast или static_cast и QGraphicsItem :: Type () проверяет наличие реальных предметов, когда на сцене много предметов различного типа.Я думал, что выполнение большого количества приведений к подклассам не было бы желательным стилем кодирования, но я предполагаю, что в этом случае нет другого жизнеспособного способа, или он есть?

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, так как правильныйтип уже проверен.Делая много всего этого постоянно (очень динамичная сцена), повлияют ли многочисленные кастинги на производительность помимо обычной оценки if-else?

1 Ответ

0 голосов
/ 10 июня 2010

Накладные расходы в основном оплачиваются заранее; это результат накладных расходов на членство. type(). Это может быть эффективным, чтобы получить item->type() один раз. Вы знаете, что это не изменится, но, скорее всего, компилятор не изменится.

[править] Кроме того, если у вас действительно много типов, возможно, стоит ввести несколько промежуточных типов. например. if (dynamic_cast<MyGraphicsInterMediateType*>(item)) {/* check those types */} else {/* other types */}

...