ボリューム データを含む線形配列があります。データはグレーレベル、つまり 0 から 255 までの整数値です。
int width = 100;
int height = 100;
int depth = 100;
int *texture3DVolume = new int[width*height*depth];
memset(texture3DVolume,0,sizeof(int)*width*height*depth);
配列の一部を一定値の球状領域で埋めています。
int radius= 5;
int radius2=radius*radius;
int centerx = // some value in [5-95]
int centery = // some value in [5-95]
int centerz = // some value in [5-95]
int cxmin=centerx-radius;
int cxmax=centerx+radius;
int cymin=centery-radius;
int cymax=centery+radius;
int czmin = centerz-radius;
int czmax = centerz+radius;
for ( int x= cxmin; x<cxmax; x++)
{
int x2 = (x-centerx)*(x-centerx);
for ( int y=cymin; y<cymax; y++)
{
int x2y2= x2+(y-centery)*(y-centery);
int slice = textureSizeX* y + x;
for ( int z=czmin; z<czmax; z++)
{
int x2y2z2 = x2y2+(z-centerz)*(z-centerz);
if ( x2y2z2 < radius2 )
{
texture3DVolume[ txty*z+slice]=255;
}
}
}
}
ここでの問題は、キャッシュの局所性を高める線形配列にアクセスする必要があることです。このアプローチは正しいと思いますが、内側のループでは連続z
した値をループする必要があるため、私の場合は.txty*z
txty
データ アクセスの局所性を高めるには、ループをどのように変更すればよいですか?