修复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,48 +107,52 @@ 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)
auto writeFactory = Renderer::getWriteFactory();
if (!_fpsFormat)
{ {
HRESULT hr = writeFactory->CreateTextFormat( String fpsText = String::format(L"FPS: %.1f", (1000.f / duration * _renderTimes));
L"", _renderTimes = 0;
nullptr, _lastRenderTime = now;
DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
20,
L"",
&_fpsFormat
);
if (SUCCEEDED(hr)) auto writeFactory = Renderer::getWriteFactory();
if (!_fpsFormat)
{ {
_fpsFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP); HRESULT hr = writeFactory->CreateTextFormat(
L"",
nullptr,
DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
20,
L"",
&_fpsFormat
);
if (SUCCEEDED(hr))
{
_fpsFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP);
}
} }
else
SafeRelease(_fpsLayout);
if (_fpsFormat)
{ {
return; writeFactory->CreateTextLayout(
(const WCHAR *)fpsText,
(UINT32)fpsText.getLength(),
_fpsFormat,
0,
0,
&_fpsLayout
);
} }
} }
IDWriteTextLayout * fpsLayout = nullptr; if (_fpsLayout)
HRESULT hr = writeFactory->CreateTextLayout(
(const WCHAR *)fpsText,
(UINT32)fpsText.getLength(),
_fpsFormat,
0,
0,
&fpsLayout
);
if (SUCCEEDED(hr))
{ {
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;