修复计时更新不准确导致画面渲染卡帧的BUG

This commit is contained in:
Nomango 2018-05-31 01:22:41 +08:00
parent 7a28ddace2
commit 2def0e2794
2 changed files with 16 additions and 25 deletions

View File

@ -159,21 +159,19 @@ void e2d::Game::start(bool autoRelease/* true */)
// 判断是否达到了刷新状态 // 判断是否达到了刷新状态
if (Time::__isReady()) if (Time::__isReady())
{
Timer::__update(); // 定时器管理器执行程序
ActionManager::__update(); // 动作管理器执行程序
while (Time::__isReady())
{ {
Input::__update(); // 获取用户输入 Input::__update(); // 获取用户输入
Timer::__update(); // 更新定时器
ActionManager::__update(); // 更新动作管理器
SceneManager::__update(); // 更新场景内容 SceneManager::__update(); // 更新场景内容
Time::__updateLast(); // 刷新时间信息
}
Renderer::__render(); // 渲染游戏画面 Renderer::__render(); // 渲染游戏画面
GC::__update(); // 刷新内存池
Time::__updateLast(); // 刷新时间信息
} }
else else
{ {
Time::__sleep(); // 挂起线程 Time::__sleep(); // 挂起线程
GC::__update(); // 刷新内存池
} }
} }

View File

@ -9,14 +9,10 @@ static steady_clock::time_point s_tStart;
// 当前时间 // 当前时间
static steady_clock::time_point s_tNow; static steady_clock::time_point s_tNow;
// 上一帧刷新时间 // 上一帧刷新时间
static steady_clock::time_point s_tFixedUpdate;
// 上一次更新时间
static steady_clock::time_point s_tLastUpdate; static steady_clock::time_point s_tLastUpdate;
// 每一帧间隔 // 每一帧间隔
static milliseconds s_tExceptedInvertal; static milliseconds s_tExceptedInvertal;
// 上一帧与当前帧的时间间隔
static unsigned int s_nInterval = 0;
// 游戏开始时长 // 游戏开始时长
static unsigned int s_nTotalTime = 0; static unsigned int s_nTotalTime = 0;
@ -33,24 +29,24 @@ unsigned int e2d::Time::getTotalTimeMilliseconds()
double e2d::Time::getDeltaTime() double e2d::Time::getDeltaTime()
{ {
return s_nInterval / 1000.0; return s_tExceptedInvertal.count() / 1000.0;
} }
unsigned int e2d::Time::getDeltaTimeMilliseconds() unsigned int e2d::Time::getDeltaTimeMilliseconds()
{ {
return s_nInterval; return static_cast<unsigned int>(s_tExceptedInvertal.count());
} }
bool e2d::Time::__init() bool e2d::Time::__init()
{ {
s_tStart = s_tLastUpdate = s_tFixedUpdate = s_tNow = steady_clock::now(); s_tStart = s_tLastUpdate = s_tNow = steady_clock::now();
s_tExceptedInvertal = milliseconds(15); s_tExceptedInvertal = milliseconds(15);
return true; return true;
} }
bool e2d::Time::__isReady() bool e2d::Time::__isReady()
{ {
return s_tExceptedInvertal < duration_cast<milliseconds>(s_tNow - s_tFixedUpdate); return s_tExceptedInvertal < duration_cast<milliseconds>(s_tNow - s_tLastUpdate);
} }
void e2d::Time::__updateNow() void e2d::Time::__updateNow()
@ -61,25 +57,22 @@ void e2d::Time::__updateNow()
void e2d::Time::__updateLast() void e2d::Time::__updateLast()
{ {
s_tFixedUpdate += s_tExceptedInvertal; s_tLastUpdate += s_tExceptedInvertal;
s_tLastUpdate = s_tNow;
s_tNow = steady_clock::now(); s_tNow = steady_clock::now();
s_nInterval = static_cast<unsigned int>(duration_cast<milliseconds>(s_tNow - s_tLastUpdate).count());
s_nTotalTime = static_cast<unsigned int>(duration_cast<milliseconds>(s_tNow - s_tStart).count()); s_nTotalTime = static_cast<unsigned int>(duration_cast<milliseconds>(s_tNow - s_tStart).count());
} }
void e2d::Time::__reset() void e2d::Time::__reset()
{ {
s_tLastUpdate = s_tFixedUpdate = s_tNow = steady_clock::now(); s_tLastUpdate = s_tNow = steady_clock::now();
s_nInterval = 0;
s_nTotalTime = static_cast<unsigned int>(duration_cast<milliseconds>(s_tNow - s_tStart).count()); s_nTotalTime = static_cast<unsigned int>(duration_cast<milliseconds>(s_tNow - s_tStart).count());
} }
void e2d::Time::__sleep() void e2d::Time::__sleep()
{ {
// 计算挂起时长 // 计算挂起时长
int nWaitMS = 16 - static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tFixedUpdate).count()); int nWaitMS = 16 - static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tLastUpdate).count());
if (nWaitMS > 1) if (nWaitMS > 1)
{ {