首页 > 其他分享 >实现获取当前帧率并在QML中显示

实现获取当前帧率并在QML中显示

时间:2024-12-16 17:23:22浏览次数:13  
标签:FpsCounter fps timer 获取 window QML 当前 include frameCount

// fpscounter.h
#ifndef FPSCOUNTER_H
#define FPSCOUNTER_H

#include <QObject>
#include <QQuickItem>
#include <QElapsedTimer>

class FpsCounter : public QQuickItem
{
Q_OBJECT
Q_PROPERTY(qreal fps READ fps NOTIFY fpsChanged)

public:
explicit FpsCounter(QQuickItem *parent = nullptr);
qreal fps() const { return m_fps; }

protected:
void timerEvent(QTimerEvent *event) override;
QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override;

signals:
void fpsChanged();

private:
qreal m_fps;
int m_frameCount;
QElapsedTimer m_timer;
};

#endif // FPSCOUNTER_H

 

 

 

// fpscounter.cpp
#include "fpscounter.h"
#include <QTimerEvent>

FpsCounter::FpsCounter(QQuickItem *parent)
: QQuickItem(parent)
, m_fps(0)
, m_frameCount(0)
{
setFlag(ItemHasContents);
m_timer.start();
startTimer(1000); // 每秒更新一次
}

void FpsCounter::timerEvent(QTimerEvent *event)
{
Q_UNUSED(event)
qreal elapsed = m_timer.elapsed() / 1000.0;
m_fps = m_frameCount / elapsed;
m_frameCount = 0;
m_timer.restart();
emit fpsChanged();
}

QSGNode *FpsCounter::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
{
m_frameCount++;
return oldNode;
}

 

注册 C++ 类到 QML:

// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "fpscounter.h"

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

qmlRegisterType<FpsCounter>("Custom", 1, 0, "FpsCounter");

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

return app.exec();
}

在 QML 中使用 C++ 实现:

// main.qml
import QtQuick 2.15
import QtQuick.Window 2.15
import Custom 1.0 // 导入自定义模块

Window {
visible: true
width: 640
height: 480
title: qsTr("FPS Counter")

FpsCounter {
id: fpsCounter
anchors.top: parent.top
anchors.left: parent.left
width: 100
height: 30

Text {
anchors.fill: parent
text: "FPS: " + Math.round(parent.fps)
color: "white"
}
}
}

 

 

另一种 C++ 实现方式(使用 QQuickWindow):

 

// fpscounter.h
class FpsCounter : public QObject
{
Q_OBJECT
Q_PROPERTY(qreal fps READ fps NOTIFY fpsChanged)

public:
explicit FpsCounter(QQuickWindow *window);
qreal fps() const { return m_fps; }

private slots:
void afterRendering();

signals:
void fpsChanged();

private:
QQuickWindow *m_window;
qreal m_fps;
int m_frameCount;
QElapsedTimer m_timer;
};

 

// fpscounter.cpp
FpsCounter::FpsCounter(QQuickWindow *window)
: QObject(window)
, m_window(window)
, m_fps(0)
, m_frameCount(0)
{
connect(window, &QQuickWindow::afterRendering, this, &FpsCounter::afterRendering);
m_timer.start();
}

void FpsCounter::afterRendering()
{
m_frameCount++;

if (m_timer.elapsed() >= 1000) {
m_fps = m_frameCount * 1000.0 / m_timer.elapsed();
m_frameCount = 0;
m_timer.restart();
emit fpsChanged();
}
}

 

纯qml 方法:

// FpsCounter.qml
import QtQuick 2.15

Item {
id: root
property real fps: 0
property int frameCount: 0
property real lastTime: Date.now()

Timer {
interval: 1000 // 每秒更新一次
repeat: true
running: true
onTriggered: {
var currentTime = Date.now()
var delta = (currentTime - lastTime) / 1000
fps = frameCount / delta
frameCount = 0
lastTime = currentTime
}
}

NumberAnimation {
running: true
loops: Animation.Infinite
onRunningChanged: frameCount++
}

Text {
text: "FPS: " + Math.round(fps)
color: "white"
}
}

标签:FpsCounter,fps,timer,获取,window,QML,当前,include,frameCount
From: https://www.cnblogs.com/lllion/p/18610643

相关文章

  • XSYL10103利用控件获取值也可以用自定义
    stringCKID=this._page.GetControlValue("btnCKMC");pu10103,btnCKMC是一个下拉框namespaceXSYLKCGL{publicclassCKWLDY:ISuwfBus{///<summary>///initialization///</summary>privateSlnS......
  • qml 实现图片倒影效果
    Image{id:imgwidth:241height:241anchors{top:parent.toptopMargin:197left:parent.leftleftMargin:106}source:""fillMode:Ima......
  • 当前,inux中的内存页面调度算法
    用户:请详细介绍,目前linux中内存页面调度算法的相关信息讯飞星火:Linux内存页面调度算法是操作系统内存管理中的核心组件之一,它负责在有限的物理内存资源中高效地管理不同进程的页面,以减少页面置换的频率并提高系统性能。以下是对Linux内存页面调度算法的详细介绍:###1.概述Lin......
  • .Net Core 特性 获取Cookie,未登录跳转登录界面
    特性:usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.AspNetCore.Mvc.Filters;usingNewtonsoft.Json.Linq;usingSystem.Net;usingWaterCloud.Entity.SystemManage;namespaceOPAC.App_Start.Handler{publicclassAdminAuthorizeAttribute:TypeFilterAttr......
  • Windows系统-Python获取当前资源管理器路径及打开控制台、资源管理器到指定路径的方法
    Python获取当前资源管理器路径及打开控制台、资源管理器到指定路径的方法文章目录Python获取当前资源管理器路径及打开控制台、资源管理器到指定路径的方法获取资源管理器路径方法运行错误打开控制台到指定路径方法打开资源管理器到指定路径方法闲着没事还开发了个......
  • Vue3 - 最新实现在线预览Excel文件(xls/xlsx)多种方案,解析打开excel电子表格支持服务
    前言如果您需要Vue2版本,请访问这篇文章。在vue3项目开发中,详解实现预览excel表格功能,在浏览器中直接打开xls/xlsx文件并渲染效果,vue3预览excel文件教程,文件来源可以是在线url地址、前端调用api接口获取文件流(先下载)等,预览方式可以新开浏览器页签或者自定义弹框等......
  • 从 MySQL 获取数据,是从磁盘读取的吗?(buffer pool)
    从MySQL获取数据,是从磁盘读取的吗?(BufferPool)在MySQL中,数据是否从磁盘读取取决于数据是否已经被加载到内存中。MySQL使用InnoDB存储引擎中的BufferPool来优化磁盘I/O,减少从磁盘读取数据的次数,提高查询性能。BufferPool的工作原理缓存机制:BufferPool是Inno......
  • 性能测试-对当前环境磁盘读写能力的检查
    1.1检查当前磁盘的使用情况[root@master~]#df文件系统1K-块已用可用已用%挂载点devtmpfs2001044020010440%/devtmpfs2013080020130800%/dev/shmtmpfs......
  • JAVA学习-练习试用Java实现“从用户输入获取一个整数n,并打印出一个n*n的空心正方形”
    问题:编写一个Java程序,从用户输入获取一个整数n,并打印出一个n*n的空心正方形。解答思路:以下是一个Java程序,它从用户输入获取一个整数'n',然后打印出一个'n*n'的空心正方形:importjava.util.Scanner;publicclassHollowSquare{publicstaticvoidmain(String[]ar......
  • 如何在PbootCMS中获取搜索页的关键词和搜索结果数量?
    在PbootCMS中,你可以通过特定的标签来获取搜索页的关键词和搜索结果的数量。以下是如何使用这些标签的详细说明和一些扩展建议:获取搜索关键词:在搜索页模板search.html中,使用标签{$get.keyword}来获取用户输入的搜索关键词。例如:html <h1>搜索结果:{$get.keyword}</h1>......