BLOG

I’m smart enough to know that I’m dumb.

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.