change rendering to use textures, massive performance improvement

This commit is contained in:
opfez 2021-09-27 09:59:03 +02:00
parent e9f32da983
commit bae31894a7
1 changed files with 21 additions and 3 deletions

24
main.c
View File

@ -22,6 +22,7 @@ const rgb_t BLUE = {0, 0, 255, 255};
typedef struct {
SDL_Renderer *renderer;
SDL_Window *window;
SDL_Texture *tex;
rgb_t *canvas;
} sdl_state_t;
@ -69,6 +70,11 @@ init_sdl(void)
SDL_RenderClear(ret.renderer);
SDL_RenderPresent(ret.renderer);
ret.tex = SDL_CreateTexture(ret.renderer,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STATIC,
W, H);
ret.canvas = malloc(sizeof(rgb_t) * W * H);
clear_canvas(ret.canvas, (rgb_t){0, 0, 0, 255});
@ -80,22 +86,34 @@ free_sdl(sdl_state_t state)
{
SDL_DestroyRenderer(state.renderer);
SDL_DestroyWindow(state.window);
SDL_DestroyTexture(state.tex);
free(state.canvas);
SDL_Quit();
}
uint32_t
rgb_to_int(rgb_t c)
{
return (((uint32_t)c.a << 24)
| ((uint32_t)c.r << 16)
| ((uint32_t)c.g << 8)
| ((uint32_t)c.b));
}
// TODO: Highly unefficient. Makes a *lot* of SDL calls.
void
render(sdl_state_t state)
{
uint32_t pixels[H*W];
for (size_t y = 0; y < H; y++) {
for (size_t x = 0; x < W; x++) {
rgb_t curr = state.canvas[x + y * W];
SDL_SetRenderDrawColor(state.renderer, curr.r, curr.g, curr.b, curr.a);
SDL_RenderDrawPoint(state.renderer, x, y);
pixels[x + y * W] = rgb_to_int(state.canvas[x + y * W]);
}
}
SDL_UpdateTexture(state.tex, NULL, pixels, W * sizeof(uint32_t));
/* present the texture */
SDL_RenderCopy(state.renderer, state.tex, NULL, NULL);
SDL_RenderPresent(state.renderer);
}