[SDL] Better performance needed - am I doing this right?

Rúben Lício rubenlr at gmail.com
Wed Jun 6 10:08:35 PDT 2007


On 6/6/07, Colin Tuckley <colin at tuckley.org> wrote:
>
> I need to improve the drawing performance in my BASIC emulator which uses
> SDL for it's output (on a Linux system).
>
> Because I don't know what the foreground and background colours will be
> until I actually come to draw the character I'm not keeping a set of
> memory
> mapped character images and just blitting them. Instead, (partly for
> historical reasons) I have a set of 8 byte pixel masks for each of the 8x8
> characters.
>
> My (extraneous logic stripped out) code looks like this:
>
>   if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) {
>     fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
>     return FALSE;
>   }
>
>   screen0 = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, 0);
>   if (!screen0) {
>     fprintf(stderr, "Failed to open screen: %s\n", SDL_GetError());
>     return FALSE;
>   }
>
>   fontbuf = SDL_CreateRGBSurface(SDL_SWSURFACE,   8,   8, 32,
>              0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);
>   sdl_fontbuf = SDL_ConvertSurface(fontbuf, screen0->format, 0);
>   /* copy surface to get same format as main windows */
>   SDL_FreeSurface(fontbuf);


SDL_HWSURFACE normaly is faster then SDL_SWSURFACE.

The idea being that I will draw the character in fontbuf and then blit it
> into screen0. The char drawing code looks like:
>
> void sdlchar(char ch) {
>   int32 y, line;
>   place_rect.x = xtext * 8;
>   place_rect.y = ytext * 8;
>   SDL_FillRect(sdl_fontbuf, NULL, tb_colour);
>   for (y = 0; y < 8; y++) {
>     line = sysfont[ch-' '][y];
>     if (line != 0) {
>       if (line & 0x80) *((Uint32*)sdl_fontbuf->pixels + 0 +y*8) =
> tf_colour;
>       if (line & 0x40) *((Uint32*)sdl_fontbuf->pixels + 1 +y*8) =
> tf_colour;
>       if (line & 0x20) *((Uint32*)sdl_fontbuf->pixels + 2 +y*8) =
> tf_colour;
>       if (line & 0x10) *((Uint32*)sdl_fontbuf->pixels + 3 +y*8) =
> tf_colour;
>       if (line & 0x08) *((Uint32*)sdl_fontbuf->pixels + 4 +y*8) =
> tf_colour;
>       if (line & 0x04) *((Uint32*)sdl_fontbuf->pixels + 5 +y*8) =
> tf_colour;
>       if (line & 0x02) *((Uint32*)sdl_fontbuf->pixels + 6 +y*8) =
> tf_colour;
>       if (line & 0x01) *((Uint32*)sdl_fontbuf->pixels + 7 +y*8) =
> tf_colour;
>     }
>   }
>   SDL_BlitSurface(sdl_fontbuf, &font_rect, screen0, &place_rect);
>   if (echo) SDL_Flip(screen0);


SDL_Flip works nice with doublebuffer active. If you dont have double buffer
active, try to use SDL_UpdateRects way.

}
>
> The "echo" flag is there so that I only do the buffer flip when I need to
> actually see the output (so it's clear when I'm outputting multiple chars
> until the last one).
>
> Comments and suggestions please.
>
> Colin
>
> --
> Colin Tuckley      |  colin at tuckley.org  |  PGP/GnuPG Key Id
> +44(0)1903 236872  |  +44(0)7799 143369  |     0x1B3045CE
>
> Banging your head against the wall uses 120 calories an hour.
> _______________________________________________
> SDL mailing list
> SDL at lists.libsdl.org
> http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
>



-- 
Rúben Lício Reis

Game Developer
Linux user #433535
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20070606/f63c55f2/attachment.html 


More information about the SDL mailing list