new feature: show fps
This commit is contained in:
parent
9ac4acb50e
commit
3fe75c7325
|
|
@ -1,5 +1,6 @@
|
|||
#include "..\ebase.h"
|
||||
#include "..\emanager.h"
|
||||
#include "..\enode.h"
|
||||
|
||||
static ID2D1Factory * s_pDirect2dFactory = nullptr;
|
||||
static ID2D1HwndRenderTarget * s_pRenderTarget = nullptr;
|
||||
|
|
@ -8,6 +9,13 @@ static IWICImagingFactory * s_pIWICFactory = nullptr;
|
|||
static IDWriteFactory * s_pDWriteFactory = nullptr;
|
||||
static D2D1_COLOR_F s_nClearColor = D2D1::ColorF(D2D1::ColorF::Black);
|
||||
|
||||
static bool s_bShowFps = false;
|
||||
static int s_nRenderTimes = 0;
|
||||
static double s_fLastRenderTime = 0;
|
||||
static e2d::String s_sFpsText = L"";
|
||||
static IDWriteTextFormat * s_pTextFormat = nullptr;
|
||||
|
||||
|
||||
|
||||
bool e2d::Renderer::__createDeviceIndependentResources()
|
||||
{
|
||||
|
|
@ -43,6 +51,21 @@ bool e2d::Renderer::__createDeviceIndependentResources()
|
|||
ASSERT(SUCCEEDED(hr), "Create IDWriteFactory Failed!");
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
// 创建文本格式化对象
|
||||
hr = s_pDWriteFactory->CreateTextFormat(
|
||||
L"",
|
||||
NULL,
|
||||
DWRITE_FONT_WEIGHT_NORMAL,
|
||||
DWRITE_FONT_STYLE_NORMAL,
|
||||
DWRITE_FONT_STRETCH_NORMAL,
|
||||
18,
|
||||
L"",
|
||||
&s_pTextFormat
|
||||
);
|
||||
}
|
||||
|
||||
return SUCCEEDED(hr);
|
||||
}
|
||||
|
||||
|
|
@ -119,6 +142,27 @@ void e2d::Renderer::__render()
|
|||
// äÖȾ³¡¾°
|
||||
SceneManager::__render();
|
||||
|
||||
// 渲染 FPS
|
||||
if (s_bShowFps)
|
||||
{
|
||||
s_nRenderTimes++;
|
||||
|
||||
double fDelay = Time::getTotalTime() - s_fLastRenderTime;
|
||||
if (fDelay >= 0.3)
|
||||
{
|
||||
s_sFpsText = String::format(L"FPS: %.1lf", (1 / fDelay) * s_nRenderTimes);
|
||||
s_fLastRenderTime = Time::getTotalTime();
|
||||
s_nRenderTimes = 0;
|
||||
}
|
||||
|
||||
D2D1_SIZE_F renderTargetSize = s_pRenderTarget->GetSize();
|
||||
D2D1_RECT_F rect = D2D1::RectF(0, 0, renderTargetSize.width, renderTargetSize.height);
|
||||
|
||||
s_pSolidBrush->SetColor(D2D1::ColorF(D2D1::ColorF::White));
|
||||
s_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
|
||||
s_pRenderTarget->DrawTextW(s_sFpsText, (UINT32)s_sFpsText.getLength(), s_pTextFormat, rect, s_pSolidBrush);
|
||||
}
|
||||
|
||||
// ÖÕÖ¹äÖȾ
|
||||
hr = s_pRenderTarget->EndDraw();
|
||||
|
||||
|
|
@ -144,6 +188,11 @@ void e2d::Renderer::setBackgroundColor(UINT32 color)
|
|||
s_nClearColor = D2D1::ColorF(color);
|
||||
}
|
||||
|
||||
void e2d::Renderer::showFps(bool show)
|
||||
{
|
||||
s_bShowFps = show;
|
||||
}
|
||||
|
||||
ID2D1Factory * e2d::Renderer::getID2D1Factory()
|
||||
{
|
||||
return s_pDirect2dFactory;
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ static milliseconds s_tExceptedInvertal;
|
|||
bool e2d::Time::__init()
|
||||
{
|
||||
s_tStart = s_tLastUpdate = s_tFixedUpdate = s_tNow = steady_clock::now();
|
||||
s_tExceptedInvertal = milliseconds(17);
|
||||
s_tExceptedInvertal = milliseconds(15);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -107,7 +107,7 @@ bool e2d::Time::__init()
|
|||
::QueryPerformanceFrequency(&s_tFreq); // 获取时钟频率
|
||||
::QueryPerformanceCounter(&s_tNow); // 刷新当前时间
|
||||
s_tStart = s_tLastUpdate = s_tFixedUpdate = s_tNow;
|
||||
s_tExceptedInvertal = 17LL * s_tFreq.QuadPart / 1000LL;
|
||||
s_tExceptedInvertal = 15LL * s_tFreq.QuadPart / 1000LL;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ e2d::String e2d::String::parse(double value)
|
|||
return std::move(tmp);
|
||||
}
|
||||
|
||||
e2d::String & e2d::String::format(const char * format, ...)
|
||||
e2d::String e2d::String::format(const char * format, ...)
|
||||
{
|
||||
std::string tmp;
|
||||
|
||||
|
|
@ -108,11 +108,11 @@ e2d::String & e2d::String::format(const char * format, ...)
|
|||
|
||||
va_end(marker);
|
||||
|
||||
m_str = static_cast<wchar_t*>(_bstr_t(tmp.c_str()));
|
||||
return (*this);
|
||||
String str = tmp.c_str();
|
||||
return std::move(str);
|
||||
}
|
||||
|
||||
e2d::String & e2d::String::format(const wchar_t * format, ...)
|
||||
e2d::String e2d::String::format(const wchar_t * format, ...)
|
||||
{
|
||||
std::wstring tmp;
|
||||
|
||||
|
|
@ -130,8 +130,8 @@ e2d::String & e2d::String::format(const wchar_t * format, ...)
|
|||
|
||||
va_end(marker);
|
||||
|
||||
m_str = tmp.c_str();
|
||||
return (*this);
|
||||
String str = tmp.c_str();
|
||||
return std::move(str);
|
||||
}
|
||||
|
||||
e2d::String & e2d::String::operator=(const String &str)
|
||||
|
|
|
|||
|
|
@ -245,7 +245,7 @@ void e2d::Text::_createFormat()
|
|||
m_Font.italic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL,
|
||||
DWRITE_FONT_STRETCH_NORMAL,
|
||||
static_cast<float>(m_Font.size),
|
||||
L"zh-cn",
|
||||
L"",
|
||||
&m_pDWriteTextFormat
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include "..\ebase.h"
|
||||
#include "..\etransition.h"
|
||||
#include "..\enode.h"
|
||||
|
||||
e2d::Transition::Transition(double duration)
|
||||
: m_bEnd(false)
|
||||
|
|
@ -49,10 +50,8 @@ void e2d::Transition::_init(Scene * prev, Scene * next)
|
|||
if (m_pPrevScene) m_pPrevScene->retain();
|
||||
if (m_pNextScene) m_pNextScene->retain();
|
||||
|
||||
auto size = Window::getSize();
|
||||
m_sPrevLayerParam = m_sNextLayerParam = D2D1::LayerParameters(
|
||||
D2D1::RectF(0, 0, float(size.width), float(size.height))
|
||||
);
|
||||
m_WindowSize = Window::getSize();
|
||||
m_sPrevLayerParam = m_sNextLayerParam = D2D1::LayerParameters();
|
||||
}
|
||||
|
||||
void e2d::Transition::_update()
|
||||
|
|
@ -83,27 +82,45 @@ void e2d::Transition::_update()
|
|||
void e2d::Transition::_render()
|
||||
{
|
||||
auto pRT = Renderer::getRenderTarget();
|
||||
|
||||
Size windowSize = Window::getSize();
|
||||
if (m_pPrevScene)
|
||||
{
|
||||
Point rootPos = m_pPrevScene->getRoot()->getPos();
|
||||
auto clipRect = D2D1::RectF(
|
||||
float(max(rootPos.x, 0)),
|
||||
float(max(rootPos.y, 0)),
|
||||
float(min(rootPos.x + windowSize.width, windowSize.width)),
|
||||
float(min(rootPos.y + windowSize.height, windowSize.height))
|
||||
);
|
||||
pRT->SetTransform(D2D1::Matrix3x2F::Identity());
|
||||
pRT->PushAxisAlignedClip(clipRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
|
||||
pRT->PushLayer(m_sPrevLayerParam, m_pPrevLayer);
|
||||
|
||||
// äÖȾ³¡¾°
|
||||
m_pPrevScene->_render();
|
||||
|
||||
pRT->PopLayer();
|
||||
pRT->PopAxisAlignedClip();
|
||||
}
|
||||
|
||||
if (m_pNextScene)
|
||||
{
|
||||
Point rootPos = m_pNextScene->getRoot()->getPos();
|
||||
auto clipRect = D2D1::RectF(
|
||||
float(max(rootPos.x, 0)),
|
||||
float(max(rootPos.y, 0)),
|
||||
float(min(rootPos.x + windowSize.width, windowSize.width)),
|
||||
float(min(rootPos.y + windowSize.height, windowSize.height))
|
||||
);
|
||||
pRT->SetTransform(D2D1::Matrix3x2F::Identity());
|
||||
pRT->PushAxisAlignedClip(clipRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
|
||||
pRT->PushLayer(m_sNextLayerParam, m_pNextLayer);
|
||||
|
||||
// äÖȾ³¡¾°
|
||||
m_pNextScene->_render();
|
||||
|
||||
pRT->PopLayer();
|
||||
pRT->PopAxisAlignedClip();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,13 @@ e2d::TransitionEmerge::TransitionEmerge(double duration)
|
|||
{
|
||||
}
|
||||
|
||||
void e2d::TransitionEmerge::_init(Scene * prev, Scene * next)
|
||||
{
|
||||
Transition::_init(prev, next);
|
||||
m_sPrevLayerParam.opacity = 1;
|
||||
m_sNextLayerParam.opacity = 0;
|
||||
}
|
||||
|
||||
void e2d::TransitionEmerge::_updateCustom()
|
||||
{
|
||||
m_sPrevLayerParam.opacity = float(1 - m_fRateOfProgress);
|
||||
|
|
@ -17,13 +24,6 @@ void e2d::TransitionEmerge::_updateCustom()
|
|||
}
|
||||
}
|
||||
|
||||
void e2d::TransitionEmerge::_init(Scene * prev, Scene * next)
|
||||
{
|
||||
Transition::_init(prev, next);
|
||||
m_sPrevLayerParam.opacity = 1;
|
||||
m_sNextLayerParam.opacity = 0;
|
||||
}
|
||||
|
||||
void e2d::TransitionEmerge::_reset()
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,23 @@ e2d::TransitionFade::TransitionFade(double fadeOutDuration, double fadeInDuratio
|
|||
{
|
||||
}
|
||||
|
||||
void e2d::TransitionFade::_init(Scene * prev, Scene * next)
|
||||
{
|
||||
Transition::_init(prev, next);
|
||||
if (m_pPrevScene)
|
||||
{
|
||||
m_bFadeOutTransioning = true;
|
||||
m_fDuration = m_fFadeOutDuration;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bFadeOutTransioning = false;
|
||||
m_fDuration = m_fFadeInDuration;
|
||||
}
|
||||
m_sPrevLayerParam.opacity = 1;
|
||||
m_sNextLayerParam.opacity = 0;
|
||||
}
|
||||
|
||||
void e2d::TransitionFade::_updateCustom()
|
||||
{
|
||||
if (m_bFadeOutTransioning)
|
||||
|
|
@ -39,23 +56,6 @@ void e2d::TransitionFade::_updateCustom()
|
|||
}
|
||||
}
|
||||
|
||||
void e2d::TransitionFade::_init(Scene * prev, Scene * next)
|
||||
{
|
||||
Transition::_init(prev, next);
|
||||
if (m_pPrevScene)
|
||||
{
|
||||
m_bFadeOutTransioning = true;
|
||||
m_fDuration = m_fFadeOutDuration;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bFadeOutTransioning = false;
|
||||
m_fDuration = m_fFadeInDuration;
|
||||
}
|
||||
m_sPrevLayerParam.opacity = 1;
|
||||
m_sNextLayerParam.opacity = 0;
|
||||
}
|
||||
|
||||
void e2d::TransitionFade::_reset()
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,46 +7,10 @@ e2d::TransitionMove::TransitionMove(double duration, int direct)
|
|||
{
|
||||
}
|
||||
|
||||
void e2d::TransitionMove::_updateCustom()
|
||||
{
|
||||
if (m_pPrevScene)
|
||||
{
|
||||
auto root = m_pPrevScene->getRoot();
|
||||
root->setPos(m_Vector * m_fRateOfProgress);
|
||||
|
||||
Point pos = root->getPos();
|
||||
m_sPrevLayerParam.contentBounds = D2D1::RectF(
|
||||
float(max(pos.x, 0)),
|
||||
float(max(pos.y, 0)),
|
||||
float(min(pos.x + m_WindowSize.width, m_WindowSize.width)),
|
||||
float(min(pos.y + m_WindowSize.height, m_WindowSize.height))
|
||||
);
|
||||
}
|
||||
if (m_pNextScene)
|
||||
{
|
||||
auto root = m_pNextScene->getRoot();
|
||||
root->setPos(m_NextPos + m_Vector * m_fRateOfProgress);
|
||||
|
||||
Point pos = root->getPos();
|
||||
m_sNextLayerParam.contentBounds = D2D1::RectF(
|
||||
float(max(pos.x, 0)),
|
||||
float(max(pos.y, 0)),
|
||||
float(min(pos.x + m_WindowSize.width, m_WindowSize.width)),
|
||||
float(min(pos.y + m_WindowSize.height, m_WindowSize.height))
|
||||
);
|
||||
}
|
||||
|
||||
if (m_fRateOfProgress >= 1)
|
||||
{
|
||||
this->_stop();
|
||||
}
|
||||
}
|
||||
|
||||
void e2d::TransitionMove::_init(Scene * prev, Scene * next)
|
||||
{
|
||||
Transition::_init(prev, next);
|
||||
|
||||
m_WindowSize = Window::getSize();
|
||||
double width = m_WindowSize.width;
|
||||
double height = m_WindowSize.height;
|
||||
if (m_Direct == Direct::UP)
|
||||
|
|
@ -74,6 +38,25 @@ void e2d::TransitionMove::_init(Scene * prev, Scene * next)
|
|||
m_pNextScene->getRoot()->setPos(m_NextPos);
|
||||
}
|
||||
|
||||
void e2d::TransitionMove::_updateCustom()
|
||||
{
|
||||
if (m_pPrevScene)
|
||||
{
|
||||
auto root = m_pPrevScene->getRoot();
|
||||
root->setPos(m_Vector * m_fRateOfProgress);
|
||||
}
|
||||
if (m_pNextScene)
|
||||
{
|
||||
auto root = m_pNextScene->getRoot();
|
||||
root->setPos(m_NextPos + m_Vector * m_fRateOfProgress);
|
||||
}
|
||||
|
||||
if (m_fRateOfProgress >= 1)
|
||||
{
|
||||
this->_stop();
|
||||
}
|
||||
}
|
||||
|
||||
void e2d::TransitionMove::_reset()
|
||||
{
|
||||
if (m_pPrevScene) m_pPrevScene->getRoot()->setPos(0, 0);
|
||||
|
|
|
|||
|
|
@ -234,6 +234,11 @@ public:
|
|||
UINT32 color
|
||||
);
|
||||
|
||||
// ÏÔʾ FPS
|
||||
static void showFps(
|
||||
bool show = true
|
||||
);
|
||||
|
||||
// 获取 ID2D1Factory 对象
|
||||
static ID2D1Factory * getID2D1Factory();
|
||||
|
||||
|
|
|
|||
|
|
@ -142,8 +142,8 @@ public:
|
|||
static String parse(double value);
|
||||
|
||||
// ¸ñʽ»¯×Ö·û´®
|
||||
String& format(const char * format, ...);
|
||||
String& format(const wchar_t * format, ...);
|
||||
static String format(const char * format, ...);
|
||||
static String format(const wchar_t * format, ...);
|
||||
|
||||
// ¸³ÖµÔËËã·û
|
||||
String& operator= (const String &);
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ protected:
|
|||
double m_fLast;
|
||||
double m_fDuration;
|
||||
double m_fRateOfProgress;
|
||||
Size m_WindowSize;
|
||||
Scene * m_pPrevScene;
|
||||
Scene * m_pNextScene;
|
||||
ID2D1Layer * m_pPrevLayer;
|
||||
|
|
@ -136,7 +137,6 @@ protected:
|
|||
int m_Direct;
|
||||
Vector m_Vector;
|
||||
Point m_NextPos;
|
||||
Size m_WindowSize;
|
||||
};
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue