【发布时间】:2020-05-12 23:48:05
【问题描述】:
当我绘制任何形状(无论是否有纹理)时,它会在我进入全屏时闪烁,并在我将鼠标移到顶部时显示标题栏。它会变得更轻,然后像一瞬间一样变回来。我不知道纯色是否会发生这种情况,但是当我为顶点着色并绘制渐变或应用纹理时,就会发生这种情况。这很烦人,即使它很微妙。我该如何解决?
如何重现:在 Metal 中创建一个形状,或者为顶点着色以创建渐变,或者对其应用纹理,并使窗口全屏显示。将光标移动到窗口的顶部。当标题栏出现时,形状/纹理会短暂闪烁。我该如何解决?
我使用的是 macOS 1.15 Catalina。
即使使用 Xcode 的示例 Metal 游戏也可以证明这一点。直接全屏,显示标题栏,显示和取消显示标题栏会很不流畅。
更新:我已经意识到,如果我将绘图代码放在 viewDidLoad() 而不是 draw() 中,这种行为将会停止。我怎样才能让它不出错而不必只渲染一帧?
另一个更新:纯色确实会发生这种情况。
这是一个非常困难的问题,因为我不知道该尝试什么。这个错误也很难修复,因为它只是偶尔发生。
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