From 6617f7b7e0b66c9c17efef7c5289d201be37ae8b Mon Sep 17 00:00:00 2001 From: Nomango <569629550@qq.com> Date: Tue, 24 Jul 2018 00:24:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DDirect2D=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=9C=AA=E6=AD=A3=E7=A1=AE=E9=87=8A=E6=94=BE=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AD=98=E6=B3=84=E6=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/Base/Input.cpp | 11 ++-- core/Base/Renderer.cpp | 102 ++++++++++++++++----------------- core/Base/Window.cpp | 5 +- core/Common/Scene.cpp | 2 - core/Custom/TextRenderer.cpp | 17 +++--- core/Node/Node.cpp | 7 ++- core/Transition/Transition.cpp | 10 +++- core/e2dbase.h | 11 ++-- core/e2dcustom.h | 3 +- 9 files changed, 86 insertions(+), 82 deletions(-) diff --git a/core/Base/Input.cpp b/core/Base/Input.cpp index 435bad33..1aa3b1c7 100644 --- a/core/Base/Input.cpp +++ b/core/Base/Input.cpp @@ -196,15 +196,14 @@ double e2d::Input::getMouseY() e2d::Point e2d::Input::getMousePos() { + HWND hWnd = Window::getInstance()->getHWnd(); + POINT mousePos; GetCursorPos(&mousePos); - ScreenToClient(Window::getInstance()->getHWnd(), &mousePos); + ScreenToClient(hWnd, &mousePos); - float dpiScaleX = 0.f, dpiScaleY = 0.f; - Renderer::getFactory()->GetDesktopDpi(&dpiScaleX, &dpiScaleY); - - return Point(static_cast(mousePos.x * 96.f / dpiScaleX), - static_cast(mousePos.y * 96.f / dpiScaleX)); + UINT ret = ::GetDpiForWindow(hWnd); + return Point(mousePos.x * 96.0 / ret, mousePos.y * 96.0 / ret); } double e2d::Input::getMouseDeltaX() diff --git a/core/Base/Renderer.cpp b/core/Base/Renderer.cpp index f1fcd229..06420b16 100644 --- a/core/Base/Renderer.cpp +++ b/core/Base/Renderer.cpp @@ -7,7 +7,6 @@ e2d::Renderer* e2d::Renderer::_instance = nullptr; ID2D1Factory* e2d::Renderer::_d2dFactory = nullptr; IWICImagingFactory* e2d::Renderer::_imagingFactory = nullptr; IDWriteFactory* e2d::Renderer::_writeFactory = nullptr; -IDWriteTextFormat* e2d::Renderer::_textFormat = nullptr; ID2D1StrokeStyle* e2d::Renderer::_miterStrokeStyle = nullptr; ID2D1StrokeStyle* e2d::Renderer::_bevelStrokeStyle = nullptr; ID2D1StrokeStyle* e2d::Renderer::_roundStrokeStyle = nullptr; @@ -28,11 +27,10 @@ void e2d::Renderer::destroyInstance() delete _instance; _instance = nullptr; - SafeRelease(_textFormat); - SafeRelease(_d2dFactory); SafeRelease(_miterStrokeStyle); SafeRelease(_bevelStrokeStyle); SafeRelease(_roundStrokeStyle); + SafeRelease(_d2dFactory); SafeRelease(_imagingFactory); SafeRelease(_writeFactory); } @@ -41,7 +39,8 @@ void e2d::Renderer::destroyInstance() e2d::Renderer::Renderer() : _renderTimes(0) , _lastRenderTime(0) - , _fpsText() + , _fpsFormat(nullptr) + , _fpsLayout(nullptr) , _renderTarget(nullptr) , _solidBrush(nullptr) , _textRenderer(nullptr) @@ -54,9 +53,11 @@ e2d::Renderer::Renderer() e2d::Renderer::~Renderer() { - SafeRelease(_renderTarget); - SafeRelease(_solidBrush); + SafeRelease(_fpsFormat); + SafeRelease(_fpsLayout); SafeRelease(_textRenderer); + SafeRelease(_solidBrush); + SafeRelease(_renderTarget); CoUninitialize(); } @@ -114,9 +115,6 @@ void e2d::Renderer::__discardDeviceResources() SafeRelease(_renderTarget); SafeRelease(_solidBrush); SafeRelease(_textRenderer); - SafeRelease(_miterStrokeStyle); - SafeRelease(_bevelStrokeStyle); - SafeRelease(_roundStrokeStyle); } void e2d::Renderer::render() @@ -162,27 +160,45 @@ void e2d::Renderer::_renderFps() ++_renderTimes; double duration = Game::getInstance()->getTotalDuration().seconds(); - double fDelay = duration - _lastRenderTime; - if (fDelay >= 0.1) + double delay = duration - _lastRenderTime; + if (delay >= 0.1) { - _fpsText = String::format(L"FPS: %.1lf", (1 / fDelay) * _renderTimes); + String fpsText = String::format(L"FPS: %.1lf", (1 / delay) * _renderTimes); _lastRenderTime = duration; _renderTimes = 0; + + auto writeFactory = Renderer::getWriteFactory(); + if (!_fpsFormat) + { + writeFactory->CreateTextFormat( + L"", + nullptr, + DWRITE_FONT_WEIGHT_NORMAL, + DWRITE_FONT_STYLE_NORMAL, + DWRITE_FONT_STRETCH_NORMAL, + 20, + L"", + &_fpsFormat + ); + } + + if (_fpsFormat) + { + _fpsFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP); + + SafeRelease(_fpsLayout); + writeFactory->CreateTextLayout( + (const WCHAR *)fpsText, + (UINT32)fpsText.getLength(), + _fpsFormat, + 0, + 0, + &_fpsLayout + ); + } } - IDWriteTextLayout * pTextLayout = nullptr; - IDWriteTextFormat * pTextFormat = Renderer::getFpsTextFormat(); - - HRESULT hr = _writeFactory->CreateTextLayout( - (const WCHAR *)_fpsText, - (UINT32)_fpsText.getLength(), - pTextFormat, - 0, - 0, - &pTextLayout - ); - - if (SUCCEEDED(hr)) + if (_fpsLayout) { _renderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); _solidBrush->SetOpacity(1.0f); @@ -196,9 +212,7 @@ void e2d::Renderer::_renderFps() D2D1_LINE_JOIN_ROUND ); - pTextLayout->Draw(nullptr, textRenderer, 10, 0); - - SafeRelease(pTextLayout); + _fpsLayout->Draw(nullptr, textRenderer, 10, 0); } } @@ -227,11 +241,17 @@ e2d::TextRenderer * e2d::Renderer::getTextRenderer() if (!_textRenderer) { // 创建自定义的文字渲染器 - _textRenderer = TextRenderer::Create( + HRESULT hr = TextRenderer::Create( + &_textRenderer, Renderer::getFactory(), this->getRenderTarget(), this->getSolidColorBrush() ); + + if (FAILED(hr)) + { + throw SystemException(L"Create TextRenderer failed"); + } } return _textRenderer; } @@ -293,30 +313,6 @@ IDWriteFactory * e2d::Renderer::getWriteFactory() return _writeFactory; } -IDWriteTextFormat * e2d::Renderer::getFpsTextFormat() -{ - if (!_textFormat) - { - // 创建 FPS 文本格式化对象 - HRESULT hr = Renderer::getWriteFactory()->CreateTextFormat( - L"", - nullptr, - DWRITE_FONT_WEIGHT_NORMAL, - DWRITE_FONT_STYLE_NORMAL, - DWRITE_FONT_STRETCH_NORMAL, - 20, - L"", - &_textFormat - ); - - if (SUCCEEDED(hr)) - { - _textFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP); - } - } - return _textFormat; -} - ID2D1StrokeStyle * e2d::Renderer::getMiterStrokeStyle() { if (!_miterStrokeStyle) diff --git a/core/Base/Window.cpp b/core/Base/Window.cpp index 56f61ac5..6635a379 100644 --- a/core/Base/Window.cpp +++ b/core/Base/Window.cpp @@ -426,9 +426,8 @@ LRESULT e2d::Window::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar if (wParam == SIZE_RESTORED) { - float dpiScaleX = 0.f, dpiScaleY = 0.f; - Renderer::getFactory()->GetDesktopDpi(&dpiScaleX, &dpiScaleY); - _instance->_size = Size(width * 96.f / dpiScaleX, height * 96.f / dpiScaleY); + UINT ret = ::GetDpiForWindow(hWnd); + _instance->_size = Size(width * 96.0 / ret, height * 96.0 / ret); } // 如果程序接收到一个 WM_SIZE 消息,这个方法将调整渲染 diff --git a/core/Common/Scene.cpp b/core/Common/Scene.cpp index ae84ffef..af739ad4 100644 --- a/core/Common/Scene.cpp +++ b/core/Common/Scene.cpp @@ -35,12 +35,10 @@ void e2d::Scene::render() void e2d::Scene::update() { - // 执行 onUpdate 函数 if (_autoUpdate) { this->onUpdate(); } - // 更新根节点 _root->_update(); } diff --git a/core/Custom/TextRenderer.cpp b/core/Custom/TextRenderer.cpp index 352b8a5a..73ca61ad 100644 --- a/core/Custom/TextRenderer.cpp +++ b/core/Custom/TextRenderer.cpp @@ -23,24 +23,27 @@ TextRenderer::~TextRenderer() SafeRelease(pBrush_); } -TextRenderer * TextRenderer::Create( +HRESULT TextRenderer::Create( + TextRenderer** ppTextRenderer, ID2D1Factory* pD2DFactory, ID2D1HwndRenderTarget* pRT, ID2D1SolidColorBrush* pBrush ) { - TextRenderer * pTextRenderer = new (std::nothrow) TextRenderer(); - if (pTextRenderer) + *ppTextRenderer = new (std::nothrow) TextRenderer(); + if (*ppTextRenderer) { pD2DFactory->AddRef(); pRT->AddRef(); pBrush->AddRef(); - pTextRenderer->pD2DFactory_ = pD2DFactory; - pTextRenderer->pRT_ = pRT; - pTextRenderer->pBrush_ = pBrush; + (*ppTextRenderer)->pD2DFactory_ = pD2DFactory; + (*ppTextRenderer)->pRT_ = pRT; + (*ppTextRenderer)->pBrush_ = pBrush; + (*ppTextRenderer)->AddRef(); + return S_OK; } - return pTextRenderer; + return E_FAIL; } STDMETHODIMP_(void) TextRenderer::SetTextStyle( diff --git a/core/Node/Node.cpp b/core/Node/Node.cpp index b56b1658..d7fe7e24 100644 --- a/core/Node/Node.cpp +++ b/core/Node/Node.cpp @@ -184,7 +184,7 @@ void e2d::Node::_render() void e2d::Node::_renderOutline() { - if (_outline) + if (_outline && _visible) { auto renderer = Renderer::getInstance(); // 获取纯色画刷 @@ -206,7 +206,10 @@ void e2d::Node::_renderOutline() void e2d::Node::_renderCollider() { // 绘制自身的几何碰撞体 - _collider.render(); + if (_visible) + { + _collider.render(); + } // 绘制所有子节点的几何碰撞体 for (auto child : _children) diff --git a/core/Transition/Transition.cpp b/core/Transition/Transition.cpp index a6919688..901fb7ce 100644 --- a/core/Transition/Transition.cpp +++ b/core/Transition/Transition.cpp @@ -52,7 +52,15 @@ void e2d::Transition::_init(Scene * prev, Scene * next) if (_inScene) _inScene->retain(); _windowSize = Window::getInstance()->getSize(); - _outLayerParam = _inLayerParam = D2D1::LayerParameters(); + _outLayerParam = _inLayerParam = D2D1::LayerParameters( + D2D1::InfiniteRect(), + nullptr, + D2D1_ANTIALIAS_MODE_PER_PRIMITIVE, + D2D1::Matrix3x2F::Identity(), + 1.0, + renderer->getSolidColorBrush(), + D2D1_LAYER_OPTIONS_NONE + ); } void e2d::Transition::_update() diff --git a/core/e2dbase.h b/core/e2dbase.h index 54952a50..7f77126d 100644 --- a/core/e2dbase.h +++ b/core/e2dbase.h @@ -309,9 +309,6 @@ public: // 获取 IDWriteFactory 对象 static IDWriteFactory * getWriteFactory(); - // 获取 FPS 文本格式化对象 - static IDWriteTextFormat * getFpsTextFormat(); - // 获取 Miter 样式的 ID2D1StrokeStyle static ID2D1StrokeStyle * getMiterStrokeStyle(); @@ -340,16 +337,16 @@ private: private: int _renderTimes; double _lastRenderTime; - String _fpsText; D2D1_COLOR_F _clearColor; - ID2D1HwndRenderTarget* _renderTarget; - ID2D1SolidColorBrush* _solidBrush; TextRenderer* _textRenderer; + IDWriteTextFormat* _fpsFormat; + IDWriteTextLayout* _fpsLayout; + ID2D1SolidColorBrush* _solidBrush; + ID2D1HwndRenderTarget* _renderTarget; static ID2D1Factory* _d2dFactory; static IWICImagingFactory* _imagingFactory; static IDWriteFactory* _writeFactory; - static IDWriteTextFormat* _textFormat; static ID2D1StrokeStyle* _miterStrokeStyle; static ID2D1StrokeStyle* _bevelStrokeStyle; static ID2D1StrokeStyle* _roundStrokeStyle; diff --git a/core/e2dcustom.h b/core/e2dcustom.h index bf6e0b51..a1f91e87 100644 --- a/core/e2dcustom.h +++ b/core/e2dcustom.h @@ -77,7 +77,8 @@ private: ~TextRenderer(); public: - static TextRenderer * Create( + static HRESULT Create( + TextRenderer** ppTextRenderer, ID2D1Factory* pD2DFactory, ID2D1HwndRenderTarget* pRT, ID2D1SolidColorBrush* pBrush