[SDL] Best way to implement a simple "Framebuffer"

Patrick Baggett baggett.patrick at gmail.com
Mon Sep 26 08:02:08 PDT 2011


Wait, if he's not using an SDL surface, why is he posting here? This is the
cult of SDL. SHUN THE DISBELIEVER. :D

But seriously, yeah, don't plot pixels directly to the hardware -- the
hardware is designed to do stuff in batches and can apply transformations
like scaling. So in other words, batch all of your pixel operations by doing
them on a SDL surface then use the hardware to perform scaling.

On Mon, Sep 26, 2011 at 9:36 AM, Benjamin Shadwick <benshadwick at gmail.com>wrote:

> Maybe try creating a 32x32 pixel SDL surface and set individual pixels on
> that, then have SDL stretch it to the desired size when blitting it to the
> screen surface.
>
> On Mon, Sep 26, 2011 at 7:31 AM, nils.stec <nils-stec at spectra-light.de>wrote:
>
>> **
>> For a 6502 emulator i'm writing at the moment i'm searching for a
>> efficient way to use SDL with it.
>>
>> This emu has a 64k address space, starting at 0x200 there are 1024 bytes.
>> The graphics screen is 32x32 pixels in it's size. Every byte is a one color.
>> It's compatbile to the online-emu located here:
>> http://www.6502asm.com/beta/index.html
>> If you want to try it, choose an example from the drop down list, click on
>> compile and then click on run. you will see the graphics output on the
>> window to the right.
>>
>> The color defines are:
>>
>>
>>
>>  Quote:
>>
>>
>>
>> Black ($0)
>> White ($1)
>> Red ($2)
>> Cyan ($3)
>> Purple ($4)
>> Green ($5)
>> Blue ($6)
>> Yellow ($7)
>> Orange ($[image: Cool]
>> Brown ($9)
>> Light red ($a)
>> Dark gray ($b)
>> Gray ($c)
>> Light green ($d)
>> Light blue ($e)
>> Light gray ($f)
>>
>>
>>
>>
>> At the moment i have a function which calculates the pixel position, the
>> corresponding sdl color value in RGBA format and draws a filled box of 8x8
>> pixels for one pixel in this 32x32 byte memory space.
>>
>>
>>
>>
>>  Code:
>>
>>
>> int set_px(int x, int y, unsigned char pxcol) {
>>    unsigned char r,g,b,a=255;
>>    pxcol &= 0x0f;
>>    switch(pxcol) {
>>       case 0:      // black
>>          r = 0; g = 0;   b = 0;
>>          break;
>>       case 1:      // white
>>          r = 255; g = 255; b = 255;
>>          break;
>>       case 2:      // red
>>          r = 135; g = 0;   b = 0;
>>          break;
>>       case 3:      // cyan
>>          r = 40; g = 240; b = 255;
>>          break;
>>       case 4:      // purple
>>          r = 200; g = 70; b = 200;
>>          break;
>>       case 5:      // green
>>          r = 0; g = 255;   b = 0;
>>          break;
>>       case 6:      // blue
>>          r = 0; g = 0; b = 255;
>>          break;
>>       case 7:      // yellow
>>          r = 230; g = 220; b = 10;
>>          break;
>>       case 8:      // orange
>>          r = 230; g = 155; b = 85;
>>          break;
>>       case 9:      // brown
>>          r = 100; g = 70; b = 0;
>>          break;
>>       case 10:   // light red
>>          r = 255; g = 120; b = 120;
>>          break;
>>       case 11:   // dark gray
>>          r = 50; g = 50;   b = 50;
>>          break;
>>       case 12:   // gray
>>          r = 100; g = 100; b = 100;
>>          break;
>>       case 13:      // light green
>>          r = 170; g = 255; b = 100;
>>          break;
>>       case 14:   // lblue
>>          r = 10; g = 160; b = 240;
>>          break;
>>       case 15:   // light grad
>>          r = 180; g = 180; b = 180;
>>          break;
>>       default:
>>          r = 0; g = 0; b = 0;
>>          a = 255;
>>          break;
>>    }
>>
>>    boxRGBA(screen, x*PIXEL_SIZE, y*PIXEL_SIZE, (x*PIXEL_SIZE)+PIXEL_SIZE,
>> (y*PIXEL_SIZE)+PIXEL_SIZE, r, g, b, a);
>>
>>    return 0;
>> }
>>
>>
>>
>> This isn't very efficient. On my Core2Duo with an onboard Intel card
>> running Linux with the opensource drivers i get about 30 frames per second,
>> on my Phenom II with an Radeon 3000 running Linux with the closed source
>> ATI-Drivers (fglrx) i get around 300 frames per second.
>>
>> On my Pentium 4, 1,4Ghz, Nvidia Geforce 4 MX440 64MB, i get with the
>> closed source nvidia drivers about 20 frames per second.
>> This is the screen updating routine:
>>
>>
>>
>>
>>  Code:
>>
>>
>>       for(x = 0; x < 32; x++) {
>>          for(y = 0; y < 32; y++) {
>>             addr = graphix_address+(x+(y*32));  // calculate address
>> starting at 0x200, 1 line is 32 bytes in size, 32 lines on screen
>>             set_px(x,y, get6502memory(addr));    // give set_px the byte
>> in "graphics" memory
>>          }
>>       }
>>
>>
>>
>>
>> I hope anyone of you know a better and faster solution for this.
>>
>>
>> ------------------------------
>>
>> If you're interested in Embedded Linux and Microcontrollers have a look at
>> my (german) page:
>> http://krumeltee.wordpress.com/
>>
>> _______________________________________________
>> SDL mailing list
>> SDL at lists.libsdl.org
>> http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
>>
>>
>
>
> --
> - Ben S.
>
>
> _______________________________________________
> SDL mailing list
> SDL at lists.libsdl.org
> http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20110926/0fbbf83e/attachment.htm>


More information about the SDL mailing list