Я пишу приложение, которое создает динамический ландшафт 640 * 480 (меняет каждый кадр).Каждый ландшафт хранится в файле необработанных данных, который представляет собой строку значений (плавающих) высот.До сих пор я мог последовательно читать файлы в память и динамически создавать сетку на основе значений высоты каждого кадра (и частота кадров на самом деле разумна), но я максимально увеличился до 20 кадров, прежде чем мое приложение завершит работу без ошибок или стека.след.
Я подозреваю, что я подхожу к этому неправильно.Как мне передать эти данные так, чтобы мне не приходилось хранить каждый кадр в памяти?
Вот раздел из моего класса данных, который содержит коллекцию terrains:
- (void)addModelWithID:(int)modelID;
{
NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
NSString* fileName = [NSString stringWithFormat:@"depth_%i.raw", modelID];
NSString* fullPath = [resourcePath stringByAppendingPathComponent:fileName];
NSData *myData = [NSData dataWithContentsOfFile:fullPath];
if (!myData)
return;
const float *data = [myData bytes];
int meshWidth = 640;
int meshHeight = 480;
Model *kModel = [[Model alloc] init];
int indicesPtr = 0;
int depthPtr = 2;
for (int y=0;y<meshHeight;y++) // Loop through y pixels
{
for (int x=0;x<meshWidth;x++) // Loop through x pixels
{
// Set up vertex positions
int index = y*meshWidth+x;
float xpos = ((float)x/(float)(meshWidth-1)) - 0.5f;
float ypos = ((float)y/(float)(meshHeight-1)) - 0.5f;
float zpos = (float)data[index];
kModel.vertices1[index*3+0] = xpos;
kModel.vertices1[index*3+1] = ypos;
kModel.vertices1[index*3+2] = zpos;
// Create a new index based on whether the current line is even or odd (flipped horizontally if odd)
int _index = (y%2==0) ? index : (y*meshWidth) + ((meshWidth-1)-x);
//Create the first index
kModel.indices[indicesPtr++] = _index;
// Create the second index
if ((x<meshWidth-1) || (x==meshWidth-1 && y==meshHeight-2))
kModel.indices[indicesPtr++] = _index+meshWidth;
}
}
}
// Add the model to the data object
[Models addObject:kModel];
[kModel release];
}
И мой код рисования (каждый кадр, который я называю своей территорией, надеюсь, до 500 или около того, но я не превышаю ~ 20:
{
...
Model *kModel = [kData.kinectModels objectAtIndex:sequenceCurrentFrame];
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)kModel.vertices1);
glEnableVertexAttribArray(vertexHandle);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (const GLfloat*)&modelViewProjection.data[0]);
glDrawElements(GL_TRIANGLE_STRIP, kModel.numIndices, GL_UNSIGNED_SHORT, (const GLvoid*)kModel.indices);
...
}
Большое спасибо за вашу помощь,
Джош