2016-09-09 2 views
0

Я создаю игру с SceneKit. Он основан на SCNBoxes, которые добавляются и удаляются. В конце есть 30 ящиков, добавленных в корневой узел.Scenekit: Объекты становятся невидимыми после добавления нескольких объектов (Objective-C)

// Prepare Surface Layer for Blocks 
    self.colorOfBlock = [CALayer layer]; 
    self.colorOfBlock.frame = CGRectMake(0, 0, 1000, 1000); 
    self.colorOfBlock.backgroundColor = [UIColor colorWithHue:0 saturation:1 brightness:1 alpha:1].CGColor; 

    self.textLayer = [CATextLayer layer]; 
    self.textLayer.frame = self.colorOfBlock.bounds; 
    self.textLayer.fontSize = 750;//self.colorOfBlock.bounds.size.height; 
    self.textLayer.string = @"2"; 
    self.textLayer.alignmentMode = kCAAlignmentCenter; 
    self.textLayer.foregroundColor = [UIColor blackColor].CGColor; 

    [self.textLayer display]; 
    [self.colorOfBlock addSublayer:self.textLayer]; 

    // Prepare Material for the Block 
    SCNMaterial *material = [SCNMaterial material]; 
    material.diffuse.contents = self.colorOfBlock; 

    // Create the Block 
    self.blockNode = [SCNNode node]; 
    self.blockNode.geometry = [SCNBox boxWithWidth:0.95 height:0.95 length:0.95 chamferRadius:0.1]; 
    self.blockNode.geometry.firstMaterial = material; 
    self.blockNode.position = position; 

    // Setup the physics body 
    self.blockNode.physicsBody = [SCNPhysicsBody dynamicBody]; 
    self.blockNode.physicsBody.affectedByGravity = NO; 
    self.blockNode.physicsBody.categoryBitMask = CollisionCategoryBlock; 
    self.blockNode.physicsBody.contactTestBitMask = CollisionCategoryBorder | CollisionCategoryBlock; 
    self.blockNode.physicsBody.collisionBitMask = CollisionCategoryBorder | CollisionCategoryBlock; 
    self.blockNode.physicsBody.angularVelocityFactor = SCNVector3Make(0, 0, 0); 

    [self addChildNode:self.blockNode]; 

    self.gameValue = 2; 
    if (position.z < 1) { 
     self.name = @"Front"; 
    } else { 
     self.name = @"Back"; 
    } 

Через некоторое время текстовый слой, похоже, исчезнет. Если добавить новые блоки, они больше не имеют текстового слоя. И еще один побочный эффект заключается в том, что старые textLayers на существующих блоках больше не обновляются.

На следующем шаге новые блоки становятся невидимыми. Или лучше сказать - они никогда не получают CALayer. Но физические тела все еще работают.

И иногда вид падает. Отладчик говорит, что что-то вроде положения области сбоя не может быть найдено. После этого вид деформируется. Но я все еще могу назвать SCNActions, который очищает представление и отображает все созданные объекты, которые НЕ являются этими блоками, как я опубликовал. Эти блоки полностью выбиты из поля зрения.

Кстати, когда я настраиваю «phonglighttype» для этих блоков, этот прослушивающий каскад происходит раньше.

Есть еще одна вещь, которую я заметил. Когда я вкладка из App (протестировано с iPhone 5) и вкладки снова через некоторое время, шоу

self.gameView.showsStatistics = YES; 

на панели GPU голубая линия. Через 2 или 3 секунды синяя полоса исчезнет, ​​а полноцветная панель графического процессора показывает, что она готова к использованию. И все работает так, как должно. Через некоторое время эти блоки снова становятся невидимыми. Если я снова выберет и снова закрою, вновь добавленные блоки снова будут видны.

Как-то я думаю, что я спам в кэше своего устройства, пока приложение не сработает. Но Xcode нет полезного намека. Интересно, может ли опция очистить кеш viewControllers решить эту проблему - если есть опция для этого.

С наилучшими пожеланиями

ответ

0

я не решил его полностью, но я решил заменить каждую часть CALayer и CATextLayer с общим

material.diffuse.contents = [arrayOfTextures objectAtIndex:certainImage]; 

С более высоким разрешением (например, Iphone 6 имеет) это сделал что CALayer вызывает какую-то графическую ошибку. Но простое предварительное изображение (из imageArray) улучшает производительность в значительной степени и предотвращает сбои.

Я не могу точно сказать, нет ли способа решить проблему с помощью подхода CALayer. Но загрузка изображений в качестве Материала и их обновление принесла самый удовлетворительный результат.

Смежные вопросы