[SDL] Bad performence problems

René Dudfield renesd at gmail.com
Thu Aug 10 18:18:17 PDT 2006


Try to get rid of the function calls, sqrt, and if/else

Try and use some of the optimized blitters for the task instead... if
that's possible.  Or take a look at the source for them to see how
they are made fast.

It might be a lot of work, so is there anything else you could do instead?



On 8/11/06, darkplastic <darkeninghorizons at hotmail.com> wrote:
>
> I have been working on this one algorithm for days to try and make it work at
> a reasonable speed but to no avail...was hoping meyb u guys could help!
> :)....firstly my coputer specs: athlon 2100xp 1gig ram r9800pro gfx
> card.....
>                At the moment i am writing a top down shooter, and i am
> trying to write an algorithm that darkens the whole screen apart from a
> circular area around the player using the folliwng algorithm that i made:
>
> void darkenLandscape(SDL_Surface *source,int radius,int x,int y){
>         // Draw to screen
>         int yofs = 0,j=0,ofs=0;
>         for (int i = 0; i < HEIGHT; i++)
>         {
>                 for (j = 0, ofs = yofs; j < WIDTH; j++, ofs++)
>                 {
>                         int dx= x-j;
>                         int dy= y-i;
>                         float length=sqrt((float)((dx*dx)+(dy*dy)));
>
>                         Uint32 pixel = getPixel(source,j,i);
>
>                         Uint8 sourcer = pixel;
>                         Uint8 sourceg = pixel>>8;
>                         Uint8 sourceb = pixel>>16;
>
>                         if(length>radius){
>                                 sourcer/=4;
>                                 sourceg/=4;
>                                 sourceb/=4;
>                         }
>                         else{
>                                 //Avoid divide by zero error
>                                 double mod = 1+3*(1-((radius-length)/radius));
>                                 sourcer=(Uint8)(sourcer/(mod+0.1));
>                                 sourceg=(Uint8)(sourceg/(mod+0.1));
>                                 sourceb=(Uint8)(sourceb/(mod+0.1));
>                         }
>                         Uint32 *pixels = source->pixels;
>                         pixel = (sourcer <<  0)|(sourceg <<  8)|(sourceb << 16);
>                         pixels[ofs] = pixels[ofs]/2;}
>                 }
>                 yofs += PITCH;
>         }
> }
>
> Now i know that it definately works (see attached screenshot) however the
> most i can get out of it is 16 or so fps which seems rediculous!!...i have
> tried running it in fullscreen mode windowed mode using sdl_flip and
> sdl_updaterec but to no avail....also before this algorithm is called the
> source surface is locked. Can any1 help me out here its driving me crazy!!!!
> Thanks so much in advance :)
>
> -James Grafton
> --
> View this message in context: http://www.nabble.com/Bad-performence-problems-tf2088149.html#a5755364
> Sent from the SDL forum at Nabble.com.
>
>
> _______________________________________________
> SDL mailing list
> SDL at libsdl.org
> http://www.libsdl.org/mailman/listinfo/sdl
>




More information about the SDL mailing list