繁体   English   中英

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

[英]How do I keep the title bar from causing rendering issues in Metal?

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

如何重现:在 Metal 中创建一个形状,或者为顶点着色以创建渐变,或者对其应用纹理,然后使 window 全屏显示。 将 cursor 移动到 window 的顶部。 当标题栏出现时,形状/纹理将短暂地 flash。 我该如何解决?

我正在使用 macOS 1.15 Catalina。

即使使用 Xcode 的示例金属游戏也可以证明这一点。 只需 go 到全屏,显示标题栏,显示和取消显示标题栏时会变得不流畅。

更新:我已经意识到,如果我将绘图代码放在viewDidLoad()而不是draw()中,这种行为将会停止。 我怎样才能使它不出错而不必只渲染一帧?

另一个更新:它确实发生在固体 colors 上。

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

错误示例(视频)

显示“白色闪烁”的另一个错误示例(视频)

这个问题也只回答了一半,因为事实证明我设法解决了标题栏阻塞帧率的问题,但白色 flash 仍然存在问题。

看了你的视频,我明白你的问题是什么了。 在您的情况下,UI(Tittle Bar)阻塞了主线程,这是正常行为,因为MTKView呈现发生在主应用程序线程上。 您需要创建自定义金属视图并在后台线程上实现渲染循环。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM