Многие указатели каста в QGraphicsView Framework и производительность

StackOverflow https://stackoverflow.com/questions/3012169

Вопрос

Поскольку большинство удобных функций 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 */}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top