SKView 在场景前闪烁灰色

Posted

技术标签:

【中文标题】SKView 在场景前闪烁灰色【英文标题】:SKView Flashing Gray before Scene 【发布时间】:2014-06-22 13:42:13 【问题描述】:

我有一个 UIView 类型的主视图。此视图有两个仅横向的 skview(左和右)。所有视图和场景均设置为黑色背景。

我从隐藏的两个 skview 开始。主屏幕在屏幕两侧显示问题。如果答案不正确,我将场景设置为效果,然后启用该效果并取消隐藏 skview(左或右)。效果会显示几秒钟,然后我用[self.leftView presentScene:nil]; 禁用它我对rightView 做同样的事情。然后我再次隐藏视图。

问题在于,在显示场景时,会出现短暂的白色视图闪烁,然后该场景会以黑色背景适当渲染。事实上,这就是为什么我开始隐藏skviews,就好像我不这样做一样,尽管我将其设置为黑色,但它们会以较浅的背景显示。

如何在没有较浅背景颜色的闪光的情况下显示这些场景?

一些代表代码:

self.fireSceneLeft = [FireScene sceneWithSize:self.leftView.bounds.size];
self.fireSceneLeft.scaleMode = SKSceneScaleModeAspectFill;
self.fireSceneLeft.backgroundColor = [UIColor blackColor];

[self.leftView presentScene:self.fireSceneLeft];
    [self.leftView setHidden:NO];

至于场景效果本身:

    @implementation FireScene

-(SKEmitterNode *)fireEffect

    SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"FireEffect" ofType:@"sks"]];
    emitter.position = CGPointMake(150,80);
    emitter.name = @"fire";
    emitter.targetNode = self.scene;
    emitter.numParticlesToEmit = 2;
    return emitter;


-(void)update:(CFTimeInterval)currentTime 

    [self addChild:[self fireEffect]];


@end

【问题讨论】:

看起来 SKView 的背景是灰色的,直到渲染了不同颜色的场景。我无法让未填充的 SKView 具有黑色背景。我认为随着场景被移除,然后呈现一个新的场景,它正在闪烁默认的灰色。如果我将 SKView 放在 UIView 上并且不执行任何其他操作,无论我告诉它将背景颜色设置为什么,它都会显示为灰色。 【参考方案1】:

我通过创建另一个纯黑色场景解决了这个问题。我没有将我想要移开的场景设置为 nil,而是简单地替换为黑色场景。一个没有任何东西的场景(空白 SKView)有灰色,这是我的问题的原因。通过使用黑色场景启动应用程序并在不显示任何场景时使用它,我的问题得到了解决。这里还有一个重要的点是暂停场景。如果不暂停,即使是没有运动的黑色场景也会占用 CPU。我发现暂停黑色场景的最佳位置是在场景控制器的以下方法中:

-(void)update:(CFTimeInterval)currentTime 

[self addChild:[self blackEffect]];
[self.view setPaused:YES];

这也很棘手,因为在别处暂停场景实际上暂停了旧场景。这是一个时间问题,因为即使您调用一个新场景然后暂停,它也没有时间在暂停之前将新场景放置到位。上面的方法是我唯一可以可靠地调用暂停并让它在正确的场景上生效的地方。

【讨论】:

【参考方案2】:

ios 上,您不能同时拥有 2 个(或更多)SKView 实例。虽然它在技术上是有效的,但乍一看它实际上是不可用的,因为一个视图将支配另一个视图,几乎没有时间让其他视图更新和渲染它们的内容以及接收触摸和其他事件。我怀疑短暂的闪光与此有关。

【讨论】:

不需要运行两个视图来实现这一点。例如,用户可以在左边得到一个问题,这会在左边产生火焰效果,而右边的 skview 处于休眠状态。闪光仍将发生在此左侧。同样,这两个视图都不需要渲染场景。

以上是关于SKView 在场景前闪烁灰色的主要内容,如果未能解决你的问题,请参考以下文章

如何使 SKView 的背景颜色清晰

离子显示键盘问题 - 顶部的灰色条

SpriteKit:为什么SKView在一个高度消失但出现在另一个高度? SKView的最大高度是多少?

Unity3D一片灰色不渲染

Skeleton Screen加载占位图(内容出现前显示灰色占位图)的分析与实现

桌子分拣机-斑马剥离