221 lines · 6.3 KB · Text
RawDownload
import QtQuick 2.5import QtQuick.Controls 1.4import Qt.labs.settings 1.0 Rectangle {    id: root    width: parent ? parent.width : 100    height: parent ? parent.height : 100                signal sendToScript(var message);    property var values: [];    property alias destination: addressLine.text    readonly property string nullDestination: "169.254.0.1"    property bool running: false     function statusReport() {        console.log("PERF status connected: " + AddressManager.isConnected);    }        Timer {        id: readyStateTimer        interval: 500        repeat: true        running: false        onTriggered: {            if (!root.running) {                stop();                return;            }             if (AddressManager.isConnected) {                console.log("PERF already connected, disconnecting");                AddressManager.handleLookupString(root.nullDestination);                return;            }                        stop();            console.log("PERF disconnected, moving to target " + root.destination);            AddressManager.handleLookupString(root.destination);             // If we've arrived, start running the test            console.log("PERF starting timers and frame timing");            FrameTimings.start();            rotationTimer.start();            stopTimer.start();        }    }      function startTest() {        console.log("PERF startTest()");        if (!root.running) {            root.running = true            readyStateTimer.start();        }    }     function stopTest() {        console.log("PERF stopTest()");        if (root.running) {            root.running = false;            stopTimer.stop();            rotationTimer.stop();            FrameTimings.finish();            root.values = FrameTimings.getValues();            AddressManager.handleLookupString(root.nullDestination);            resultGraph.requestPaint();            console.log("PERF Value Count: " + root.values.length);            console.log("PERF Max: " + FrameTimings.max);            console.log("PERF Min: " + FrameTimings.min);            console.log("PERF Avg: " + FrameTimings.mean);            console.log("PERF StdDev: " + FrameTimings.standardDeviation);        }    }     function yaw(a) {        var y = -Math.sin( a / 2.0 );        var w = Math.cos( a / 2.0 );        var l = Math.sqrt((y * y) + (w * w));        return Qt.quaternion(w / l, 0, y / l, 0);    }     function rotate() {        MyAvatar.setOrientationVar(yaw(Date.now() / 1000));    }      Timer {        id: stopTimer        interval: 30 * 1000        repeat: false        running: false        onTriggered: stopTest();    }     Timer {        id: rotationTimer        interval: 100        repeat: true        running: false        onTriggered: rotate();    }     Row {        id: row        anchors { left: parent.left; right: parent.right; top: parent.top; margins: 16 }        spacing: 8        Button {            text: root.running ? "Stop" : "Run"            onClicked: root.running ? stopTest() : startTest();        }        Button {            text: "Disconnect"            onClicked: AddressManager.handleLookupString(root.nullDestination);        }        Button {            text: "Connect"            onClicked: AddressManager.handleLookupString(root.destination);        }        Button {            text: "Status"            onClicked: statusReport();        }    }     TextField {        id: addressLine        anchors {             left: parent.left; right: parent.right;            top: row.bottom; margins: 16;         }        text: "Playa"        onTextChanged: console.log("PERF new target " + text);    }     Settings {        category: "Qml.Performance.RenderTest"        property alias destination: addressLine.text    }  //    Rectangle {//        anchors { left: parent.left; right: parent.right; top: row.bottom; topMargin: 8; bottom: parent.bottom; }//        //anchors.fill: parent//        color: "#7fff0000"//    }     // Return the maximum value from a set of values    function vv(i, max) {        var perValue = values.length / max;        var start = Math.floor(perValue * i);        var end = Math.min(values.length, Math.floor(start + perValue));        var result = 0;        for (var j = start; j <= end; ++j) {            result = Math.max(result, values[j]);        }        return result;    }     Canvas {        id: resultGraph        anchors { left: parent.left; right: parent.right; top: addressLine.bottom; margins: 16; bottom: parent.bottom; }        property real maxValue: 200;        property real perFrame: 10000;        property real k1: (5 / maxValue) * height;        property real k2: (10 / maxValue) * height;        property real k3: (100 / maxValue) * height;         onPaint: {            var ctx = getContext("2d");            if (values.length === 0) {                ctx.fillStyle = Qt.rgba(1, 0, 0, 1);                ctx.fillRect(0, 0, width, height);                return;            }              //ctx.setTransform(1, 0, 0, -1, 0, 0);            ctx.fillStyle = Qt.rgba(0, 0, 0, 1);            ctx.fillRect(0, 0, width, height);             ctx.strokeStyle= "gray";            ctx.lineWidth="1";            ctx.beginPath();            for (var i = 0; i < width; ++i) {                var value = vv(i, width); //values[Math.min(i, values.length - 1)];                value /= 10000;                value /= maxValue;                ctx.moveTo(i, height);                ctx.lineTo(i, height - (height * value));            }            ctx.stroke();             ctx.strokeStyle= "green";            ctx.lineWidth="2";            ctx.beginPath();            var lineHeight = height - k1;            ctx.moveTo(0, lineHeight);            ctx.lineTo(width, lineHeight);            ctx.stroke();             ctx.strokeStyle= "yellow";            ctx.lineWidth="2";            ctx.beginPath();            lineHeight = height - k2;            ctx.moveTo(0, lineHeight);            ctx.lineTo(width, lineHeight);            ctx.stroke();             ctx.strokeStyle= "red";            ctx.lineWidth="2";            ctx.beginPath();            lineHeight = height - k3;            ctx.moveTo(0, lineHeight);            ctx.lineTo(width, lineHeight);            ctx.stroke();         }    }}