修复FPS计算问题

This commit is contained in:
Nomango 2018-07-25 00:07:52 +08:00
parent eebd8efb54
commit 2d4e5ef60a
2 changed files with 45 additions and 38 deletions

View File

@ -37,8 +37,10 @@ void e2d::Renderer::destroyInstance()
} }
e2d::Renderer::Renderer() e2d::Renderer::Renderer()
: _lastRenderTime(0) : _lastRenderTime(Time::now())
, _renderTimes(0)
, _fpsFormat(nullptr) , _fpsFormat(nullptr)
, _fpsLayout(nullptr)
, _renderTarget(nullptr) , _renderTarget(nullptr)
, _solidBrush(nullptr) , _solidBrush(nullptr)
, _textRenderer(nullptr) , _textRenderer(nullptr)
@ -50,6 +52,7 @@ e2d::Renderer::Renderer()
e2d::Renderer::~Renderer() e2d::Renderer::~Renderer()
{ {
SafeRelease(_fpsFormat); SafeRelease(_fpsFormat);
SafeRelease(_fpsLayout);
SafeRelease(_textRenderer); SafeRelease(_textRenderer);
SafeRelease(_solidBrush); SafeRelease(_solidBrush);
SafeRelease(_renderTarget); SafeRelease(_renderTarget);
@ -104,12 +107,15 @@ void e2d::Renderer::render()
void e2d::Renderer::_renderFps() void e2d::Renderer::_renderFps()
{ {
double duration = Game::getInstance()->getTotalDuration().seconds(); ++_renderTimes;
if (duration == _lastRenderTime)
return;
String fpsText = String::format(L"FPS: %.1lf", (1.0 / (duration - _lastRenderTime))); auto& now = Time::now();
_lastRenderTime = duration; int duration = (now - _lastRenderTime).milliseconds();
if (duration >= 100)
{
String fpsText = String::format(L"FPS: %.1f", (1000.f / duration * _renderTimes));
_renderTimes = 0;
_lastRenderTime = now;
auto writeFactory = Renderer::getWriteFactory(); auto writeFactory = Renderer::getWriteFactory();
if (!_fpsFormat) if (!_fpsFormat)
@ -129,23 +135,24 @@ void e2d::Renderer::_renderFps()
{ {
_fpsFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP); _fpsFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP);
} }
else
{
return;
}
} }
IDWriteTextLayout * fpsLayout = nullptr; SafeRelease(_fpsLayout);
HRESULT hr = writeFactory->CreateTextLayout(
if (_fpsFormat)
{
writeFactory->CreateTextLayout(
(const WCHAR *)fpsText, (const WCHAR *)fpsText,
(UINT32)fpsText.getLength(), (UINT32)fpsText.getLength(),
_fpsFormat, _fpsFormat,
0, 0,
0, 0,
&fpsLayout &_fpsLayout
); );
}
}
if (SUCCEEDED(hr)) if (_fpsLayout)
{ {
this->getRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); this->getRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity());
this->getSolidColorBrush()->SetOpacity(1.0f); this->getSolidColorBrush()->SetOpacity(1.0f);
@ -159,10 +166,8 @@ void e2d::Renderer::_renderFps()
D2D1_LINE_JOIN_ROUND D2D1_LINE_JOIN_ROUND
); );
fpsLayout->Draw(nullptr, textRenderer, 10, 0); _fpsLayout->Draw(nullptr, textRenderer, 10, 0);
} }
SafeRelease(fpsLayout);
} }
e2d::Color e2d::Renderer::getBackgroundColor() e2d::Color e2d::Renderer::getBackgroundColor()

View File

@ -335,10 +335,12 @@ private:
void _renderFps(); void _renderFps();
private: private:
double _lastRenderTime; int _renderTimes;
Time _lastRenderTime;
D2D1_COLOR_F _clearColor; D2D1_COLOR_F _clearColor;
TextRenderer* _textRenderer; TextRenderer* _textRenderer;
IDWriteTextFormat* _fpsFormat; IDWriteTextFormat* _fpsFormat;
IDWriteTextLayout* _fpsLayout;
ID2D1SolidColorBrush* _solidBrush; ID2D1SolidColorBrush* _solidBrush;
ID2D1HwndRenderTarget* _renderTarget; ID2D1HwndRenderTarget* _renderTarget;