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