From 7994c5dbf0ace6ac7197a3c5edcc6e00136991d7 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 29 Jun 2021 10:26:47 +0200 Subject: [PATCH] Fixing framerate for the update interval --- sources/Renderer/QtRenderer/QtSFML.cpp | 28 +++++++++---------- sources/Renderer/QtRenderer/QtSFML.hpp | 4 +-- .../QtRenderer/QtSfmlTileRenderer.cpp | 2 +- .../QtRenderer/QtSfmlTileRenderer.hpp | 4 +-- sources/Renderer/QtRenderer/QtWidgetSFML.cpp | 8 +++--- sources/Renderer/QtRenderer/QtWidgetSFML.hpp | 13 ++++----- sources/SNES.cpp | 1 - 7 files changed, 29 insertions(+), 31 deletions(-) diff --git a/sources/Renderer/QtRenderer/QtSFML.cpp b/sources/Renderer/QtRenderer/QtSFML.cpp index 48bbfae..e61d893 100644 --- a/sources/Renderer/QtRenderer/QtSFML.cpp +++ b/sources/Renderer/QtRenderer/QtSFML.cpp @@ -8,7 +8,6 @@ #include #include #include "SNES.hpp" -#include "../../Exceptions/DebuggableError.hpp" #include "QtSFML.hpp" #ifdef Q_WS_X11 @@ -19,13 +18,14 @@ namespace ComSquare::Renderer { QtSFML::QtSFML(QWidget *parentWidget) - : _window(parentWidget), _sfWidget(nullptr) + : _window(parentWidget), + _sfWidget(nullptr) { } void QtSFML::createWindow(SNES &snes, int maxFPS) { - this->_sfWidget = std::make_unique(snes, this->_window, QPoint(0, 0), QSize(this->_window->width(), this->_window->height()), maxFPS); + this->_sfWidget = new QtFullSFML(snes, this->_window, QPoint(0, 0), QSize(this->_window->width(), this->_window->height()), maxFPS); } void QtSFML::putPixel(unsigned y, unsigned x, uint32_t rgba) @@ -50,7 +50,7 @@ namespace ComSquare::Renderer _snes(snes) { } - void QtFullSFML::_onUpdate() + void QtFullSFML::onUpdate() { try { this->_snes.update(); @@ -119,7 +119,7 @@ namespace ComSquare::Renderer { QtSFML::createWindow(snes, maxFPS); this->setWindowName(snes.cartridge->header.gameName); - this->_window.setCentralWidget(this->_sfWidget.get()); + this->_window.setCentralWidget(this->_sfWidget); QMenu *file = this->_window.menuBar()->addMenu("&File"); //TODO implement rom opening from this menu. @@ -127,7 +127,7 @@ namespace ComSquare::Renderer QMenu *game = this->_window.menuBar()->addMenu("&Game"); QAction *reset = new QAction("Reset", &this->_window); - QMainWindow::connect(reset, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::reset); + QMainWindow::connect(reset, &QAction::triggered, this->_sfWidget, &QtFullSFML::reset); game->addAction(reset); @@ -135,42 +135,42 @@ namespace ComSquare::Renderer QMenu *debugger = this->_window.menuBar()->addMenu("&Debugger"); QAction *cpuDebugger = new QAction("CPU's Debugger", &this->_window); cpuDebugger->setShortcut(Qt::Key_F1); - QMainWindow::connect(cpuDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableDebugCPU); + QMainWindow::connect(cpuDebugger, &QAction::triggered, this->_sfWidget, &QtFullSFML::enableDebugCPU); debugger->addAction(cpuDebugger); QAction *ramViewer = new QAction("Memory viewer", &this->_window); ramViewer->setShortcut(Qt::Key_F2); - QMainWindow::connect(ramViewer, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableRamViewer); + QMainWindow::connect(ramViewer, &QAction::triggered, this->_sfWidget, &QtFullSFML::enableRamViewer); debugger->addAction(ramViewer); QAction *headerViewer = new QAction("Header viewer", &this->_window); headerViewer->setShortcut(Qt::Key_F3); - QMainWindow::connect(headerViewer, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableHeaderViewer); + QMainWindow::connect(headerViewer, &QAction::triggered, this->_sfWidget, &QtFullSFML::enableHeaderViewer); debugger->addAction(headerViewer); QAction *apuDebugger = new QAction("APU's Debugger", &this->_window); apuDebugger->setShortcut(Qt::Key_F4); - QMainWindow::connect(apuDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableDebugAPU); + QMainWindow::connect(apuDebugger, &QAction::triggered, this->_sfWidget, &QtFullSFML::enableDebugAPU); debugger->addAction(apuDebugger); QAction *busDebugger = new QAction("Memory bus Viewer", &this->_window); busDebugger->setShortcut(Qt::Key_F5); - QMainWindow::connect(busDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableDebugBus); + QMainWindow::connect(busDebugger, &QAction::triggered, this->_sfWidget, &QtFullSFML::enableDebugBus); debugger->addAction(busDebugger); QAction *cgramDebugger = new QAction("Palette Viewer", &this->_window); cgramDebugger->setShortcut(Qt::Key_F6); - QMainWindow::connect(cgramDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableCgramViewer); + QMainWindow::connect(cgramDebugger, &QAction::triggered, this->_sfWidget, &QtFullSFML::enableCgramViewer); debugger->addAction(cgramDebugger); QAction *registerDebugger = new QAction("Registers Viewer", &this->_window); registerDebugger->setShortcut(Qt::Key_F7); - QMainWindow::connect(registerDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableRegisterViewer); + QMainWindow::connect(registerDebugger, &QAction::triggered, this->_sfWidget, &QtFullSFML::enableRegisterViewer); debugger->addAction(registerDebugger); QAction *tileDebugger = new QAction("Tile Viewer", &this->_window); tileDebugger->setShortcut(Qt::Key_F8); - QMainWindow::connect(tileDebugger, &QAction::triggered, this->_sfWidget.get(), &QtFullSFML::enableTileViewer); + QMainWindow::connect(tileDebugger, &QAction::triggered, this->_sfWidget, &QtFullSFML::enableTileViewer); debugger->addAction(tileDebugger); this->_window.show(); diff --git a/sources/Renderer/QtRenderer/QtSFML.hpp b/sources/Renderer/QtRenderer/QtSFML.hpp index 565885c..4c41aa9 100644 --- a/sources/Renderer/QtRenderer/QtSFML.hpp +++ b/sources/Renderer/QtRenderer/QtSFML.hpp @@ -21,7 +21,7 @@ namespace ComSquare::Renderer private: //! @brief The snes to update. SNES &_snes; - void _onUpdate() override; + void onUpdate() override; public: //! @brief Action called when clicking on the enable CPU debugger button. void enableDebugCPU(); @@ -56,7 +56,7 @@ namespace ComSquare::Renderer QWidget *_window; protected: //! @brief The SFML widget. - std::unique_ptr _sfWidget = nullptr; + QtFullSFML *_sfWidget = nullptr; public: //! @brief Use this function to create the window. //! @param maxFPS The number of FPS you aim to run on. diff --git a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp index 782b3cc..25d0805 100644 --- a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp +++ b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.cpp @@ -15,7 +15,7 @@ namespace ComSquare::Renderer // todo the size of the sfml renderwindow should fill the parent } - void QtSFMLTileRenderer::_onUpdate() + void QtSFMLTileRenderer::onUpdate() { this->_window.clear(sf::Color::Black); for (unsigned long i = 0; i < this->buffer.size(); i++) { diff --git a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp index a3a95a9..d5076ac 100644 --- a/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp +++ b/sources/Renderer/QtRenderer/QtSfmlTileRenderer.hpp @@ -17,10 +17,10 @@ namespace ComSquare::Renderer std::array, 1024> buffer; //! @brief Function called to update this widget. - void _onUpdate() override; + void onUpdate() override; //! @brief ctor - explicit QtSFMLTileRenderer(QWidget* parent, int frameRate = 0); + explicit QtSFMLTileRenderer(QWidget* parent, int frameRate = 60); //! @brief copy ctor QtSFMLTileRenderer(const QtSFMLTileRenderer &) = delete; //! @brief default ctor diff --git a/sources/Renderer/QtRenderer/QtWidgetSFML.cpp b/sources/Renderer/QtRenderer/QtWidgetSFML.cpp index 8cdfe10..5a81096 100644 --- a/sources/Renderer/QtRenderer/QtWidgetSFML.cpp +++ b/sources/Renderer/QtRenderer/QtWidgetSFML.cpp @@ -17,8 +17,7 @@ namespace ComSquare::Renderer this->move(position); this->resize(size); - - this->_timer.setInterval(frameRate); + this->_timer.setInterval(1000 / frameRate); } void QtWidgetSFML::showEvent(QShowEvent *) @@ -30,9 +29,11 @@ namespace ComSquare::Renderer XFlush(QX11Info::display()); #endif this->_window.create((sf::WindowHandle)this->winId()); + this->_window.setFramerateLimit(60); this->_onInit(); - connect(&_timer, SIGNAL(timeout()), this, SLOT(repaint())); + this->_timer.setSingleShot(false); + connect(&_timer, SIGNAL(timeout()), this, SLOT(onUpdate())); this->_timer.start(); this->_isInitialized = true; } @@ -45,7 +46,6 @@ namespace ComSquare::Renderer void QtWidgetSFML::paintEvent(QPaintEvent *) { - this->_onUpdate(); this->drawScreen(); } diff --git a/sources/Renderer/QtRenderer/QtWidgetSFML.hpp b/sources/Renderer/QtRenderer/QtWidgetSFML.hpp index ce5c5c9..adc77af 100644 --- a/sources/Renderer/QtRenderer/QtWidgetSFML.hpp +++ b/sources/Renderer/QtRenderer/QtWidgetSFML.hpp @@ -2,8 +2,7 @@ // Created by anonymus-raccoon on 2/16/20. // -#ifndef COMSQUARE_QTWIDGETSFML_HPP -#define COMSQUARE_QTWIDGETSFML_HPP +#pragma once #include #include @@ -16,11 +15,13 @@ namespace ComSquare::Renderer { //! @brief A widget that you can put inside a QT application that render using the SFML. class QtWidgetSFML : public QWidget, public SFRenderer { + Q_OBJECT + public slots: + //! @brief Function called to update this widget. + virtual void onUpdate() = 0; private: //! @brief Function called when this widget is created. virtual void _onInit(); - //! @brief Function called to update this widget. - virtual void _onUpdate() = 0; //! @brief Qt internal paint engine (always null since we use a custom one) QPaintEngine* paintEngine() const override; //! @brief Used to create the SF window and bind it to the window manager of the user. @@ -38,6 +39,4 @@ namespace ComSquare::Renderer QtWidgetSFML &operator=(const QtWidgetSFML &) = delete; ~QtWidgetSFML() override = default; }; -} - -#endif //COMSQUARE_QTWIDGETSFML_HPP +} \ No newline at end of file diff --git a/sources/SNES.cpp b/sources/SNES.cpp index 5dc259f..e8b585c 100644 --- a/sources/SNES.cpp +++ b/sources/SNES.cpp @@ -3,7 +3,6 @@ // #include -#include #include "SNES.hpp" #ifdef DEBUGGER_ENABLED #include "Debugger/CPU/CPUDebug.hpp"