From fd9486b6cbe28a766450e35ad97d845584f56fb1 Mon Sep 17 00:00:00 2001 From: Mika Salmela Date: Fri, 10 Oct 2014 13:09:01 +0300 Subject: Qml performance measurement app Change-Id: I425da013160a12c1d2b3985e04059886d0695474 Reviewed-by: Mika Salmela --- tests/qmlperf/main.cpp | 47 +++++++++ tests/qmlperf/qml/qmlperf/main.qml | 189 ++++++++++++++++++++++++++++++++++++ tests/qmlperf/qml/qmlperf/script.js | 33 +++++++ tests/qmlperf/qmlperf.pro | 12 +++ tests/qmlperf/qmlperf.qrc | 6 ++ tests/tests.pro | 3 +- 6 files changed, 289 insertions(+), 1 deletion(-) create mode 100644 tests/qmlperf/main.cpp create mode 100644 tests/qmlperf/qml/qmlperf/main.qml create mode 100644 tests/qmlperf/qml/qmlperf/script.js create mode 100644 tests/qmlperf/qmlperf.pro create mode 100644 tests/qmlperf/qmlperf.qrc (limited to 'tests') diff --git a/tests/qmlperf/main.cpp b/tests/qmlperf/main.cpp new file mode 100644 index 00000000..7d35b2ed --- /dev/null +++ b/tests/qmlperf/main.cpp @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQuickView viewer; + + // The following are needed to make examples run without having to install the module + // in desktop environments. +#ifdef Q_OS_WIN + QString extraImportPath(QStringLiteral("%1/../../../%2")); +#else + QString extraImportPath(QStringLiteral("%1/../../%2")); +#endif + viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(), + QString::fromLatin1("qml"))); + QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close); + + viewer.setTitle(QStringLiteral("QML Performance")); + viewer.setSource(QUrl("qrc:/qml/qmlperf/main.qml")); + viewer.setResizeMode(QQuickView::SizeRootObjectToView); + viewer.show(); + + return app.exec(); +} diff --git a/tests/qmlperf/qml/qmlperf/main.qml b/tests/qmlperf/qml/qmlperf/main.qml new file mode 100644 index 00000000..35f8df5d --- /dev/null +++ b/tests/qmlperf/qml/qmlperf/main.qml @@ -0,0 +1,189 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 1.0 +import QtDataVisualization 1.1 +import "script.js" as Script +import "." + +Rectangle { + id: mainview + width: 1280 + height: 1024 + + property var itemCount: 1000.0 + property var addItems: 1000.0 + + Button { + id: changeButton + width: 350 + height: 50 + anchors.left: parent.left + enabled: true + text: "Change" + onClicked: { + console.log("changeButton clicked"); + if (graphView.state == "meshsphere") { + graphView.state = "meshcube" + } else if (graphView.state == "meshcube") { + graphView.state = "meshpyramid" + } else if (graphView.state == "meshpyramid") { + graphView.state = "meshpoint" + } else if (graphView.state == "meshpoint") { + graphView.state = "meshsphere" + } + } + } + + Text { + id: fpsText + text: "Reading" + width: 300 + height: 50 + anchors.left: changeButton.right + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + + Button { + id: optimization + width: 300 + height: 50 + anchors.left: fpsText.right + enabled: true + text: scatterPlot.optimizationHints === AbstractGraph3D.OptimizationDefault ? "To Static" : "To Default" + onClicked: { + console.log("Optimization"); + if (scatterPlot.optimizationHints === AbstractGraph3D.OptimizationDefault) { + scatterPlot.optimizationHints = AbstractGraph3D.OptimizationStatic; + optimization.text = "To Default"; + } else { + scatterPlot.optimizationHints = AbstractGraph3D.OptimizationDefault; + optimization.text = "To Static"; + } + } + } + + Button { + id: itemAdd + width: 300 + height: 50 + anchors.left: optimization.right + enabled: true + text: "Add" + onClicked: { + itemCount = itemCount + addItems; + Script.createData(addItems); + } + } + + Item { + id: graphView + width: mainview.width + height: mainview.height + anchors.top: changeButton.bottom + anchors.left: mainview.left + state: "meshsphere" + + ListModel { + id: dataModel + Component.onCompleted: Script.createData(itemCount) + } + + Scatter3D { + id: scatterPlot + width: graphView.width + height: graphView.height + shadowQuality: AbstractGraph3D.ShadowQualityNone + optimizationHints: AbstractGraph3D.OptimizationDefault + scene.activeCamera.yRotation: 45.0 + measureFps: true + onCurrentFpsChanged: { + fpsText.text = itemCount + " : " + scatterPlot.currentFps.toFixed(1); + } + +// theme: Theme3D { +// type: Theme3D.ThemeRetro +// colorStyle: Theme3D.ColorStyleRangeGradient +// baseGradients: customGradient + +// ColorGradient { +// id: customGradient +// ColorGradientStop { position: 1.0; color: "red" } +// ColorGradientStop { position: 0.0; color: "blue" } +// } +// } + + Scatter3DSeries { + id: scatterSeries + mesh: Abstract3DSeries.MeshSphere + ItemModelScatterDataProxy { + itemModel: dataModel + xPosRole: "x" + yPosRole: "y" + zPosRole: "z" + } + } + } + + states: [ + State { + name: "meshsphere" + StateChangeScript { + name: "doSphere" + script: { + console.log("Do the sphere"); + scatterSeries.mesh = Abstract3DSeries.MeshSphere; + } + } + }, + State { + name: "meshcube" + StateChangeScript { + name: "doCube" + script: { + console.log("Do the cube"); + scatterSeries.mesh = Abstract3DSeries.MeshCube; + } + } + }, + State { + name: "meshpyramid" + StateChangeScript { + name: "doPyramid" + script: { + console.log("Do the pyramid"); + scatterSeries.mesh = Abstract3DSeries.MeshPyramid; + } + } + }, + State { + name: "meshpoint" + StateChangeScript { + name: "doPoint" + script: { + console.log("Do the point"); + scatterSeries.mesh = Abstract3DSeries.MeshPoint; + } + } + } + ] + } +} diff --git a/tests/qmlperf/qml/qmlperf/script.js b/tests/qmlperf/qml/qmlperf/script.js new file mode 100644 index 00000000..dc271e8d --- /dev/null +++ b/tests/qmlperf/qml/qmlperf/script.js @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +//function createData(base) { +// for (var z = 0; z < 30; z++) { +// for (var x = 0; x < 30; x++) { +// var angle = (((z - 16) * (x - 16)) / 144.0) * 1.57; +// var y = Math.sin(angle + base); +// dataModel.append({"z": z, "x": x, "y": y}); +// } +// } +//} + +function createData(base) { + for (var i = 0; i < base; i++) { + dataModel.append({"z": Math.random(), "x": Math.random(), "y": Math.random()}); + } +} diff --git a/tests/qmlperf/qmlperf.pro b/tests/qmlperf/qmlperf.pro new file mode 100644 index 00000000..6560f55c --- /dev/null +++ b/tests/qmlperf/qmlperf.pro @@ -0,0 +1,12 @@ +!include( ../tests.pri ) { + error( "Couldn't find the tests.pri file!" ) +} + +# The .cpp file which was generated for your project. Feel free to hack it. +SOURCES += main.cpp + +RESOURCES += qmlperf.qrc + +OTHER_FILES += doc/src/* \ + doc/images/* \ + qml/qmlperf/* diff --git a/tests/qmlperf/qmlperf.qrc b/tests/qmlperf/qmlperf.qrc new file mode 100644 index 00000000..e50815c5 --- /dev/null +++ b/tests/qmlperf/qmlperf.qrc @@ -0,0 +1,6 @@ + + + qml/qmlperf/main.qml + qml/qmlperf/script.js + + diff --git a/tests/tests.pro b/tests/tests.pro index e5364a0e..34ddb5e5 100644 --- a/tests/tests.pro +++ b/tests/tests.pro @@ -19,7 +19,8 @@ SUBDIRS += barstest \ qmlmultitest \ volumetrictest \ qmlvolume \ - auto + auto \ + qmlperf #SUBDIRS += kinectsurface -- cgit v1.2.3