swift - 如何防止标题栏在 Metal 中引起渲染问题?

标签 swift macos rendering fullscreen metal

当我绘制任何形状(无论是否有纹理)时,它会在我进入全屏时闪烁,并在我将鼠标移到顶部时显示标题栏。它会变轻,然后像一瞬间一样回来。我不知道纯色是否会发生这种情况,但是当我为顶点着色并绘制渐变或应用纹理时,就会发生这种情况。这很烦人,即使它很微妙。我该如何解决?

如何重现:在 Metal 中创建一个形状,或者为顶点着色以创建渐变,或者对其应用纹理,并使窗口全屏。将光标移动到窗口顶部。当标题栏出现时,形状/纹理会短暂闪烁。我该如何解决?

我正在使用 macOS 1.15 Catalina。

即使使用 Xcode 的示例 Metal 游戏也可以证明这一点。直接全屏显示,显示标题栏,显示和取消显示标题栏会不流畅。

更新:我已经意识到,如果我将绘图代码放入 viewDidLoad()而不是 draw()这种行为将停止。我如何制作它以便它没有错误而不必只渲染一帧?

另一个更新:纯色确实会发生这种情况。

这是一个非常困难的问题,因为我不知道该尝试什么。这个错误也很难修复,因为它只是偶尔发生。

Example of the bug (Video)

Another example of the bug that displays the "white flicker" (Video)

另外这个问题只回答了一半,因为结果我设法解决了标题栏阻塞帧率的问题,但仍然存在白色闪光的问题。

最佳答案

看了你的视频,我明白你的问题了。在您的情况下,UI(标题栏)阻塞了主线程,这是正常行为,因为 MTKView 渲染发生在主应用程序线程上。您需要创建一个 custom metal view并在后台线程上实现渲染循环。

关于swift - 如何防止标题栏在 Metal 中引起渲染问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61763958/

相关文章:

objective-c - MacOSX 下奇怪的文件对话框

swift - 包含泛型类型参数的类型约束

ios - WebView 与触摸事件 UITapGestureRecognizer 无法识别的选择器

java - 带有 Java 7 的 Mac OSX 上的透明 JFrame/JWindow

macos - 我如何告诉链接器使用方法的多个实现中的哪一个?

java - JLabel 在显示 HTML 时垂直向下移动文本

3d - 高度图的重点是什么?

javascript - 如何测试渲染时间(不是 DomContentLoaded 也不是 onLoad)?

swift - 如何修复被阻挡的 View 过渡到增强现实 View

swift - WatchOS 3 openParentApplication?