【问题标题】:How do I keep the title bar from causing rendering issues in Metal?如何防止标题栏在 Metal 中引起渲染问题?
【发布时间】:2020-05-12 23:48:05
【问题描述】:

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

如何重现:在 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)

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

【问题讨论】:

  • 请提供一个视频来证明您的问题。
  • @0xBFE1A8 奇怪。当我尝试记录它时,它永远不会发生。
  • 如果您展示一个最小的可重现示例,将会很有帮助。如果您可以指出 Xcode 生成的相同代码是否有相同的问题。
  • @codetiger 我确实指出了这一点。拜托,我需要帮助。这太烦人了。
  • 您看到这种行为是因为窗口大小的变化会触发 Metal 层重新渲染。这个话题在不同的地方被广泛讨论。这个链接给出了一个解决方案:thume.ca/2019/06/19/glitchless-metal-window-resizing

标签: swift macos rendering fullscreen metal


【解决方案1】:

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

【讨论】:

【解决方案2】:

您最好将此作为错误报告给 Apple。我试图研究,似乎没有关于这个错误的结果。

我假设您想要修复,但我得到的只是一个解决方法:

绘图代码仅在viewDidLoad 中运行一次时似乎不会发生这种情况。也许您可以将其保留在那里,然后每秒手动调用 MetalView 的 draw 方法 60 次。我想出了如何让我所说的工作。将绘图代码保留在draw 中,但请确保将首选帧速率设置为 0。然后每秒手动重绘 60 次。因为draw 方法自动重绘在这个意义上是有问题的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多