mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-02-17 17:41:23 +00:00
- implement vid_maxfps
This commit is contained in:
parent
b40983be61
commit
9f758b0032
2 changed files with 43 additions and 0 deletions
|
@ -59,10 +59,14 @@
|
||||||
#include "vulkan/system/vk_swapchain.h"
|
#include "vulkan/system/vk_swapchain.h"
|
||||||
#include "doomerrors.h"
|
#include "doomerrors.h"
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
void Draw2D(F2DDrawer *drawer, FRenderState &state);
|
void Draw2D(F2DDrawer *drawer, FRenderState &state);
|
||||||
void DoWriteSavePic(FileWriter *file, ESSType ssformat, uint8_t *scr, int width, int height, sector_t *viewsector, bool upsidedown);
|
void DoWriteSavePic(FileWriter *file, ESSType ssformat, uint8_t *scr, int width, int height, sector_t *viewsector, bool upsidedown);
|
||||||
|
|
||||||
EXTERN_CVAR(Bool, vid_vsync)
|
EXTERN_CVAR(Bool, vid_vsync)
|
||||||
|
EXTERN_CVAR(Int, vid_maxfps)
|
||||||
EXTERN_CVAR(Bool, r_drawvoxels)
|
EXTERN_CVAR(Bool, r_drawvoxels)
|
||||||
EXTERN_CVAR(Int, gl_tonemap)
|
EXTERN_CVAR(Int, gl_tonemap)
|
||||||
EXTERN_CVAR(Int, screenblocks)
|
EXTERN_CVAR(Int, screenblocks)
|
||||||
|
@ -189,6 +193,8 @@ void VulkanFrameBuffer::Update()
|
||||||
|
|
||||||
Flush3D.Unclock();
|
Flush3D.Unclock();
|
||||||
|
|
||||||
|
FPSLimit();
|
||||||
|
|
||||||
Finish.Reset();
|
Finish.Reset();
|
||||||
Finish.Clock();
|
Finish.Clock();
|
||||||
|
|
||||||
|
@ -217,6 +223,40 @@ void VulkanFrameBuffer::Update()
|
||||||
Super::Update();
|
Super::Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VulkanFrameBuffer::FPSLimit()
|
||||||
|
{
|
||||||
|
using namespace std::chrono;
|
||||||
|
using namespace std::this_thread;
|
||||||
|
|
||||||
|
if (vid_maxfps <= 0 || vid_vsync)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint64_t targetWakeTime = fpsLimitTime + 1'000'000 / vid_maxfps;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
fpsLimitTime = duration_cast<microseconds>(steady_clock::now().time_since_epoch()).count();
|
||||||
|
int64_t timeToWait = targetWakeTime - fpsLimitTime;
|
||||||
|
|
||||||
|
if (timeToWait > 1'000'000 || timeToWait <= 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeToWait <= 2'000'000)
|
||||||
|
{
|
||||||
|
// We are too close to the deadline. OS sleep is not precise enough to wake us before it elapses.
|
||||||
|
// Yield execution and check time again.
|
||||||
|
sleep_for(nanoseconds(0));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Sleep, but try to wake before deadline.
|
||||||
|
sleep_for(milliseconds(timeToWait - 1'000'000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VulkanFrameBuffer::DeleteFrameObjects()
|
void VulkanFrameBuffer::DeleteFrameObjects()
|
||||||
{
|
{
|
||||||
FrameDeleteList.Images.clear();
|
FrameDeleteList.Images.clear();
|
||||||
|
|
|
@ -107,6 +107,7 @@ private:
|
||||||
void CopyScreenToBuffer(int w, int h, void *data);
|
void CopyScreenToBuffer(int w, int h, void *data);
|
||||||
void UpdateShadowMap();
|
void UpdateShadowMap();
|
||||||
void DeleteFrameObjects();
|
void DeleteFrameObjects();
|
||||||
|
void FPSLimit();
|
||||||
|
|
||||||
std::unique_ptr<VkShaderManager> mShaderManager;
|
std::unique_ptr<VkShaderManager> mShaderManager;
|
||||||
std::unique_ptr<VkSamplerManager> mSamplerManager;
|
std::unique_ptr<VkSamplerManager> mSamplerManager;
|
||||||
|
@ -131,6 +132,8 @@ private:
|
||||||
|
|
||||||
int lastSwapWidth = 0;
|
int lastSwapWidth = 0;
|
||||||
int lastSwapHeight = 0;
|
int lastSwapHeight = 0;
|
||||||
|
|
||||||
|
uint64_t fpsLimitTime = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline VulkanFrameBuffer *GetVulkanFrameBuffer() { return static_cast<VulkanFrameBuffer*>(screen); }
|
inline VulkanFrameBuffer *GetVulkanFrameBuffer() { return static_cast<VulkanFrameBuffer*>(screen); }
|
||||||
|
|
Loading…
Reference in a new issue