如何在c++ /Qt中设置30fps循环

How to set up a 30fps loop in C++/Qt

本文关键字:设置 30fps 循环 Qt c++      更新时间:2023-10-16

我目前正在用Qt在c++中为学校开发一个小型游戏/模拟,我有一些Java背景。我的问题是如何设置一个基本的游戏循环与Qt在800/600窗口。我试图绘制到一个GraphicsView-window与覆盖的paintEvent,但我不能设置这样的循环,我有某种错误与覆盖它。

#include "mainwindow.h"
#include <QGraphicsView>
#include "graphicsview.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    resize(800, 600);
    setWindowTitle("A* Pathfinder");
    gView = new GraphicsView(this);
    setCentralWidget(gView);
}
MainWindow::~MainWindow()
{
}

GraphicsView-class:

#include "graphicsView.h"
void GraphicsView::paintEvent(QPaintEvent *event) {
    QPainter painter(this);
    painter.drawLine(10,10, 100,100);
}

graphicsView.h:

#ifndef GRAPHICSVIEW_H
#define GRAPHICSVIEW_H
#endif // GRAPHICSVIEW_H
#include <QGraphicsView>
class GraphicsView : public QGraphicsView
{
  protected:
    void paintEvent(QPaintEvent *event);
};

抱歉,如果类似的问题已经问了,但我真的卡住了,不能找到我的具体情况的帮助。同样,我想要一个800x600的窗口,我可以在其中以30fps绘制图形。

首先,您正在朝着错误的方向前进-您不需要覆盖QGraphicsView,一个股票就足够了。您不需要重写paintEvent() -它不会做您认为它做的事情。你不渲染你的场景在那里,这是代码只渲染帧的视图-如何空视图看起来,而不是视图包含什么。

如果你有自定义绘图,而不是由库存图形项目(如矩形,文本,弧线等)提供,你需要实现自己的QGraphicsItem并实现其paint()功能-这就是它的工作方式,每个项目负责其绘画,场景只是管理所有项目,视图只是可视化场景。

你肯定不希望计时器以固定速率发射,这是一个非常幼稚和糟糕的解决方案。它没有考虑到渲染和游戏逻辑处理所花费的时间,如果你想要一个稳定的帧率,你就需要考虑到这些变量。

30 FPS意味着你必须每33.33毫秒生成一帧。所以你需要根据前一帧所花的时间来安排接下来的每一帧。例如,如果上一帧花了15毫秒,你需要在33.33 - 15毫秒内调度下一帧,实现更细粒度的控制和更稳定的帧率,只要你的CPU能跟上。

您可以使用静态函数QTimer::singleShot()以自定义间隔调度每个后续帧。