Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Nopea viiva SDL:ällä

DumTom [30.04.2011 15:19:14]

#

Kuinka piirtää mahdollisimman nopeasti viiva?
Tossa kehittelemäni viivan piirto.
Kuinka optimoida sitä lisää?
Tai löytyisikö jostain SDL kirjastoa jossa olisi nopea viiva?
Myös nopeaa pixeliä kaipaisin.
Nuo bufferin lukitukset ja vapautukset vievät Plotissa aikaa...

void Line(Uint16 left,Uint16 top,Uint16 right,Uint16 bottom,Uint8 r, Uint8 g, Uint8 b)
{
Uint32 g_Color=SDL_MapRGB(screen->format,r,g,b);
char* g_pData;
SDL_LockSurface(screen);


Uint16 temp,dx,dy,x,y,x_sign,y_sign,flag;
dx=abs(right-left);dy=abs(bottom-top);

if (((dx>=dy) && (left>right)) || ((dy>dx) && (top>bottom)))
   {
   temp=left;
   left=right;
   right=temp;
   temp=top;
   top=bottom;
   bottom=temp;
   }
if ((bottom-top) < 0) y_sign=-1;else y_sign=1;
if ((right-left) < 0) x_sign=-1;else x_sign=1;
if (dx>=dy)
   {
   for (x=left,y=top,flag=0;x<=right;x++,flag+=dy)
       {
       if (flag>=dx)
	  {
	  flag -=dx;
	  y+=y_sign;
	  }
       //grab pixel pointer
			g_pData=(char*)screen->pixels;

			//vertical offset
			g_pData+=(y*screen->pitch);

			//horizontal offset
			g_pData+=(x*screen->format->BytesPerPixel);

			//copy from color to frame buffer
			memcpy(g_pData,&g_Color,screen->format->BytesPerPixel);

       }
   }
else
   {
   for (x=left,y=top,flag=0;y<=bottom;y++,flag+=dx)
       {
       if (flag>=dy)
	  {
	  flag -=dy;
	  x+=x_sign;
	  }
       //grab pixel pointer
			g_pData=(char*)screen->pixels;

			//vertical offset
			g_pData+=(y*screen->pitch);

			//horizontal offset
			g_pData+=(x*screen->format->BytesPerPixel);

			//copy from color to frame buffer
			memcpy(g_pData,&g_Color,screen->format->BytesPerPixel);

      }
   }
SDL_UnlockSurface(screen);
}

Jokotai [30.04.2011 15:38:14]

#

http://sdl-draw.sourceforge.net/

Metabolix [30.04.2011 15:49:22]

#

Eikö looginen päättely suju?

Ongelma: Lukitukset vievät aikaa.

Ratkaisu: Vähennä lukituksia.

Toteutus: Älä lukitse pintaa joka välissä, vaan laita vain yksi lukitus koko piirtohomman ympärille.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta