From 91c8797d7f1c2deaa405a9c5dbcce23d85c376bc Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 5 Jan 2025 14:17:49 +0100 Subject: [PATCH] Screen: optimitzat el circuit de render en pantalla --- source/screen.cpp | 86 +++++++++++++++++------------------------------ source/screen.h | 7 +++- 2 files changed, 36 insertions(+), 57 deletions(-) diff --git a/source/screen.cpp b/source/screen.cpp index 3a0a62b..5847d57 100644 --- a/source/screen.cpp +++ b/source/screen.cpp @@ -46,7 +46,6 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) : window_(window), renderer_(renderer), 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}), dst_rect_({0, 0, param.game.width, param.game.height}) { @@ -66,7 +65,6 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) Screen::~Screen() { SDL_DestroyTexture(game_canvas_); - SDL_DestroyTexture(shader_canvas_); } // Limpia la pantalla @@ -88,75 +86,36 @@ void Screen::render() // Actualiza el contador de FPS ++fps_counter_; - // Actualiza y dibuja el efecto de flash en la pantalla + // Dibuja efectos y elementos sobre el game_canvas_ renderFlash(); - - // Atenua la pantalla renderAttenuate(); - - // Muestra la ayuda por pantalla OnScreenHelp::get()->render(); - - // Muestra información por pantalla renderInfo(); - - // Muestra las notificaciones Notifier::get()->render(); -#ifdef NO_SHADERS - // Vuelve a dejar el renderizador en modo normal + // Restablece el objetivo de renderizado al buffer de pantalla predeterminado SDL_SetRenderTarget(renderer_, nullptr); - // Borra el contenido previo - // SDL_SetRenderDrawColor(renderer_, border_color_.r, border_color_.g, border_color_.b, 0xFF); - // SDL_RenderClear(renderer_); + // Renderiza el contenido del game_canvas_ o aplica shaders según configuración + renderScreen(); +} - // Copia la textura de juego en el renderizador en la posición adecuada - if (shake_effect_.enabled) - { - SDL_RenderCopy(renderer_, game_canvas_, nullptr, nullptr); - } - SDL_RenderCopy(renderer_, game_canvas_, &src_rect_, &dst_rect_); - - // Muestra por pantalla el renderizador - SDL_RenderPresent(renderer_); +// Selecciona y ejecuta el método de renderizado adecuado basado en la configuración de shaders +void Screen::renderScreen() +{ +#ifdef NO_SHADERS + // Actualiza la pantalla con el contenido del game_canvas_ + presentGameCanvas(); #else if (options.video.shaders) { - // Dibuja sobre la textura de shaders - 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 + // Aplica shaders y renderiza el contenido shader::render(); } else { - // Vuelve a dejar el renderizador en modo normal - SDL_SetRenderTarget(renderer_, nullptr); - - // 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_); + // Actualiza la pantalla con el contenido del game_canvas_ + presentGameCanvas(); } #endif } @@ -216,7 +175,7 @@ void Screen::setVideoMode(ScreenVideoMode videoMode) std::ifstream f(Asset::get()->get(glsl_file).c_str()); std::string source((std::istreambuf_iterator(f)), std::istreambuf_iterator()); - shader::init(window_, shader_canvas_, source.c_str()); + shader::init(window_, game_canvas_, source.c_str()); #endif } } @@ -445,4 +404,19 @@ SDL_Point Screen::getNewPosition() new_pos.y = std::clamp(new_pos.y, 30, DM.h - new_height); 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_); } \ No newline at end of file diff --git a/source/screen.h b/source/screen.h index e2805b4..2166e51 100644 --- a/source/screen.h +++ b/source/screen.h @@ -31,7 +31,6 @@ private: SDL_Window *window_; // Ventana de la aplicación SDL_Renderer *renderer_; // El renderizador de la ventana 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 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 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 // Constructor