From dc0213dc16a41ef10d6f1445c2f206a7820cfb91 Mon Sep 17 00:00:00 2001 From: Lenheart <947330670@qq.com> Date: Sun, 26 Oct 2025 14:38:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E6=B8=B8=E6=88=8F=E5=B1=82=E5=92=8CUI?= =?UTF-8?q?=E5=B1=82=E5=88=86=E5=BC=80=E6=B8=B2=E6=9F=93=20=E5=B9=B6?= =?UTF-8?q?=E6=8F=90=E9=AB=98=E4=BA=86=E7=BC=A9=E6=94=BE=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/EngineCore/Game.cpp | 15 ++++++++--- source/EngineCore/Game.h | 28 ++++++++++----------- source/EngineFrame/Render/RenderManager.cpp | 19 +++++++++++--- source/EngineFrame/Render/RenderManager.h | 14 +++++++++-- source/EngineFrame/Render/Texture.cpp | 4 +-- 5 files changed, 56 insertions(+), 24 deletions(-) diff --git a/source/EngineCore/Game.cpp b/source/EngineCore/Game.cpp index dfeb3af..84136f7 100644 --- a/source/EngineCore/Game.cpp +++ b/source/EngineCore/Game.cpp @@ -26,6 +26,10 @@ void Game::Init(std::function CallBack) SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); // 双缓冲 + // 启用多重采样(关键步骤) + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); // 启用多重采样缓冲 + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 8); // 4x 采样(可改为 8 等) + if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL could not initialize! Error: %s\n", SDL_GetError()); @@ -39,6 +43,7 @@ void Game::Init(std::function CallBack) } // 关闭原生鼠标 SDL_ShowCursor(0); + // 打开所有检测到的控制器 int numControllers = SDL_NumJoysticks(); for (int i = 0; i < numControllers; i++) @@ -112,6 +117,7 @@ void Game::Run() // 延迟后,重新计算从帧开始到现在的总时间(包含可能的延迟误差) Uint64 actualFrameTime = SDL_GetTicks64() - frameStart; m_deltaTime = actualFrameTime / 1000.0f; // 用实际总时间更新deltaTime + m_frameTime_ms = actualFrameTime; } } @@ -160,9 +166,6 @@ void Game::Update(float deltaTime) void Game::Render() { - // 绘制调用次数清0 - m_RenderCount = 0; - // 调用预渲染 if (m_scene != nullptr) m_scene->PreRender(); @@ -172,9 +175,15 @@ void Game::Render() // 清空渲染器后渲染 m_renderer->ClearScreen(); if (m_scene != nullptr) + { + m_renderer->SetOrthoMatrixType(0); m_scene->Render(); + } if (m_uiScene != nullptr) + { + m_renderer->SetOrthoMatrixType(1); m_uiScene->Render(); + } m_renderer->SwapBuffer(); } diff --git a/source/EngineCore/Game.h b/source/EngineCore/Game.h index 3eed036..7ee5edf 100644 --- a/source/EngineCore/Game.h +++ b/source/EngineCore/Game.h @@ -56,12 +56,7 @@ public: // 设定UI层场景对象 void ChangeUIScene(RefPtr scene); - RenderManager* GetRenderer(); - - // 每秒帧率 - u32 m_fps; - // 每帧绘制调用次数 - u32 m_RenderCount = 0; + RenderManager *GetRenderer(); private: // 构造函数和析构函数设为私有,防止外部创建和销毁 @@ -73,7 +68,7 @@ private: // 窗口 SDL_Window *m_window; // 渲染器 - RenderManager* m_renderer; + RenderManager *m_renderer; // 游戏层场景 RefPtr m_scene; @@ -82,22 +77,27 @@ private: // 帧数 #ifdef __SWITCH__ - float m_Settingfps = 60.0; + float m_Settingfps = 5000.0; #else - float m_Settingfps = 144.0; + float m_Settingfps = 5000.0; #endif // 单帧时间 float m_frameTime = 0.f; - // 每秒内的帧数计数器 - u32 m_frameCounter; - // 上一次输出帧率的时间 - u32 m_lastFpsPrintTime; - // 帧间隔 float m_deltaTime = 0.f; + // 每秒内的帧数计数器 + u32 m_frameCounter; + u32 m_lastFpsPrintTime; public: // 屏幕宽高 int Screen_W = 1280; int Screen_H = 720; + + // 每秒帧率 + u32 m_fps; + // 单帧时间 + u32 m_frameTime_ms; + // 节点个数 + u32 m_nodeCount = 0; }; \ No newline at end of file diff --git a/source/EngineFrame/Render/RenderManager.cpp b/source/EngineFrame/Render/RenderManager.cpp index 6145e20..13d1357 100644 --- a/source/EngineFrame/Render/RenderManager.cpp +++ b/source/EngineFrame/Render/RenderManager.cpp @@ -26,8 +26,11 @@ RenderManager::RenderManager(SDL_Window *window) // 设置窗口尺寸 _windowWidth = width; _windowHeight = height; - // 设置正交投影矩阵 - _orthoMatrix = glm::ortho(0.0f, (float)width, (float)height, 0.0f, -1.0f, 1.0f); + + // 游戏的初始正交投影矩阵 + _GameOrthoMatrix = glm::ortho(0.0f, (float)width / 1.2f, (float)height / 1.2f, 0.0f, -1.0f, 1.0f); + // UI的初始正交投影矩阵 + _UIOrthoMatrix = glm::ortho(0.0f, (float)width, (float)height, 0.0f, -1.0f, 1.0f); // 设置清屏颜色 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); @@ -217,7 +220,7 @@ void RenderManager::Init2DTextureProgram() // 设置着色器 uniforms glUniformMatrix4fv(_currentRenderParams.UnimLocs[0], 1, GL_FALSE, glm::value_ptr(model)); - glUniformMatrix4fv(_currentRenderParams.UnimLocs[1], 1, GL_FALSE, glm::value_ptr(_orthoMatrix)); + glUniformMatrix4fv(_currentRenderParams.UnimLocs[1], 1, GL_FALSE, glm::value_ptr(_OrthoMatrix)); // 绑定纹理并设置采样器 glActiveTexture(GL_TEXTURE0); @@ -297,6 +300,7 @@ void RenderManager::SetCurrentBufferObject(std::string name) void RenderManager::ClearScreen() { glClear(GL_COLOR_BUFFER_BIT); + _frameRenderCount = 0; } void RenderManager::SwapBuffer() @@ -317,12 +321,21 @@ void RenderManager::CloseClipRect() void RenderManager::DrawTexture(RefPtr textureObj, const SDL_Rect *srcrect, const SDL_FRect *dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip, void *userdata) { + _frameRenderCount++; if (_currentRenderParams.DrawFunc != nullptr) _currentRenderParams.DrawFunc(textureObj, srcrect, dstrect, angle, center, flip, userdata); else SDL_LogError(SDL_LOG_CATEGORY_ERROR, "找不到渲染逻辑函数\n"); } +void RenderManager::SetOrthoMatrixType(int type) +{ + if (type == 0) + _OrthoMatrix = _GameOrthoMatrix; + else + _OrthoMatrix = _UIOrthoMatrix; +} + GLuint RenderManager::CompileShader(GLenum type, std::string Path) { std::ifstream Source("shader/" + Path); diff --git a/source/EngineFrame/Render/RenderManager.h b/source/EngineFrame/Render/RenderManager.h index 82a266f..ec9dc79 100644 --- a/source/EngineFrame/Render/RenderManager.h +++ b/source/EngineFrame/Render/RenderManager.h @@ -31,8 +31,12 @@ private: // 窗口尺寸 int _windowWidth; int _windowHeight; - // 正交投影矩阵 - glm::mat4 _orthoMatrix; + // 游戏正交投影矩阵 + glm::mat4 _GameOrthoMatrix; + // UI的正交投影矩阵 + glm::mat4 _UIOrthoMatrix; + // 渲染的正交投影矩阵 + glm::mat4 _OrthoMatrix; // 渲染器上下文 SDL_GLContext _ctx; @@ -46,6 +50,9 @@ private: // 当前使用渲染参数 GL_RenderParams _currentRenderParams; +public: + // 单帧渲染调用次数 + int _frameRenderCount = 0; public: RenderManager(SDL_Window *window); ~RenderManager(); @@ -69,6 +76,9 @@ public: void CloseClipRect(); // 绘制纹理 void DrawTexture(RefPtr texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip, void *userdata = nullptr); + // 设置正交投影矩阵类型 + void SetOrthoMatrixType(int type); + private: // 编译着色器 diff --git a/source/EngineFrame/Render/Texture.cpp b/source/EngineFrame/Render/Texture.cpp index 7bcfcf5..6b4fd70 100644 --- a/source/EngineFrame/Render/Texture.cpp +++ b/source/EngineFrame/Render/Texture.cpp @@ -35,9 +35,9 @@ bool Texture::Init(std::string PngPath) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // 缩小过滤:使用最近邻采样 - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 放大过滤:使用最近邻采样 - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 处理像素对齐(确保SDL的像素行对齐与OpenGL兼容) glPixelStorei(GL_UNPACK_ALIGNMENT, 1);