Вы должны создать свой собственный FPS QQuickItem (или QQuickPaintedItem) и зарегистрировать в вашем main.cpp быть доступный в вашем QML-коде.
Вот пример.
class FPSText: public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(int fps READ fps NOTIFY fpsChanged)
public:
FPSText(QQuickItem *parent = 0);
~FPSText();
void paint(QPainter *);
Q_INVOKABLE int fps()const;
signals:
void fpsChanged(int);
private:
void recalculateFPS();
int _currentFPS;
int _cacheCount;
QVector<qint64> _times;
};
FPSText::FPSText(QQuickItem *parent): QQuickPaintedItem(parent), _currentFPS(0), _cacheCount(0)
{
_times.clear();
setFlag(QQuickItem::ItemHasContents);
}
FPSText::~FPSText()
{
}
void FPSText::recalculateFPS()
{
qint64 currentTime = QDateTime::currentDateTime().toMSecsSinceEpoch();
_times.push_back(currentTime);
while (_times[0] < currentTime - 1000) {
_times.pop_front();
}
int currentCount = _times.length();
_currentFPS = (currentCount + _cacheCount)/2;
qDebug() << _currentFPS;
if (currentCount != _cacheCount) fpsChanged(_currentFPS);
_cacheCount = currentCount;
}
int FPSText::fps()const
{
return _currentFPS;
}
void FPSText::paint(QPainter *painter)
{
recalculateFPS();
//qDebug() << __FUNCTION__;
QBrush brush(Qt::yellow);
painter->setBrush(brush);
painter->setPen(Qt::NoPen);
painter->setRenderHint(QPainter::Antialiasing);
painter->drawRoundedRect(0, 0, boundingRect().width(), boundingRect().height(), 0, 0);
update();
}
QML:
FPSText{
id: fps_text
x:0
y: 0;
width: 200
height: 100
Text {
anchors.centerIn: parent
text: fps_text.fps.toFixed(2)
}
}
Вы можете получить любую другую реализацию в Интернете с быстрым поиском.
большое спасибо! Кажется, это работает. Является ли число, показанное показателем fps всего вида/приложения, или только окрашенного прямоугольника? Не могли бы вы дать краткое объяснение того, как это работает? – luffy
@luffy FPSText управляется графиком сцены QML: http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html, а точка над кодом для раскладки каждого кадра - FPSText :: update() http://doc.qt.io/qt-5/qquickpainteditem.html#update –
Исправьте меня, если я ошибаюсь, но .. Это потенциально создаст бесконечный цикл с учетом утечки ресурсов. –