gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:37:41 24 4
gpt4 key购买 nike

我目前正在使用 Qt 使用 C++ 为学校开发一个小型游戏/模拟,我有一些 Java 背景。我的问题是如何在 800/600 窗口中使用 Qt 设置基本游戏循环。我尝试通过覆盖 paintEvent 绘制到 GraphicsView 窗口中,但我无法设置这样的循环,并且我在覆盖它时遇到了某种错误。

#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 类:

#include "graphicsView.h"

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

图形 View .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() - 它不会按照您的想法进行操作。您不会在那里渲染场景,那是只渲染 View 框架的代码 - 空 View 的外观,而不是 View 包含的内容。

如果您有自定义绘图,而库存图形项(例如矩形、文本、弧形等等)没有提供您需要实现您自己的 QGraphicsItem 并实现它的 paint() 函数 - 这就是它的工作原理,每个项目负责其绘画,场景只是管理所有项目, View 只是将场景可视化。

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

30 FPS 意味着您必须每 33.33 毫秒生成一个帧。因此,您需要根据前一帧花费的时间安排每个后续帧。例如,如果上一帧耗时 15 毫秒,您需要将下一帧安排在 33.33 - 15 毫秒内,只要您的 CPU 跟得上,就可以实现更细粒度的控制和更稳定的帧速率。

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

关于c++ - 如何在 C++/Qt 中设置 30fps 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40075382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com