0

カスタムで多くのポイント (>1.000.000) と異なる色でプロットをレンダリングしたいQQuickItem

後でこれらのポイント (座標と色の間のフェード) をアニメートしたいので、これにQQuickPaintedItemは十分な速度ではないと思うので、 のupdatePaintNodeインターフェイスを使用する必要がありますQQuickItem

問題は、各ポイントの色を設定することです。Point a ごとに作成し、QSGGeometryNodeGeometry と ColorMaterial を追加する必要がありますか? または、より速い解決策はありますか?

よろしくお願いします

4

2 に答える 2

2

200 万の要素は非常に多く、内部のループが原因で GUI がフリーズすると考えています(ドキュメントに記載されているように、実行updatePaintNode中に GUI スレッドがブロックされます)。updatePaintNode

アイデア#1

ポイント配列全体を頻繁に変更しない場合はupdatePaintNode、巨大な 2kk ループを毎回実行する代わりに、最後のペイント以降に変更された頂点のみを更新できます。しかし、知る限り、ヒストグラムのサイズを変更する場合は、すべての頂点を更新する必要があります。

アイデア#2

もう 1 つの潜在的な最適化は、前に頂点データ配列を準備し、次に を使用して、または内部でupdatePaintNode配列全体をコピーすることです。連続メモリ配列全体をコピーすると、要素ごとのコピーよりもはるかに高速になる傾向があります。アクセサ関数を使用して配列を埋めているため、コンパイラによって最適化されているかどうかはわかりません。memcpystd::copyupdatePaintNode

アイデア#3

200 万ポイントは、1 つのグラフに表示するには多すぎるようです。一度に非常に多くのデータを表示すると、異なる色のポイントが重なってユーザーが貴重な情報を見逃す可能性があるため、UX が損なわれる可能性があります。

同じ色のポイントをマージし、別々のポイントではなくこれらのクラスターを視覚化することで、詳細レベルを下げることができます。ただし、このアプローチにはかなりの労力がかかるため、それほど複雑でないソリューションが役に立たない場合に試してみることをお勧めします。

于 2014-12-01T10:18:46.800 に答える
1

私はopenGLを少し使って、自分に合った解決策を見つけました

QSGGeometry::Point2D頂点の設定に使用される通常の OpenGL の例。ただし、カラー対応のバージョンもあります(QSGGeometry::defaultAttributes_ColoredPoint2D())。だから私は頂点を設定することができます

  vertices[i].set(x, y, r,g, b, a);

//編集: 次の問題は、QSGeometry-Object に多くの頂点がある場合、GUI が時々フリーズすることです。どうしてか分かりません。頂点にメモリを割り当てた後、GUI の速度が低下するため、この方法ではパフォーマンスが低下します。

//編集 2:

現在のメソッドの簡略化されたコードを追加しましたupdatePaint。データ オブジェクトが非常に大きい (>2.000.000 ポイント) 場合、ウィジェットはポイントをレンダリングしますが、GUI 全体がハングして途切れます。

QSGNode *HistogramView::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
{
QSGGeometryNode *node = 0;
QSGGeometry *geometry = 0;

if (!oldNode) {
    node = new QSGGeometryNode;
    geometry = new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), data.size());
    geometry->setDrawingModeelsize(GL_POINTS);
    node->setGeometry(geometry);
    node->setFlag(QSGNode::OwnsGeometry);

    QSGVertexColorMaterial *material = new QSGVertexColorMaterial();
    //material->setColor(QColor(255, 0, 0));
    node->setMaterial(material);
    node->setFlag(QSGNode::OwnsMaterial);

} else {
    node = static_cast<QSGGeometryNode *>(oldNode);
    geometry = node->geometry();
    geometry->allocate(222);
}
QSGGeometry::ColoredPoint2D *vertices = geometry->vertexDataAsColoredPoint2D();
for (int i = 0; i < data.size(); i++) {
        vertices[id].set(x, y,red, green, blue, 255);
        }
    }
}
node->markDirty(QSGNode::DirtyGeometry);
return node;



}

エラーを特定できました。QSGGeometry-object( ) の初期化を呼び出した後geometry = new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), data.size());、GUI は非常に遅くなります。

ご挨拶

于 2014-11-28T00:37:22.370 に答える