В настоящее время я использую GLKit для создания рисунка OpenGL. Я создал обычный UIViewController, а затем добавил подкласс GLKViewController внутри контейнера, чтобы сделать мой чертеж. Хотя сначала все работает нормально, если я позволяю моей программе работать в течение определенного периода времени (возможно, 15-30 минут), в конце концов он сбой и дает мне следующую ошибку.Создание автореализованного объекта внутри цикла запуска GLKViewController вызывает ошибку malloc
malloc: *** mmap(size=2097152) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Так что я включил malloc_error_break точки останова и трассировки стека указывает на следующий код.
-(NSArray*)meshes:(NSArray *)meshes sortedFromFrontToBack:(BOOL)sortedFromFrontToBack
{
NSMutableArray *sortedMeshes = meshes.mutableCopy;
[sortedMeshes sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
DSNode *mesh1 = obj1;
DSNode *mesh2 = obj2;
GLKVector3 depth1 = isnan(mesh1.boundingSphere.radius) ? mesh1.transformationState.position : mesh1.boundingSphere.center;
GLKVector3 depth2 = isnan(mesh2.boundingSphere.radius) ? mesh2.transformationState.position : mesh2.boundingSphere.center;
GLKMatrix4 mesh1ToCameraSpace = [mesh1 nodeToOtherNodeTransform:self];
GLKMatrix4 mesh2ToCameraSpace = [mesh2 nodeToOtherNodeTransform:self];
GLKVector3 depth1InCameraSpace = GLKMatrix4MultiplyVector3WithTranslation(mesh1ToCameraSpace, depth1);
GLKVector3 depth2InCameraSpace = GLKMatrix4MultiplyVector3WithTranslation(mesh2ToCameraSpace, depth2);
NSNumber *n1 = [NSNumber numberWithFloat:depth1InCameraSpace.z];
NSNumber *n2 = [NSNumber numberWithFloat:depth2InCameraSpace.z]; /* Breakpoint triggered here */
if(sortedFromFrontToBack)
{
return [n2 compare:n1];
}
return [n1 compare:n2];
}];
return sortedMeshes;
}
Как я заметил, то [NSNumber numberWithFloat:] вызов бросает ошибку таНос. Этот метод вызывается один раз каждый кадр из моего метода drawInRect GLKViewController. По сути, у меня есть класс, который отслеживает мои камеры и сетки, которые будут нарисованы OpenGL, и он сортирует их в пространстве камеры от переднего к заднему для непрозрачных сеток или назад к переднему для прозрачного перед их рисованием.
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClearColor(self.clearColor.r, self.clearColor.g, self.clearColor.b, self.clearColor.a);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
DSDirector *director = [DSDirector sharedDirector];
for(DSMesh *mesh in director.opaqueMeshes)
{
[mesh draw];
}
/* The director class keeps track of my scene's cameras and meshes and calls the above method to return the scene's transparent meshes properly sorted */
for(DSMesh *mesh in director.transparentMeshes)
{
[mesh draw];
}
}
Из того, что я прочитал, то autorelease пул должен стекать в конце каждого цикла выполнения, так что я не думаю, что создание кучу autoreleased объектов каждый кадр является проблемой, все они должны получить покраснение каждого кадра. Я профилировал свою программу и проверял любые утечки и не могу найти, и я тоже использую ARC, что должно минимизировать риск. Когда я просматриваю его, общая сумма байтов в байтах никогда не увеличивается, хотя общие байты быстро растут, и никаких утечек не обнаружено. Кроме того, didReceiveMemoryWarning никогда не срабатывает. Я в тупике.
Хм, похоже, что вы правы, автореализованные объекты не являются проблемой. Позаботился о тех вещах, которые вы указали, и я все еще получаю ошибку в malloc, просто ломаясь в другом месте.На этот раз я делаю некоторое руководство KVO свойства GLKVector3, а трассировка стека заканчивается на строке didChangeValueForKey: с той же самой ошибкой malloc mmap. Поскольку это похоже на проблему с памятью, я смотрел на Allocations/Leaks in Instruments, и все выглядит отлично, никаких утечек, количество живых байтов никогда не растет, просто не понимайте, куда идти оттуда. – Devin