MTKView代理停止响应- (void)drawInMTKView:(nonnull MTKView *)view调用

4
我在一个由窗口控制器管理的窗口中有一个MTKView。当我首次实例化窗口控制器和窗口时,MTKView会调用我的代理的两个方法,并且drawInMTKView方法会以首选速率被调用:
- (void)drawInMTKView:(nonnull MTKView *)view
- (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size

如果关闭窗口(不是释放窗口,而是隐藏),当重新打开窗口时,当我调整MTKView的大小时,drawableSizeWillChange调用仍然被调用,但drawInMTKView不再被调用。 MTKView在其默认模式下运行,并具有自己的displaylink。由于未调用drawInMTKView,这表明MTKView中的私有displayLink变量出现了问题。
我正在OSX Mojave上运行Xcode 9.4.1,使用最新的2017款MacBook Pro。

如果在重新显示窗口时显式设置MTKViewpaused属性,行为是否会改变? - warrenm
不,它没有。我已经向苹果提交了工单并提供了示例代码。 - blackirishman
提交代码后没有收到苹果的回复。现在,当我重新打开窗口时,我正在重新实例化我的MTKview。拥有一个应用程序的生命周期将是很好的,但是... - blackirishman
当我关闭包含视图的窗口时,内部的displaylink停止运行。我尝试在关闭窗口之前删除视图,但没有效果。因此,我创建了自己的display link,可以启动和停止以驱动MTKView。苹果公司还没有回复我。 - blackirishman
我认为我们需要看一下你是如何(从nib文件、完全以编程方式等)创建窗口的,才能开始提供帮助。 - warrenm
2个回答

1

我创建了自己的CVDisplayLink回调函数,并没有使用MTKView提供的回调函数,以避免可能出现的MTKView问题。


我认为在创建CVDisplayLink时需要小心,以避免连接多个显示器时出现减速的情况。我使用只接受单个CGDirectDisplayID版本来创建我的CVDisplayLink,以应对这个已知且持续存在的问题,但我不知道它是否有效。 - trojanfoe
事实上,我完全放弃了MTKView并创建了自己的NSView子类以获得完全控制。 - trojanfoe
我使用“CVDisplayLinkCreateWithCGDisplay”来实例化我的displayLink并订阅windowChangedScreen通知。 - blackirishman

0

我曾经遇到过同样的问题,我通过将 MTKView 从其父视图中移除并在窗口显示时重新放置它来解决了这个问题。

- (BOOL)windowShouldClose:(NSWindow *)sender
{
    [_metalPreview removeFromSuperview];

    return YES;
}

这样你就不需要创建自定义的 CVDisplayLink。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接