2010-06-10 3 views
3

QGraphicsScene 및 QGraphicsItem (items(), collidingItems(), childItems() 등)의 편의 기능 대부분이 QList를 반환하므로 많은 qgraphicsitem_cast 또는 static_cast 및 QGraphicsItem :: Type()은 장면에 다른 유형의 항목이 많이있을 때 실제 항목을 유지하기 위해 검사합니다. 나는 많은 서브 클래스 캐스트를하는 것이 바람직한 코딩 스타일이 아니라고 생각했지만,이 경우 다른 가능한 방법이 없다고 생각합니까?QGraphicsView 프레임 워크 및 성능에서 포인터 캐스트가 많습니다.

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

+1 동일한 문제가 있습니다. 주목할 가치가있는 한 가지 점은 setData()/data() 메서드를 사용하여 각 QGraphicsItem에 임의의 데이터 (QVariant)를 저장하고 키로 데이터에 액세스 할 수 있다는 것입니다. 유용 할 수 있습니다. – Rob

답변

0

성능 오버 헤드는 대부분 선불입니다. 그것의 오버 헤드의 결과입니다. type() 회원. item->type()을 한 번 검색하는 것이 효율적일 수 있습니다. 변경되지 않는다는 것을 알지만 컴파일러는 그렇지 않습니다.

[편집] 또한 에는 유형이 많으므로 몇 가지 중간 유형을 소개하는 것이 좋습니다. 예. if (dynamic_cast<MyGraphicsInterMediateType*>(item)) {/* check those types */} else {/* other types */}

+0

아, foreach 블록이 시작될 때 한 번 가져 오는 것입니까? 그것은 좋은 지적입니다. – kleimola

+0

예. 이제 당신은 모든 비교를 위해 그것을 가져 왔습니다. 나는 그것이 가상 전화라고 생각하고 싸구려는 무료 다. 모든 장면의 모든 물체에이 값을 곱하면 값이 비싸지도 않은 많은 값싼 통화를 할 수 있습니다. – MSalters