2013-10-14 3 views
3

У меня есть проблема со скоростью доступа к QList<qreal>. я заявил:Как ускорить доступ к QList <qreal> подвергается воздействию C++ на QML

Q_PROPERTY(QList<qreal> circlePointsX READ circlePointsX NOTIFY circlePointsXChanged); 
QList<qreal> circlePointsX(void) const 
{ 
    return mCirclePointsX; 
} 

и в QML файл, я сделал

pArea.circlesPointsX = paintAreaHelper.circlePointsX; 

и после того, что некоторый код читает по пунктам:

var cPointsX = circlesPointsX; 
    var cPointsY = circlesPointsY; 

    var noOfPoints = circlesPointsX.length - 4; 
    for (var i = 0; i <= noOfPoints; i+=4) 
    { 
     ctx.moveTo(cPointsX[i], cPointsY[i]); 
     ctx.lineTo(cPointsX[i+1], cPointsY[i+1]); 
     ctx.lineTo(cPointsX[i+2], cPointsY[i+2]); 
     ctx.lineTo(cPointsX[i+3], cPointsY[i+3]); 
     ctx.lineTo(cPointsX[i], cPointsY[i]); 
    } 

конечно тип собственности is var

property var circlesPointsX;@ 

и назначение:

var cPointsX = circlesPointsX; 

не ускорит ничего, потому что это просто скопировать ссылку.

Я отлаживал его, и для каждого обращения к одному циклу вызывается метод C++. Я хотел бы скопировать данные из C++ один раз и получить доступ к нему из «локальной копии qml» вместо вызова C++ getter каждый раз.

+0

Затем скопируйте его в переменную JS, находящуюся в «файле JS-кода» - доступ может стать быстрее (но имейте в виду, что vars в .js-файлах не подлежит никаким уведомлениям об изменениях и т. Д. - они являются простыми JS-данными). – mlvljr

ответ

3

documentation проливает некоторый свет на это:

Если последовательность подвергается как Q_PROPERTY, доступ к любому значению в последовательности по индексу вызовет последовательность данных для чтения от собственности QObject, в то читать. Аналогично, изменение любого значения в последовательности приведет к чтению данных последовательности, а затем будет выполнена модификация, и измененная последовательность будет записана обратно в свойство QObject.

Если последовательность возвращается из функции Q_INVOKABLE, доступ и мутация намного дешевле, так как никакое свойство QObject не считывается или не записывается; вместо этого данные последовательности C++ получают доступ и изменяются напрямую.

Итак, ваше решение объявить circlePointsX как:

Q_INVOKABLE QList<qreal> circlePointsX() const { return mCirclePointsX; } 

Вы должны уронить circlePoints свойство, или переименовать его в чем-то еще.

Nitpick: Ввод списка void в список параметров - это C-ism, который не имеет места в C++. Причиной этого в C было то, что void foo() эквивалентно void foo(...). В C++ это уже не так.