##// END OF EJS Templates
Accelerating lineseries with OpenGL...
Accelerating lineseries with OpenGL Added support for QAbstractSeries::useOpenGL property. When true, the series in question is drawn on a separate offscreen buffer using OpenGL and then superimposed on the chart. Currently this property is only supported for line and scatter series. Change-Id: I174fec541f9f3c23464270c1fe08f824af16a0fb Reviewed-by: Titta Heikkala <titta.heikkala@theqtcompany.com> Reviewed-by: Tomi Korpipää <tomi.korpipaa@theqtcompany.com>

File last commit:

r2820:79a856530b69
r2820:79a856530b69
Show More
main.cpp
167 lines | 5.5 KiB | text/x-c | CppLexer
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd
** All rights reserved.
** For any questions to The Qt Company, please use contact form at http://qt.io
**
** This file is part of the Qt Charts module.
**
** Licensees holding valid commercial license for Qt may use this file in
** accordance with the Qt License Agreement provided with the Software
** or, alternatively, in accordance with the terms contained in a written
** agreement between you and The Qt Company.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.io
**
****************************************************************************/
#include "datasource.h"
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QScatterSeries>
#include <QtCharts/QValueAxis>
#include <QtCharts/QLogValueAxis>
#include <QtWidgets/QLabel>
// Uncomment to use logarithmic axes instead of regular value axes
//#define USE_LOG_AXIS
// Uncomment to use regular series instead of OpenGL accelerated series
//#define DONT_USE_GL_SERIES
// Uncomment to add a simple regular series (thick line) and a matching OpenGL series (thinner line)
// to verify the series have same visible geometry.
//#define ADD_SIMPLE_SERIES
QT_CHARTS_USE_NAMESPACE
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QStringList colors;
colors << "red" << "blue" << "green" << "black";
QChart *chart = new QChart();
chart->legend()->hide();
#ifdef USE_LOG_AXIS
QLogValueAxis *axisX = new QLogValueAxis;
QLogValueAxis *axisY = new QLogValueAxis;
#else
QValueAxis *axisX = new QValueAxis;
QValueAxis *axisY = new QValueAxis;
#endif
chart->addAxis(axisX, Qt::AlignBottom);
chart->addAxis(axisY, Qt::AlignLeft);
const int seriesCount = 10;
#ifdef DONT_USE_GL_SERIES
const int pointCount = 100;
chart->setTitle("Unaccelerated Series");
#else
const int pointCount = 10000;
chart->setTitle("OpenGL Accelerated Series");
#endif
QList<QXYSeries *> seriesList;
for (int i = 0; i < seriesCount; i++) {
QXYSeries *series = 0;
int colorIndex = i % colors.size();
if (i % 2) {
series = new QScatterSeries;
QScatterSeries *scatter = static_cast<QScatterSeries *>(series);
scatter->setColor(QColor(colors.at(colorIndex)));
scatter->setMarkerSize(qreal(colorIndex + 2) / 2.0);
// Scatter pen doesn't have affect in OpenGL drawing, but if you disable OpenGL drawing
// this makes the marker border visible and gives comparable marker size to OpenGL
// scatter points.
scatter->setPen(QPen("black"));
} else {
series = new QLineSeries;
series->setPen(QPen(QBrush(QColor(colors.at(colorIndex))),
qreal(colorIndex + 2) / 2.0));
}
seriesList.append(series);
#ifdef DONT_USE_GL_SERIES
series->setUseOpenGL(false);
#else
//![1]
series->setUseOpenGL(true);
//![1]
#endif
chart->addSeries(series);
series->attachAxis(axisX);
series->attachAxis(axisY);
}
if (axisX->type() == QAbstractAxis::AxisTypeLogValue)
axisX->setRange(0.1, 20.0);
else
axisX->setRange(0, 20.0);
if (axisY->type() == QAbstractAxis::AxisTypeLogValue)
axisY->setRange(0.1, 10.0);
else
axisY->setRange(0, 10.0);
#ifdef ADD_SIMPLE_SERIES
QLineSeries *simpleRasterSeries = new QLineSeries;
*simpleRasterSeries << QPointF(0.001, 0.001)
<< QPointF(2.5, 8.0)
<< QPointF(5.0, 4.0)
<< QPointF(7.5, 9.0)
<< QPointF(10.0, 0.001)
<< QPointF(12.5, 2.0)
<< QPointF(15.0, 1.0)
<< QPointF(17.5, 6.0)
<< QPointF(20.0, 10.0);
simpleRasterSeries->setUseOpenGL(false);
simpleRasterSeries->setPen(QPen(QBrush("magenta"), 8));
chart->addSeries(simpleRasterSeries);
simpleRasterSeries->attachAxis(axisX);
simpleRasterSeries->attachAxis(axisY);
QLineSeries *simpleGLSeries = new QLineSeries;
simpleGLSeries->setUseOpenGL(true);
simpleGLSeries->setPen(QPen(QBrush("black"), 2));
simpleGLSeries->replace(simpleRasterSeries->points());
chart->addSeries(simpleGLSeries);
simpleGLSeries->attachAxis(axisX);
simpleGLSeries->attachAxis(axisY);
#endif
QChartView *chartView = new QChartView(chart);
QMainWindow window;
window.setCentralWidget(chartView);
window.resize(600, 400);
window.show();
DataSource dataSource;
dataSource.generateData(seriesCount, 10, pointCount);
QLabel *fpsLabel = new QLabel(&window);
QLabel *countLabel = new QLabel(&window);
QString countText = QStringLiteral("Total point count: %1");
countLabel->setText(countText.arg(pointCount * seriesCount));
countLabel->resize(window.width(), countLabel->height());
fpsLabel->move(10,2);
fpsLabel->raise();
fpsLabel->show();
countLabel->move(10, 14);
fpsLabel->raise();
countLabel->show();
// We can get more than one changed event per frame, so do async update.
// This also allows the application to be responsive.
QObject::connect(chart->scene(), &QGraphicsScene::changed,
&dataSource, &DataSource::handleSceneChanged);
dataSource.startUpdates(seriesList, fpsLabel);
return a.exec();
}