Screen: optimitzat el circuit de render en pantalla

This commit is contained in:
2025-01-05 14:17:49 +01:00
parent f207985180
commit 91c8797d7f
2 changed files with 36 additions and 57 deletions

View File

@@ -46,7 +46,6 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer)
: window_(window), : window_(window),
renderer_(renderer), renderer_(renderer),
game_canvas_(SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height)), game_canvas_(SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height)),
shader_canvas_(SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height)),
src_rect_({0, 0, param.game.width, param.game.height}), src_rect_({0, 0, param.game.width, param.game.height}),
dst_rect_({0, 0, param.game.width, param.game.height}) dst_rect_({0, 0, param.game.width, param.game.height})
{ {
@@ -66,7 +65,6 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer)
Screen::~Screen() Screen::~Screen()
{ {
SDL_DestroyTexture(game_canvas_); SDL_DestroyTexture(game_canvas_);
SDL_DestroyTexture(shader_canvas_);
} }
// Limpia la pantalla // Limpia la pantalla
@@ -88,75 +86,36 @@ void Screen::render()
// Actualiza el contador de FPS // Actualiza el contador de FPS
++fps_counter_; ++fps_counter_;
// Actualiza y dibuja el efecto de flash en la pantalla // Dibuja efectos y elementos sobre el game_canvas_
renderFlash(); renderFlash();
// Atenua la pantalla
renderAttenuate(); renderAttenuate();
// Muestra la ayuda por pantalla
OnScreenHelp::get()->render(); OnScreenHelp::get()->render();
// Muestra información por pantalla
renderInfo(); renderInfo();
// Muestra las notificaciones
Notifier::get()->render(); Notifier::get()->render();
#ifdef NO_SHADERS // Restablece el objetivo de renderizado al buffer de pantalla predeterminado
// Vuelve a dejar el renderizador en modo normal
SDL_SetRenderTarget(renderer_, nullptr); SDL_SetRenderTarget(renderer_, nullptr);
// Borra el contenido previo // Renderiza el contenido del game_canvas_ o aplica shaders según configuración
// SDL_SetRenderDrawColor(renderer_, border_color_.r, border_color_.g, border_color_.b, 0xFF); renderScreen();
// SDL_RenderClear(renderer_); }
// Copia la textura de juego en el renderizador en la posición adecuada // Selecciona y ejecuta el método de renderizado adecuado basado en la configuración de shaders
if (shake_effect_.enabled) void Screen::renderScreen()
{ {
SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr); #ifdef NO_SHADERS
} // Actualiza la pantalla con el contenido del game_canvas_
SDL_RenderCopy(renderer_, game_canvas_, &src_rect_, &dst_rect_); presentGameCanvas();
// Muestra por pantalla el renderizador
SDL_RenderPresent(renderer_);
#else #else
if (options.video.shaders) if (options.video.shaders)
{ {
// Dibuja sobre la textura de shaders // Aplica shaders y renderiza el contenido
SDL_SetRenderTarget(renderer_, shader_canvas_);
// Copia la textura de juego en el renderizador en la posición adecuada
if (shake_effect_.enabled)
{
// Esta copia es para evitar que se vea negro por los laterales
SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr);
}
SDL_RenderCopy(renderer_, game_canvas_, &src_rect_, &dst_rect_);
SDL_SetRenderTarget(renderer_, nullptr);
// Muestra por pantalla el renderizador
shader::render(); shader::render();
} }
else else
{ {
// Vuelve a dejar el renderizador en modo normal // Actualiza la pantalla con el contenido del game_canvas_
SDL_SetRenderTarget(renderer_, nullptr); presentGameCanvas();
// Borra el render
SDL_SetRenderDrawColor(renderer_, 0x00, 0x00, 0x00, 0xFF);
SDL_RenderClear(renderer_);
// Copia la textura de juego en el renderizador en la posición adecuada
if (shake_effect_.enabled)
{
// Esta copia es para evitar que se vea negro por los laterales
SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr);
}
SDL_RenderCopy(renderer_, game_canvas_, &src_rect_, &dst_rect_);
// Muestra por pantalla el renderizador
SDL_RenderPresent(renderer_);
} }
#endif #endif
} }
@@ -216,7 +175,7 @@ void Screen::setVideoMode(ScreenVideoMode videoMode)
std::ifstream f(Asset::get()->get(glsl_file).c_str()); std::ifstream f(Asset::get()->get(glsl_file).c_str());
std::string source((std::istreambuf_iterator<char>(f)), std::istreambuf_iterator<char>()); std::string source((std::istreambuf_iterator<char>(f)), std::istreambuf_iterator<char>());
shader::init(window_, shader_canvas_, source.c_str()); shader::init(window_, game_canvas_, source.c_str());
#endif #endif
} }
} }
@@ -445,4 +404,19 @@ SDL_Point Screen::getNewPosition()
new_pos.y = std::clamp(new_pos.y, 30, DM.h - new_height); new_pos.y = std::clamp(new_pos.y, 30, DM.h - new_height);
return new_pos; return new_pos;
}
// Actualiza la pantalla con el contenido del game_canvas_
void Screen::presentGameCanvas()
{
// Copia la textura de juego en el renderizador en la posición adecuada
if (shake_effect_.enabled)
{
// Esta copia es para evitar que se vea negro por los laterales
SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr);
}
SDL_RenderCopy(renderer_, game_canvas_, &src_rect_, &dst_rect_);
// Actualiza la pantalla con el contenido del buffer de renderizado
SDL_RenderPresent(renderer_);
} }

View File

@@ -31,7 +31,6 @@ private:
SDL_Window *window_; // Ventana de la aplicación SDL_Window *window_; // Ventana de la aplicación
SDL_Renderer *renderer_; // El renderizador de la ventana SDL_Renderer *renderer_; // El renderizador de la ventana
SDL_Texture *game_canvas_; // Textura donde se dibuja todo antes de volcarse al renderizador SDL_Texture *game_canvas_; // Textura donde se dibuja todo antes de volcarse al renderizador
SDL_Texture *shader_canvas_; // Textura para pasarle al shader desde gameCanvas
// Variables // Variables
SDL_Rect src_rect_; // Coordenadas de donde va a pillar la textura del juego para dibujarla SDL_Rect src_rect_; // Coordenadas de donde va a pillar la textura del juego para dibujarla
@@ -108,6 +107,12 @@ private:
// Calcula la nueva posición de la ventana a partir de la antigua al cambiarla de tamaño // Calcula la nueva posición de la ventana a partir de la antigua al cambiarla de tamaño
SDL_Point getNewPosition(); SDL_Point getNewPosition();
// Actualiza la pantalla con el contenido del game_canvas_
void presentGameCanvas();
// Selecciona y ejecuta el método de renderizado adecuado basado en la configuración de shaders
void renderScreen();
// [SINGLETON] Ahora el constructor y el destructor son privados, para no poder crear objetos screen desde fuera // [SINGLETON] Ahora el constructor y el destructor son privados, para no poder crear objetos screen desde fuera
// Constructor // Constructor