SCNView覆盖会导致重新调整大小

时间:2018-05-20 12:53:02

标签: macos cocoa sprite-kit scenekit metal

我正在使用SceneKit来显示3D场景(到目前为止,单个四边形),而overlaySKScene用于显示2D覆盖(到目前为止只是一个没有几何体的SKNode,尽管我以前使用过单个SKLabelNode )。在一堆嵌套的NSSplitView中,这是一个非常简单的视图。在正常使用过程中,它的效果非常出色。当我尝试调整窗口大小或拆分视图时出现问题 - 我通过漂亮的背景获得红色区域,不久之后消失。

我使用Radeon Pro 460在2016 MBP上运行此功能,并使用Quicktime的屏幕截图捕获此帧: The red tearing on resizing the view

禁用叠加会删除红色区域,这让我觉得这是问题所在。禁用统计栏或滚动条(SCNView的子视图)没有任何影响。我最小的SKScene子类定义为

@implementation TestOverlay
- (instancetype) initWithSize: (CGSize) size
{
    if( self = [super initWithSize: size] )
    {
        // Setup the default state
        self.scaleMode = SKSceneScaleModeResizeFill;
        self.userInteractionEnabled = NO;
        self.backgroundColor = [NSColor blackColor];
    }
    return self;
}
@end

以前有人遇到过类似的问题吗?令人讨厌的是,苹果样本Fox2没有类似的问题...

2 个答案:

答案 0 :(得分:1)

要获得真正的启发,需要仔细阅读文档,然后对所有内容进行评论,并逐步恢复功能。然后再次阅读文档。

-[SCNSceneRendererDelegate renderer:willRenderScene:atTime:]的讨论部分,解决方案很明显(强调我的):

  

您应该只在此方法中执行Metal或OpenGL绘图命令(以及执行它们所需的任何设置) - 在此方法中修改SceneKit对象的结果未定义

这正是我在做的事情。我把它误读为修改几何体,所以认为分配纹理在这里是合理的(毕竟,“将”渲染意味着它还没有开始渲染,对吧?),因此会选择最近创建的纹理。不幸的是,在我决定需要叠加之前,这实际上非常有效!然而,一旦添加了叠加层,就会出现撕裂现象。

更新材料属性的正确位置似乎是 - [SCNSceneRendererDelegate渲染器:updateAtTime] 。用它来避免像这样一个人的愚蠢错误!

答案 1 :(得分:0)

尝试重置SMC(系统管理控制器)。它帮助我解决了类似的问题,但在2017年MBP(Radeon 560)上使用Autodesk Maya 2018。

所以,关闭并拔掉你的MBP。

在内置键盘上,按住左侧的 Shift - Option - Control 键,然后按电源按钮并将所有这些按下10秒钟,然后释放按键。

连接电源适配器,然后正常打开Mac。

希望这有帮助。

  

P.S。如果它没有帮助,请尝试检查/取消选中id | transaction_id | lang | pages | message -------------------------------------------- 1 | 4 | en | 8 | Lorem... 2 | 7 | de | 5 | Some... - Automatic graphics switching中的System Preferences选项,看看是否存在差异。