修改OpenGl渲染底层之前
This commit is contained in:
@@ -3,7 +3,6 @@
|
||||
#include "EngineFrame/Component/Sprite.h"
|
||||
#include "EngineFrame/Actor/Actor.h"
|
||||
#include "EngineFrame/Component/Text.h"
|
||||
#include "EngineFrame/Actor/Debug_Actor.h"
|
||||
|
||||
Game::Game()
|
||||
{
|
||||
@@ -16,8 +15,6 @@ Game::~Game()
|
||||
|
||||
void Game::Init(std::function<void()> CallBack)
|
||||
{
|
||||
// 计算帧时间
|
||||
m_frameTime = 1000 / m_fps;
|
||||
|
||||
SDL_InitSubSystem(SDL_INIT_JOYSTICK);
|
||||
SDL_JoystickEventState(SDL_ENABLE);
|
||||
@@ -52,7 +49,7 @@ void Game::Init(std::function<void()> CallBack)
|
||||
}
|
||||
}
|
||||
// 创建渲染器
|
||||
m_renderer = SDL_CreateRenderer(m_window, -1, SDL_RENDERER_ACCELERATED);
|
||||
m_renderer = SDL_CreateRenderer(m_window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
|
||||
if (m_renderer == nullptr)
|
||||
{
|
||||
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "SDL could not Create Renderer! Error: %s\n", SDL_GetError());
|
||||
@@ -78,41 +75,41 @@ void Game::Init(std::function<void()> CallBack)
|
||||
m_isRunning = false;
|
||||
}
|
||||
// SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "0");
|
||||
// 构造调试对象
|
||||
m_DebugInfoActor = new Debug_Actor();
|
||||
CallBack();
|
||||
}
|
||||
|
||||
void Game::Run()
|
||||
{
|
||||
// 计算帧时间
|
||||
m_frameTime = 1000.0 / m_Settingfps;
|
||||
|
||||
while (m_isRunning)
|
||||
{
|
||||
u32 frameStart = SDL_GetTicks(); // 帧开始时间
|
||||
// 帧开始时间
|
||||
Uint64 frameStart = SDL_GetTicks64();
|
||||
SDL_Event m_event;
|
||||
HandleEvents(&m_event);
|
||||
Update(m_deltaTime); // 注意:这里使用的是上一帧的deltaTime(合理,见说明)
|
||||
Update(m_deltaTime);
|
||||
Render();
|
||||
|
||||
// 帧率统计(保持不变)
|
||||
m_frameCount++;
|
||||
u32 currentTime = SDL_GetTicks();
|
||||
// 帧率统计 每一秒钟的时候记录一次帧率
|
||||
m_frameCounter++;
|
||||
Uint64 currentTime = SDL_GetTicks64();
|
||||
if (currentTime - m_lastFpsPrintTime >= 1000)
|
||||
{
|
||||
u32 fps = m_frameCount;
|
||||
if (m_DebugInfoActor)
|
||||
m_DebugInfoActor->FPS = fps;
|
||||
m_fps = m_frameCounter;
|
||||
m_lastFpsPrintTime = currentTime;
|
||||
m_frameCount = 0;
|
||||
m_frameCounter = 0;
|
||||
}
|
||||
|
||||
// 计算实际总帧时间(关键修改)
|
||||
u32 diff = SDL_GetTicks() - frameStart; // 处理耗时
|
||||
Uint64 diff = SDL_GetTicks64() - frameStart; // 处理耗时
|
||||
if (diff < m_frameTime)
|
||||
{
|
||||
SDL_Delay(m_frameTime - diff); // 尝试延迟补全
|
||||
}
|
||||
// 延迟后,重新计算从帧开始到现在的总时间(包含可能的延迟误差)
|
||||
u32 actualFrameTime = SDL_GetTicks() - frameStart;
|
||||
Uint64 actualFrameTime = SDL_GetTicks64() - frameStart;
|
||||
m_deltaTime = actualFrameTime / 1000.0f; // 用实际总时间更新deltaTime
|
||||
}
|
||||
}
|
||||
@@ -156,26 +153,25 @@ void Game::Update(float deltaTime)
|
||||
m_scene->Update(deltaTime);
|
||||
if (m_uiScene != nullptr)
|
||||
m_uiScene->Update(deltaTime);
|
||||
|
||||
// 调试信息
|
||||
if (m_DebugInfoActor != nullptr)
|
||||
{
|
||||
m_DebugInfoActor->Update(deltaTime);
|
||||
m_DebugInfoActor->RenderCount = RenderCount;
|
||||
}
|
||||
|
||||
RenderCount = 0;
|
||||
}
|
||||
|
||||
void Game::Render()
|
||||
{
|
||||
// 绘制调用次数清0
|
||||
m_RenderCount = 0;
|
||||
|
||||
// 调用预渲染
|
||||
if (m_scene != nullptr)
|
||||
m_scene->PreRender();
|
||||
if (m_uiScene != nullptr)
|
||||
m_uiScene->PreRender();
|
||||
|
||||
// 清空渲染器后渲染
|
||||
SDL_RenderClear(m_renderer);
|
||||
if (m_scene != nullptr)
|
||||
m_scene->Render();
|
||||
if (m_uiScene != nullptr)
|
||||
m_uiScene->Render();
|
||||
if (m_DebugInfoActor != nullptr)
|
||||
m_DebugInfoActor->Render();
|
||||
SDL_RenderPresent(m_renderer);
|
||||
}
|
||||
|
||||
@@ -191,7 +187,6 @@ void Game::Clear()
|
||||
m_uiScene->Exit();
|
||||
}
|
||||
m_uiScene = nullptr;
|
||||
m_DebugInfoActor = nullptr;
|
||||
IMG_Quit();
|
||||
SDL_DestroyRenderer(m_renderer);
|
||||
SDL_DestroyWindow(m_window);
|
||||
|
||||
Reference in New Issue
Block a user