Scenekit:添加多个对象后对象变得不可见(Objective-C)
Scenekit: Objects become invisible after several objects are added (Objective-C)
我正在使用 SceneKit 构建游戏。它基于添加和删除的 SCNBoxes。最后有大约 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 似乎消失了。如果添加了新块,它们将不再有 textLayer。另一个副作用是现有块上的旧 textLayers 不再更新。
在下一步中,新添加的块将变得不可见。或者更确切地说——他们永远不会得到 CALayer。但是物理体还在工作。
有时视图会崩溃。调试器说找不到崩溃区域的位置。在此之后视图变形。但我仍然可以调用 SCNActions 来清除视图并显示所有创建的对象,这些对象不是我发布的这些块。这些块完全被踢出了视图。
顺便说一下,当我为这些块设置 "phonglighttype" 时,这个窃听级联发生得更早。
我还注意到一件事。当我退出应用程序(从 iPhone 5 测试)并在一段时间后再次进入时,
self.gameView.showsStatistics = YES;
在 GPU 条上显示一条蓝线。 2 或 3 秒后,蓝色条消失,完整的绿色 GPU 条显示它已准备好使用。一切都像它应该做的那样工作。一段时间后,这些块再次变得不可见。如果我再次退出并再次进入,新添加的块将再次可见。
不知何故,我想到我正在向我的设备缓存发送垃圾邮件,直到应用程序崩溃。但是 Xcode 没有任何有用的提示。我想知道清除 viewControllers 缓存的选项是否可以解决这个问题 - 如果有这个选项。
亲切的问候
我没有完全解决,但是我决定把CALayer和CATextLayer的每一部分都换成一个通用的
material.diffuse.contents = [arrayOfTextures objectAtIndex:certainImage];
使用更高的分辨率(例如 Iphone 6),它确实显示 CALayer 导致了某种图形错误。但是简单的预制图像(来自 imageArray)解决方案大大提高了性能并防止崩溃。
我不能肯定地说是否没有办法用 CALayer 方法解决它。但是将图像加载为 Material 并更新它们带来了最令人满意的结果。
我正在使用 SceneKit 构建游戏。它基于添加和删除的 SCNBoxes。最后有大约 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 似乎消失了。如果添加了新块,它们将不再有 textLayer。另一个副作用是现有块上的旧 textLayers 不再更新。
在下一步中,新添加的块将变得不可见。或者更确切地说——他们永远不会得到 CALayer。但是物理体还在工作。
有时视图会崩溃。调试器说找不到崩溃区域的位置。在此之后视图变形。但我仍然可以调用 SCNActions 来清除视图并显示所有创建的对象,这些对象不是我发布的这些块。这些块完全被踢出了视图。
顺便说一下,当我为这些块设置 "phonglighttype" 时,这个窃听级联发生得更早。
我还注意到一件事。当我退出应用程序(从 iPhone 5 测试)并在一段时间后再次进入时,
self.gameView.showsStatistics = YES;
在 GPU 条上显示一条蓝线。 2 或 3 秒后,蓝色条消失,完整的绿色 GPU 条显示它已准备好使用。一切都像它应该做的那样工作。一段时间后,这些块再次变得不可见。如果我再次退出并再次进入,新添加的块将再次可见。
不知何故,我想到我正在向我的设备缓存发送垃圾邮件,直到应用程序崩溃。但是 Xcode 没有任何有用的提示。我想知道清除 viewControllers 缓存的选项是否可以解决这个问题 - 如果有这个选项。
亲切的问候
我没有完全解决,但是我决定把CALayer和CATextLayer的每一部分都换成一个通用的
material.diffuse.contents = [arrayOfTextures objectAtIndex:certainImage];
使用更高的分辨率(例如 Iphone 6),它确实显示 CALayer 导致了某种图形错误。但是简单的预制图像(来自 imageArray)解决方案大大提高了性能并防止崩溃。
我不能肯定地说是否没有办法用 CALayer 方法解决它。但是将图像加载为 Material 并更新它们带来了最令人满意的结果。