]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/gui/mainwin.cpp
Added FPS counter.
[virtualjaguar] / src / gui / mainwin.cpp
index 6becf8eb13816b1b7eae77d4ec568ce2155a36a0..ba2c0dd2c4682025b5ac549581724e8f87d9939d 100644 (file)
@@ -89,6 +89,12 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        for(int i=0; i<8; i++)
                keyHeld[i] = false;
 
+       // FPS management
+       for(int i=0; i<RING_BUFFER_SIZE; i++)
+               ringBuffer[i] = 0;
+
+       ringBufferPointer = RING_BUFFER_SIZE - 1;
+
        videoWidget = new GLWidget(this);
        setCentralWidget(videoWidget);
        setWindowIcon(QIcon(":/res/vj-icon.png"));
@@ -539,13 +545,13 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state)
        {
                if (e->key() == (int)vjs.p1KeyBindings[i])
 //                     joypad_0_buttons[i] = (uint8)state;
-                       joypad_0_buttons[i] = (state ? 0x01 : 0x00);
+                       joypad0Buttons[i] = (state ? 0x01 : 0x00);
 
 // Pad #2 is screwing up pad #1. Prolly a problem in joystick.cpp...
 // So let's try to fix it there. :-P [DONE]
                if (e->key() == (int)vjs.p2KeyBindings[i])
 //                     joypad_1_buttons[i] = (uint8)state;
-                       joypad_1_buttons[i] = (state ? 0x01 : 0x00);
+                       joypad1Buttons[i] = (state ? 0x01 : 0x00);
        }
 }
 
@@ -557,10 +563,10 @@ void MainWin::HandleGamepads(void)
        for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++)
        {
                if (vjs.p1KeyBindings[i] & (JOY_BUTTON | JOY_HAT | JOY_AXIS))
-                       joypad_0_buttons[i] = (Gamepad::GetState(0, vjs.p1KeyBindings[i]) ? 0x01 : 0x00);
+                       joypad0Buttons[i] = (Gamepad::GetState(0, vjs.p1KeyBindings[i]) ? 0x01 : 0x00);
 
                if (vjs.p2KeyBindings[i] & (JOY_BUTTON | JOY_HAT | JOY_AXIS))
-                       joypad_1_buttons[i] = (Gamepad::GetState(1, vjs.p2KeyBindings[i]) ? 0x01 : 0x00);
+                       joypad1Buttons[i] = (Gamepad::GetState(1, vjs.p2KeyBindings[i]) ? 0x01 : 0x00);
        }
 }
 
@@ -674,6 +680,36 @@ void MainWin::Timer(void)
        }
 
        videoWidget->updateGL();
+
+#if 1
+       // FPS handling
+       // Approach: We use a ring buffer to store timestamps over a given amount
+       // of frames, then sum them to figure out the FPS.
+       uint32_t timestamp = SDL_GetTicks();
+       // This assumes the ring buffer size is a power of 2
+       ringBufferPointer = (ringBufferPointer + 1) & (RING_BUFFER_SIZE - 1);
+       ringBuffer[ringBufferPointer] = timestamp - oldTimestamp;
+       uint32_t elapsedTime = 0;
+
+       for(uint32_t i=0; i<RING_BUFFER_SIZE; i++)
+               elapsedTime += ringBuffer[i];
+
+       // elapsedTime must be non-zero
+       if (elapsedTime == 0)
+               elapsedTime = 1;
+
+#if 0
+       float framesPerSecond = ((float)RING_BUFFER_SIZE / (float)elapsedTime) * 1000.0;
+       statusBar()->showMessage(QString("%1 FPS").arg(framesPerSecond));
+#else
+       // This is in frames per 10 seconds, so we can have 1 decimal
+       uint32_t framesPerSecond = (uint32_t)(((float)RING_BUFFER_SIZE / (float)elapsedTime) * 10000.0);
+       uint32_t fpsIntegerPart = framesPerSecond / 10;
+       uint32_t fpsDecimalPart = framesPerSecond % 10;
+       statusBar()->showMessage(QString("%1.%2 FPS").arg(fpsIntegerPart).arg(fpsDecimalPart));
+#endif
+       oldTimestamp = timestamp;
+#endif
 }