Screen: optimitzat el circuit de render en pantalla
This commit is contained in:
@@ -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_);
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user