Increase performance of Tick by partially unrolling Calc* functions.
This commit is contained in:
parent
e2e9b75d31
commit
605798b51b
2 changed files with 102 additions and 28 deletions
|
|
@ -232,8 +232,8 @@ class FireTexture
|
|||
// prepare the lut
|
||||
for ( int i=0; i<256; i++ )
|
||||
{
|
||||
double x = pal[i].r+((pal[i].g/16)*256)%4096;
|
||||
double y = (pal[i].g/16)+(pal[i].b*16);
|
||||
double x = pal[i].r+((pal[i].g>>4)<<8)&4095;
|
||||
double y = (pal[i].g>>4)+(pal[i].b<<4);
|
||||
blitterlut[i] = (x,y)/4096.+(1.,1.)/8192.;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ extend class FireTexture
|
|||
private int renderheat; // overall intensity
|
||||
|
||||
// direct pixel access wrapper functions
|
||||
// not used by the Calc code, would reduce performance
|
||||
private uint GetPixel( uint x, uint y )
|
||||
{
|
||||
// ensure coords are wrapped
|
||||
|
|
@ -27,33 +28,74 @@ extend class FireTexture
|
|||
y &= vmask;
|
||||
pixels[x+y*width] = c;
|
||||
}
|
||||
private Color GetPixelRGB( uint x, uint y )
|
||||
{
|
||||
// ensure coords are wrapped
|
||||
x &= umask;
|
||||
y &= vmask;
|
||||
return pal[pixels[x+y*width]];
|
||||
}
|
||||
|
||||
private uint LookupFiretable( uint a, uint b, uint c, uint d )
|
||||
{
|
||||
return firetable[min(a+b+c+d,1023)];
|
||||
}
|
||||
|
||||
// heat propagation with bRising (triangle shifted two pixels down)
|
||||
private void CalcWrapFire()
|
||||
{
|
||||
uint mid, left, right, up;
|
||||
for ( uint y=0; y<height; y++ )
|
||||
uint y;
|
||||
for ( y=0; y<height-2; y++ )
|
||||
{
|
||||
for ( uint x=0; x<width; x++ )
|
||||
mid = pixels[(y+1)*width];
|
||||
left = pixels[(width-1)+(y+1)*width];
|
||||
right = pixels[1+(y+1)*width];
|
||||
up = pixels[(y+2)*width];
|
||||
pixels[y*width] = firetable[mid+left+right+up];
|
||||
for ( uint x=1; x<width-1; x++ )
|
||||
{
|
||||
mid = GetPixel(x,y+1);
|
||||
left = GetPixel(x-1,y+1);
|
||||
right = GetPixel(x+1,y+1);
|
||||
up = GetPixel(x,y+2);
|
||||
PutPixel(x,y,LookupFiretable(mid,left,right,up));
|
||||
mid = pixels[x+(y+1)*width];
|
||||
left = pixels[(x-1)+(y+1)*width];
|
||||
right = pixels[(x+1)+(y+1)*width];
|
||||
up = pixels[x+(y+2)*width];
|
||||
pixels[x+y*width] = firetable[mid+left+right+up];
|
||||
}
|
||||
mid = pixels[(width-1)+(y+1)*width];
|
||||
left = pixels[(width-2)+(y+1)*width];
|
||||
right = pixels[(y+1)*width];
|
||||
up = pixels[(width-1)+(y+2)*width];
|
||||
pixels[(width-1)+y*width] = firetable[mid+left+right+up];
|
||||
}
|
||||
y = height-2;
|
||||
{
|
||||
mid = pixels[(y+1)*width];
|
||||
left = pixels[(width-1)+(y+1)*width];
|
||||
right = pixels[1+(y+1)*width];
|
||||
up = pixels[0];
|
||||
pixels[y*width] = firetable[mid+left+right+up];
|
||||
for ( uint x=1; x<width-1; x++ )
|
||||
{
|
||||
mid = pixels[x+(y+1)*width];
|
||||
left = pixels[(x-1)+(y+1)*width];
|
||||
right = pixels[(x+1)+(y+1)*width];
|
||||
up = pixels[x];
|
||||
pixels[x+y*width] = firetable[mid+left+right+up];
|
||||
}
|
||||
mid = pixels[(width-1)+(y+1)*width];
|
||||
left = pixels[(width-2)+(y+1)*width];
|
||||
right = pixels[(y+1)*width];
|
||||
up = pixels[(width-1)];
|
||||
pixels[(width-1)+y*width] = firetable[mid+left+right+up];
|
||||
}
|
||||
y = height-1;
|
||||
{
|
||||
mid = pixels[width];
|
||||
left = pixels[(width-1)];
|
||||
right = pixels[1];
|
||||
up = pixels[2*width];
|
||||
pixels[y*width] = firetable[mid+left+right+up];
|
||||
for ( uint x=1; x<width-1; x++ )
|
||||
{
|
||||
mid = pixels[x+width];
|
||||
left = pixels[(x-1)+width];
|
||||
right = pixels[(x+1)+width];
|
||||
up = pixels[x+2*width];
|
||||
pixels[x+y*width] = firetable[mid+left+right+up];
|
||||
}
|
||||
mid = pixels[(width-1)+width];
|
||||
left = pixels[(width-2)+width];
|
||||
right = pixels[width];
|
||||
up = pixels[(width-1)+2*width];
|
||||
pixels[(width-1)+y*width] = firetable[mid+left+right+up];
|
||||
}
|
||||
}
|
||||
// ... without bRising (triangle shifted one pixel down)
|
||||
|
|
@ -64,16 +106,48 @@ extend class FireTexture
|
|||
uint temp[256];
|
||||
for ( uint i=0; i<width; i++ ) temp[i] = pixels[i];
|
||||
uint mid, left, right, up;
|
||||
for ( uint y=0; y<height; y++ )
|
||||
uint y;
|
||||
for ( y=0; y<height-1; y++ )
|
||||
{
|
||||
for ( uint x=0; x<width; x++ )
|
||||
mid = pixels[y*width];
|
||||
left = pixels[(width-1)+y*width];
|
||||
right = pixels[1+y*width];
|
||||
up = pixels[(y+1)*width];
|
||||
pixels[y*width] = firetable[mid+left+right+up];
|
||||
for ( uint x=1; x<width-1; x++ )
|
||||
{
|
||||
mid = GetPixel(x,y);
|
||||
left = GetPixel(x-1,y);
|
||||
right = GetPixel(x+1,y);
|
||||
up = (y==height-1)?temp[x&255]:GetPixel(x,y+1);
|
||||
PutPixel(x,y,LookupFiretable(mid,left,right,up));
|
||||
mid = pixels[x+y*width];
|
||||
left = pixels[(x-1)+y*width];
|
||||
right = pixels[(x+1)+y*width];
|
||||
up = pixels[x+(y+1)*width];
|
||||
pixels[x+y*width] = firetable[mid+left+right+up];
|
||||
}
|
||||
mid = pixels[(width-1)+y*width];
|
||||
left = pixels[(width-2)+y*width];
|
||||
right = pixels[y*width];
|
||||
up = pixels[(width-1)+(y+1)*width];
|
||||
pixels[(width-1)+y*width] = firetable[mid+left+right+up];
|
||||
}
|
||||
y = height-1;
|
||||
{
|
||||
mid = pixels[y*width];
|
||||
left = pixels[(width-1)+y*width];
|
||||
right = pixels[1+y*width];
|
||||
up = temp[0];
|
||||
pixels[y*width] = firetable[mid+left+right+up];
|
||||
for ( uint x=1; x<width-1; x++ )
|
||||
{
|
||||
mid = pixels[x+y*width];
|
||||
left = pixels[(x-1)+y*width];
|
||||
right = pixels[(x+1)+y*width];
|
||||
up = temp[x];
|
||||
pixels[x+y*width] = firetable[mid+left+right+up];
|
||||
}
|
||||
mid = pixels[(width-1)+y*width];
|
||||
left = pixels[(width-2)+y*width];
|
||||
right = pixels[y*width];
|
||||
up = temp[width-1];
|
||||
pixels[(width-1)+y*width] = firetable[mid+left+right+up];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue