Entendendo diferenças entre SDL Window, Surfaces e Rendering
Nessa minha jornada em fazer um jogo rpg no estilo top-down, programando em SLD e usando GO, encontrei muitos tutoriais ensinando como usar o SDL, mas quase todos são muito voltados para exemplos de código, com pouca explicação do que são os componentes do SDL apresentados.
Eu gosto de entender aquilo que estou fazendo e por que estou usando tal elemento no lugar de outro elemento.
E dessa forma comecei a ficar confuso, afinal, o que é uma Surface, Window e Renderer? Como são relacionadas e como se diferem.
E encontrei esse post no stackoverflow que mostra que não é só eu que estava confuso, era uma dúvida bem comum.
E como forma de estudo vou descrever minha compreensão sobre o assunto.
SDL Window, Surface e Renderer
O que são, para que servem e o que os diferem.
Software Blitting
Como iremos falar de 3 coisas que envolvem computação gráfica, acho importante primeiramente como as imagens são processadas na tela.
Bitmap
Primeiramente você precisa entender o que é um bitmap. bitmap é um arquivo de imagem não comprimido, ou seja, ele carrega todas as informações de pixel por pixel de uma imagem como é representado pelo computador, por coordenadas X, Y.
BLIT
O termo blit vem de bit block transfer ou “transferência de bloco bit”, e isso ocorre em bitmaps. A operação envolve ao menos dois bitmaps, uma fonte e destino. Você por imaginar um jogo 2D, como Legend of Zelda por exemplo, onde você irá precisar desenhar a grama, depois sobrepor com um outro bitmap como um arbusto e depois sobrepor com outro bitmap como o herói Link, isso tudo ocorre usando Blit.
No SDL temos o SDL_RenderCopy, que é usado extensivamente no desenvolvimento de games 2D, que é basicamente faz esse overlay descrito acima.
SDL Window
Representa a janela que onde será renderizado seu jogo ou qualquer outra coisa que você estiver fazendo com SDL. Tem atributos como largura, altura, se irá executar em Fullscreen, se é redimensionavel, se tem borda ou não e coisas do tipo.
SDL Surface
É simplesmente um estrutura que armazena informações de pixels usadas em software blitting
SDL Texture
É como o SDL Surface, até chamam ele de nova versão do SDL Surface, há inclusive métodos para converter o SDL Surface em SDL Texture. É uma estrutura que contém um eficiente, driver-especifico representação de informações de pixels.
Uma diferença significativa do SDL Surface, é que o Texture roda na GPU enquanto o Surface roda usando CPU.
SDL Renderer
Enquanto Blitting é um processo simples de copiar bits entre diferentes buffers, Renderizar envolve todo os processamentos gráficos necessários para chegar a imagem final desejada, isso pode envolver inúmeros blittings e processamentos de finalidade gráfica necessários.
O Renderer está atrelado a uma Window e só pode renderizar a ela.
Vamos ver alguns metodos que darão uma compreensão melhor do que pode ser feito.
SDL_SetRenderDrawColor(renderer, r, g, b, a);
Define a cor que é usada para limpar a tela.
SDL_RenderClear(renderer);
limpa o renderer com a cor que você definiu acima.
SDL_RenderCopy(SDL_Renderer* renderer, SDL_Texture* texture, SDL_Rect* srcrect, SDL_Rect* dstrect)
É um dos métodos mais usados, recebe o renderer, a textura, um retângulo que refine parte da textura para aplicar e um outro retângulo que vai definir se a textura precisa mudar de escala, ser esticada ou comprimida.
SDL_RenderPresent(renderer);
Aplica as alterações para a janela.
encerrando
Espero que esse post ajude a esclarecer pessoas que como eu tinham duvidas sobre as diferenças desses elementos do SDL.