2016-02-22 27 views
7

Có cách "đơn giản" để hiển thị FPS (tốc độ khung hình) trong ứng dụng QML/C++ hay không. Tất cả các hình động và khung nhìn đều được thực hiện trong QML và logic ứng dụng nằm trong C++.Hiển thị FPS trong QML

Tôi đã cố gắng thiết lập QML_SHOW_FRAMERATE trong Linux trước khi bắt đầu ứng dụng nhưng nó không giúp:

export QML_SHOW_FRAMERATE=1 

Trả lời

5

Bạn phải tạo riêng của bạn FPS QQuickItem (hoặc QQuickPaintedItem) và đăng ký trong main.cpp của bạn sẽ được có sẵn trong mã QML của bạn.

Đây là một ví dụ.

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) 
      } 
    } 

Bạn có thể nhận được bất kỳ thi khác trong Internet với một tìm kiếm nhanh chóng.

+1

thank you very much! Điều này dường như hoạt động. Số được hiển thị đại diện cho khung hình/giây của toàn bộ khung nhìn/ứng dụng hay chỉ là hình chữ nhật được vẽ? Bạn có thể cung cấp giải thích nhanh về cách hoạt động không? – luffy

+1

@Phím FPSText được quản lý bởi Đồ thị cảnh QML: http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html và điểm trên mã ở trên để thu thập lại một khung hình là FPSText :: cập nhật() http://doc.qt.io/qt-5/qquickpainteditem.html#update –

+0

Khắc phục sự cố nếu tôi sai nhưng .. Điều này có khả năng sẽ tạo ra một vòng lặp vô hạn với sự cống hiến của việc rút tài nguyên. –

0

Bộ đếm FPS QML, mà không ảnh hưởng đến hiệu suất.

Dự án QNanoPainter và những người khác trong qt-lab đang sử dụng làm mới hoạt ảnh của Mặt hàng QML để tạo bộ đếm FPS. Nó rất dễ dàng để được thực hiện, kèm theo một dự án sử dụng kỹ thuật này (sửa đổi từ QNanoPainter FPS counter). đang

FpsItem:

import QtQuick 2.0 
import QtQuick.Window 2.2 

Rectangle { 
    id: root 
    property int frameCounter: 0 
    property int frameCounterAvg: 0 
    property int counter: 0 
    property int fps: 0 
    property int fpsAvg: 0 

    readonly property real dp: Screen.pixelDensity * 25.4/160 

    color: "black" 
    width: childrenRect.width + 10*dp; 
    height: childrenRect.height + 10*dp; 

    Image { 
     id: spinnerImage 
     anchors.verticalCenter: parent.verticalCenter 
     x: 4 * dp 
     width: 36 * dp 
     height: width 
     source: "images/spinner.png" 
     NumberAnimation on rotation { 
      from:0 
      to: 360 
      duration: 800 
      loops: Animation.Infinite 
     } 
     onRotationChanged: frameCounter++; 
    } 

    Text { 
     anchors.left: spinnerImage.right 
     anchors.leftMargin: 8 * dp 
     anchors.verticalCenter: spinnerImage.verticalCenter 
     color: "#c0c0c0" 
     font.pixelSize: 18 * dp 
     text: "Ø " + root.fpsAvg + " | " + root.fps + " fps" 
    } 

    Timer { 
     interval: 2000 
     repeat: true 
     running: true 
     onTriggered: { 
      frameCounterAvg += frameCounter; 
      root.fps = frameCounter/2; 
      counter++; 
      frameCounter = 0; 
      if (counter >= 3) { 
       root.fpsAvg = frameCounterAvg/(2*counter) 
       frameCounterAvg = 0; 
       counter = 0; 
      } 
     } 
    } 
} 

Sử dụng nó như:

import QtQuick 2.9 
import QtQuick.Window 2.2 

Window { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    FpsItem { 
     id: fpsItem 
     anchors.centerIn: parent 
    } 

}