如何让标题栏在Metal中不引起渲染问题?

问题描述 投票:1回答:1

当我画任何形状时(无论它是否有纹理),当我转到全屏时,它会闪烁,并使标题栏显示时,我移动鼠标到顶部。它会变亮,然后像一瞬间又变回来。我不知道这种情况是否会发生在纯色上,但当我给顶点上色并绘制渐变或应用纹理时,会发生这种情况。这很烦人,尽管它很微妙。我怎么才能解决这个问题?

如何重现。在Metal中创建一个形状 用不同的颜色给顶点涂上渐变色 或者应用纹理 让窗口全屏化 将光标移动到窗口顶部。当标题栏显示出来时,shapetexture会短暂地闪烁。如何解决这个问题?

我使用的是 macOS 1.15 Catalina。

即使是用Xcode的Metal游戏例子也可以证明这一点。只要进入全屏,显示标题栏,当你显示和取消显示标题栏时,它会不平滑。

更新:我意识到,如果我把绘图代码放在了 viewDidLoad() 而不是 draw() 这种行为将停止。我怎样才能使它不出现bug,而不需要只渲染一帧?

另一个更新:对于纯色,确实会出现这种情况。

这是一个非常困难的问题,因为我不知道该怎么尝试。这个bug也很难修复,因为它只是有时发生。

错误的例子(视频

另一个显示 "白色闪烁 "的BUG的例子(视频)。

而且这个问题只 半信半疑因为事实证明,我成功地解决了标题栏遮挡帧率的问题,但还是有一个白闪的问题。

macos rendering fullscreen metal
1个回答
5
投票

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


2
投票

你最好的办法是将此作为一个bug报告给苹果。我试着研究了一下,似乎没有关于这个错误的结果。

我猜你想要一个修复方法,但我得到的只是一个 变通办法:

当绘图代码只运行一次时,似乎不会发生这种情况,在 viewDidLoad. 也许你可以把它放在那里,然后手动调用MetalView的 draw 方法一秒钟60次。我想明白了如何让我说的工作。把绘图代码留在 draw但一定要将首选帧率设置为0.然后每秒手动重绘60次。因为 draw 方法自动重绘在这个意义上是有bug的。

© www.soinside.com 2019 - 2024. All rights reserved.