Многие указатели каста в QGraphicsView Framework и производительность
-
26-09-2019 - |
Вопрос
Поскольку большинство удобных функций QGraphicsScene и QGraphicsItem (например, элементы (), CollingIptiTems (), ChildItems () и т. Д.) Верните QList, вы вынуждены делать много QGRAPHICICICICICITITEM_CACH или STIATIC_CACH и QGRAPHICICICITITEM :: Тип () Получите охватывание фактических предметов, когда у вас есть много предметов различного типа на сцене. Я думал, что делать много литейных подкласс, не был желательным стилем кодирования, но я думаю, в этом случае нет другого жизнеспособного способа, или там нет?
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 */}