2012-02-21 5 views
0

As in my previous question, Я заинтересован в загрузке .raw файла массива томов в массив байтов. Я думаю, что использование трехмерного байтового массива упростит индексирование координат X, Y, Z, но я не уверен в размере чтения, который должен использовать для загрузки тома. Будет ли это объявление размера позволять мне правильно индексировать данные тома?Загрузка трехмерного байтового массива из .raw-файла

int XDIM=256, YDIM=256, ZDIM=256; 
const int size = XDIM*YDIM*ZDIM; 
bool LoadVolumeFromFile(const char* fileName) { 

    FILE *pFile = fopen(fileName,"rb"); 
    if(NULL == pFile) { 
    return false; 
    } 

    GLubyte* pVolume=new GLubyte[XDIM][YDIM][ZDIM]; 
    fread(pVolume,sizeof(GLubyte),size,pFile); // <-is this size ok? 
    fclose(pFile); 
+1

Строго говоря, ваш пример кода - это C++, а не C (поскольку он использует 'new'). Этот размер будет считывать достаточное количество байтов из файла, чтобы заполнить * pVolume, если в файле достаточно данных. Но я мог бы объявить его как 'size = sizeof (GLubyte [XDIM] [YDIM] [ZDIM])' на всякий случай, если вы когда-либо измените тип данных 16, 32, n-бит. –

ответ

0

Из кода вы разместивший вызова Fread() является безопасным, но учтите, если 3D-массив является лучшим выбором структуры данных.

Я предполагаю, что вы делаете какой-то рендеринг, когда используете GLubyte. И, конечно же, чтобы сделать любой рендеринг, вам нужно получить доступ к вершине, определенной в 3D-пространстве. Это приведет к:

pVolume[vertIndex][vertIndex][vertIndex] 

Это будет постоянно вызывать избиение вашего cahce. Память будет выложена во все xs сначала, затем все ys, а затем все zs. Таким образом, каждый раз, когда вы переходите с x на y на z, вы можете попасть в кеш-мисс и очень медленный перфоманс.