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. Но загрузка изображений в качестве Материала и их обновление принесли самый удовлетворительный результат.