DelayFPS 函数于 24/01/31 更新

- DelayFPS 于 24/01/31 更新
- 此次更新对这个函数进行改动,其目的是解决多线程使用时引发的问题,并提高精度
- 同时将 HpSleep(delay); 改为 std::this_thread::sleep_for(std::chrono::milliseconds(delay)); 有助于进一步提高精度
- this_thread::sleep_for 函数存在问题,据 https://developercommunity.visualstudio.com/t/Modifying-the-system-time-to-the-past-s/10476559 中,一对此函数进行修复,请确认 MSVC 版本以避免错误
- 使用模板
```cpp
static hiex::tDelayFPS recond;
hiex::DelayFPS(recond, 24);
```
- 或是在循环上一级定义 hiex::tDelayFPS recond; 需要确保每个线程中有自己的 tDelayFPS,多个线程不能使用同一个 tDelayFPS
This commit is contained in:
Alan-CRL 2024-01-31 09:57:44 +08:00 committed by GitHub
parent 5848ce7da2
commit 329dceb326
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 58 additions and 30 deletions

View File

@ -1,14 +1,20 @@
#include "HiFPS.h"
#include "HiFunc.h"
#include <time.h>
namespace HiEasyX
{
clock_t tRecord = 0;
void DelayFPS(int fps, bool wait_long)
tDelayFPS::tDelayFPS() : tRecord(0) {}
// DelayFPS 于 24/01/31 更新
// 此次更新对这个函数进行改动,其目的是解决多线程使用时引发的问题,并提高精度
// 同时将 HpSleep(delay); 改为 std::this_thread::sleep_for(std::chrono::milliseconds(delay)); 有助于进一步提高精度
// this_thread::sleep_for 函数存在问题,据 https://developercommunity.visualstudio.com/t/Modifying-the-system-time-to-the-past-s/10476559 中,一对此函数进行修复,请确认 MSVC 版本以避免错误
// 使用模板
/*
static hiex::tDelayFPS recond;
hiex::DelayFPS(recond, 24);
*/
// 或是在循环上一级定义 hiex::tDelayFPS recond; 需要确保每个线程中有自己的 tDelayFPS多个线程不能使用同一个 tDelayFPS
void DelayFPS(tDelayFPS& Record, int fps, bool wait_long)
{
if (wait_long)
{
@ -17,15 +23,15 @@ namespace HiEasyX
}
clock_t tNow = clock();
if (tRecord)
if (Record.tRecord)
{
int delay = 1000 / fps - (tNow - tRecord);
int delay = 1000 / fps - (tNow - Record.tRecord);
if (delay > 0)
{
HpSleep(delay);
std::this_thread::sleep_for(std::chrono::milliseconds(delay));
//HpSleep(delay);
}
}
tRecord = clock();
Record.tRecord = clock();
}
};
};

View File

@ -1,17 +1,39 @@
/**
* @file HiFPS.h
* @brief HiEasyX
* @author huidong
*/
#pragma once
namespace HiEasyX
{
/**
* @brief
* @param[in] fps
* @param[in] wait_long
*/
void DelayFPS(int fps, bool wait_long = false);
};
/**
* @file HiFPS.h
* @brief HiEasyX
* @author huidong
*/
#pragma once
#include "HiFunc.h"
#include <ctime>
#include <thread>
namespace HiEasyX
{
struct tDelayFPS
{
clock_t tRecord;
tDelayFPS(); // 声明构造函数,定义将在 HiFPS.cpp 中进行
};
/**
* @brief
* @param[in] fps
* @param[in] wait_long
*/
// DelayFPS 于 24/01/31 更新
// 此次更新对这个函数进行改动,其目的是解决多线程使用时引发的问题,并提高精度
// 同时将 HpSleep(delay); 改为 std::this_thread::sleep_for(std::chrono::milliseconds(delay)); 有助于进一步提高精度
// this_thread::sleep_for 函数存在问题,据 https://developercommunity.visualstudio.com/t/Modifying-the-system-time-to-the-past-s/10476559 中,一对此函数进行修复,请确认 MSVC 版本以避免错误
// 使用模板
/*
static hiex::tDelayFPS recond;
hiex::DelayFPS(recond, 24);
*/
// 或是在循环上一级定义 hiex::tDelayFPS recond; 需要确保每个线程中有自己的 tDelayFPS多个线程不能使用同一个 tDelayFPS
void DelayFPS(tDelayFPS& Record, int fps, bool wait_long = false);
};