Какую производительность следует ожидать от платформы Qt Datavisualization при отображении пользовательских элементов? - PullRequest
0 голосов
/ 02 марта 2020

При создании пользовательского графика на основе инфраструктуры Qt Datavisualization я пришел к следующему:

На MacBook Pro в середине 2015 года требуется более 90% процессорного времени. Можно ли сделать это быстрее? Или это то, чего я должен ожидать.

Я пробовал graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone); и graph->activeTheme()->setBackgroundEnabled(false);, похоже, он не работает быстрее.

enter image description here

mainwidget.h

#include <QWidget>
#include <QVBoxLayout>
#include <Q3DBars>
#include <QTimer>
#include <QCustom3DItem>
#include <QImage>
#include <QVector>

using namespace QtDataVisualization;

class MainWidget : public QWidget
{
    Q_OBJECT

    QVBoxLayout vLayoutMain;
    Q3DBars graph;
    QTimer timer;
    QVector<QCustom3DItem*> items;

    QCustom3DItem* custom_item(float x, float z, float y=0);

public:
    explicit MainWidget(QWidget *parent = nullptr);
    void setScale();

};

mainwidget. cpp

#include "mainwidget.h"

const int MAX = 256;

MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
{
    setLayout(&vLayoutMain);

    auto container = QWidget::createWindowContainer(&graph); 

    vLayoutMain.addWidget(container);

    graph.scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetIsometricLeft);

    graph.valueAxis()->setRange(0, MAX);
    graph.columnAxis()->setRange(0, MAX);
    graph.rowAxis()->setRange(0, MAX);

    items.resize(MAX*MAX);
    for (int col = 0; col < MAX; ++col)
        for (int row = 0; row < MAX; ++row) {
            items[col*MAX+row] = custom_item(row,col);
            graph.addCustomItem(items[col*MAX+row]);
        }

    connect(&timer, &QTimer::timeout, this, &MainWidget::setScale);
    timer.start(200);
}

void MainWidget::setScale()
{
    static int i = 0;
    int scale = 10*i++;
    if (!(scale < MAX)) {scale = 0; i = 0;}
    for (int c = 0; c < MAX; ++c)
        for (int p = 0; p < MAX; ++p) 
            items[c*MAX+p]->setScaling(QVector3D(1,scale,1));
}

QCustom3DItem* MainWidget::custom_item(float x, float z, float y)
{
    auto item = new QCustom3DItem;
    item->setScalingAbsolute(false);
    item->setMeshFile(QStringLiteral(":/mesh/plane.obj"));
    item->setPosition(QVector3D(x,y,z));
    QImage image{1, 1, QImage::Format_RGB32};
    image.fill(Qt::red);
    item->setTextureImage(image);
    item->setVisible(true);
    return item;
}

plane.ojb

# Blender v2.81 (sub 16) OBJ File: ''
# www.blender.org
o Plane
v -0.500000 0.000000 -0.000000
v 0.500000 0.000000 -0.000000
v -0.500000 2.000000 0.000000
v 0.500000 2.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 1.000000
vn 0.0000 -0.0000 1.0000
s off
f 2/1/1 3/2/1 1/3/1
f 2/1/1 4/4/1 3/2/1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...