Scenekit: объекты становятся невидимыми после добавления нескольких объектов (Objective-C)

Я строю игру со SceneKit. Он основан на SCNBox, которые добавляются и удаляются. В конце к корневому узлу добавляется около 30 блоков.

// 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";
    }

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

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

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

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

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

self.gameView.showsStatistics = YES;

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

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

С уважением

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам